Skip to content

Commit d84e0cd

Browse files
committed
refactor(sqlite): prefer bun sqlite on bun and clarify op export limits
1 parent 3267ac1 commit d84e0cd

File tree

4 files changed

+69
-38
lines changed

4 files changed

+69
-38
lines changed

packages/nodejs/src/Sqlite.ts

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -61,43 +61,58 @@ interface BunSqliteModule {
6161
const isReaderSql = (sql: string): boolean =>
6262
/^\s*(select|pragma|with|explain|values)\b/i.test(sql);
6363

64+
const createBetterDb = (filename: string): DbLike => {
65+
const BetterSQLite = require("better-sqlite3") as BetterSqliteConstructor;
66+
const db = new BetterSQLite(filename);
67+
68+
return {
69+
prepare: (sql) => {
70+
const statement = db.prepare(sql);
71+
return {
72+
reader: statement.reader,
73+
all: (...parameters) => statement.all(parameters),
74+
run: (...parameters) => statement.run(parameters),
75+
};
76+
},
77+
serialize: () => db.serialize(),
78+
close: () => db.close(),
79+
};
80+
};
81+
82+
const createBunDb = (filename: string): DbLike => {
83+
const { Database } = require("bun:sqlite") as BunSqliteModule;
84+
const db = new Database(filename);
85+
86+
return {
87+
prepare: (sql) => {
88+
const statement = db.prepare(sql);
89+
return {
90+
reader: isReaderSql(sql),
91+
all: (...parameters) => statement.all(...parameters),
92+
run: (...parameters) => statement.run(...parameters),
93+
};
94+
},
95+
serialize: () => db.serialize(),
96+
close: () => db.close(),
97+
};
98+
};
99+
64100
const createDb = (filename: string): DbLike => {
65-
try {
66-
const BetterSQLite = require("better-sqlite3") as BetterSqliteConstructor;
67-
const db = new BetterSQLite(filename);
68-
69-
return {
70-
prepare: (sql) => {
71-
const statement = db.prepare(sql);
72-
return {
73-
reader: statement.reader,
74-
all: (...parameters) => statement.all(parameters),
75-
run: (...parameters) => statement.run(parameters),
76-
};
77-
},
78-
serialize: () => db.serialize(),
79-
close: () => db.close(),
80-
};
81-
} catch (error) {
82-
const hasBunRuntime = (globalThis as Record<string, unknown>).Bun != null;
83-
if (!hasBunRuntime) throw error;
84-
85-
const { Database } = require("bun:sqlite") as BunSqliteModule;
86-
const db = new Database(filename);
87-
88-
return {
89-
prepare: (sql) => {
90-
const statement = db.prepare(sql);
91-
return {
92-
reader: isReaderSql(sql),
93-
all: (...parameters) => statement.all(...parameters),
94-
run: (...parameters) => statement.run(...parameters),
95-
};
96-
},
97-
serialize: () => db.serialize(),
98-
close: () => db.close(),
99-
};
101+
const hasBunRuntime = (globalThis as Record<string, unknown>).Bun != null;
102+
103+
if (hasBunRuntime) {
104+
try {
105+
return createBunDb(filename);
106+
} catch (bunError) {
107+
try {
108+
return createBetterDb(filename);
109+
} catch {
110+
throw bunError;
111+
}
112+
}
100113
}
114+
115+
return createBetterDb(filename);
101116
};
102117

103118
export const createBetterSqliteDriver: CreateSqliteDriver =

packages/react-native/src/exports/bare-op-sqlite.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*
55
* Use this with bare React Native projects (not Expo) that use
66
* `@op-engineering/op-sqlite`.
7+
*
8+
* Note: this flavor does not support Evolu `export()`.
79
*/
810

911
import type { ReloadApp } from "@evolu/common";

packages/react-native/src/exports/expo-op-sqlite.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
*
55
* Use this with Expo projects that use `@op-engineering/op-sqlite` for better
66
* performance.
7+
*
8+
* Note: this flavor does not support Evolu `export()`. Use `expo-sqlite`
9+
* flavor when database export bytes are required.
710
*/
811

912
import { createExpoDeps } from "../createExpoDeps.js";

packages/react-native/src/sqlite-drivers/createOpSqliteDriver.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ export const createOpSqliteDriver: CreateSqliteDriver =
2222
},
2323
);
2424
let isDisposed = false;
25+
const getDbPath = (): string | null => {
26+
try {
27+
return db.getDbPath();
28+
} catch {
29+
return null;
30+
}
31+
};
2532

2633
const cache = createPreparedStatementsCache<PreparedStatement>(
2734
(sql) => db.prepareStatement(sql),
@@ -44,10 +51,14 @@ export const createOpSqliteDriver: CreateSqliteDriver =
4451
return { rows: rows as Array<SqliteRow>, changes: rowsAffected };
4552
},
4653

47-
// FIXME: op-sqlite does not expose binary, but a path to the database file
48-
// another react native dependency would be needed to implement this
4954
export: () => {
50-
throw new Error("TODO: Not implemented yet");
55+
const dbPath = getDbPath();
56+
const pathSuffix = dbPath ? ` Database path: ${dbPath}.` : "";
57+
throw new Error(
58+
"Evolu export() is not supported with @op-engineering/op-sqlite because the driver does not expose database bytes." +
59+
pathSuffix +
60+
" Use @evolu/react-native/expo-sqlite when export is required.",
61+
);
5162
},
5263

5364
[Symbol.dispose]: () => {

0 commit comments

Comments
 (0)