Skip to content

Commit dc21e03

Browse files
authored
fix(sqlite): defer prepare errors (#162)
1 parent 248e7f5 commit dc21e03

File tree

4 files changed

+31
-15
lines changed

4 files changed

+31
-15
lines changed

src/connectors/better-sqlite3.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,21 @@ export default function sqliteConnector(opts: ConnectorOptions): Connector<Datab
3535
dialect: "sqlite",
3636
getInstance: () => getDB(),
3737
exec: sql => getDB().exec(sql),
38-
prepare: sql => new StatementWrapper(getDB().prepare(sql))
38+
prepare: sql => new StatementWrapper(() => getDB().prepare(sql))
3939
};
4040
}
4141

42-
class StatementWrapper extends BoundableStatement<RawStatement> {
43-
all(...params) {
44-
return Promise.resolve(this._statement.all(...params));
42+
class StatementWrapper extends BoundableStatement<() => RawStatement> {
43+
async all(...params) {
44+
return this._statement().all(...params)
4545
}
4646

47-
run(...params) {
48-
const res = this._statement.run(...params);
49-
return Promise.resolve({ success: res.changes > 0, ...res });
47+
async run(...params) {
48+
const res = this._statement().run(...params)
49+
return { success: res.changes > 0, ...res }
5050
}
5151

52-
get(...params) {
53-
return Promise.resolve(this._statement.get(...params));
52+
async get(...params) {
53+
return this._statement().get(...params)
5454
}
5555
}

src/connectors/node-sqlite.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,21 +42,21 @@ export default function nodeSqlite3Connector(opts: ConnectorOptions): Connector<
4242
getDB().exec(sql)
4343
return { success: true }
4444
},
45-
prepare: sql => new StatementWrapper(getDB().prepare(sql)),
45+
prepare: sql => new StatementWrapper(() => getDB().prepare(sql)),
4646
}
4747
}
4848

49-
class StatementWrapper extends BoundableStatement<StatementSync> {
49+
class StatementWrapper extends BoundableStatement<() => StatementSync> {
5050
async all(...params) {
51-
const raws = this._statement.all(...params)
51+
const raws = this._statement().all(...params)
5252
return raws
5353
}
5454
async run(...params) {
55-
const res = this._statement.run(...params)
55+
const res = this._statement().run(...params)
5656
return { success: true, ...res }
5757
}
5858
async get(...params) {
59-
const raw = this._statement.get(...params)
59+
const raw = this._statement().get(...params)
6060
return raw
6161
}
6262
}

src/connectors/sqlite3.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,25 +44,37 @@ export default function nodeSqlite3Connector(opts: ConnectorOptions): Connector<
4444
dialect: 'sqlite',
4545
getInstance: () => getDB(),
4646
exec: (sql: string) => query(sql),
47-
prepare: sql => new StatementWrapper(getDB().prepare(sql)),
47+
prepare: (sql) => new StatementWrapper(sql, getDB())
4848
}
4949
}
5050

5151
class StatementWrapper extends BoundableStatement<sqlite3.Statement> {
52+
#onError?: (err: Error | null) => void // #162
53+
54+
constructor(sql: string, db: sqlite3.Database) {
55+
super(db.prepare(sql, (err) => {
56+
if (err && this.#onError) {
57+
return this.#onError(err);
58+
}
59+
}))
60+
}
5261
async all(...params) {
5362
const rows = await new Promise<unknown[]>((resolve, reject) => {
63+
this.#onError = reject
5464
this._statement.all(...params, (err, rows) => err ? reject(err) : resolve(rows))
5565
})
5666
return rows
5767
}
5868
async run(...params) {
5969
await new Promise<void>((resolve, reject) => {
70+
this.#onError = reject
6071
this._statement.run(...params, (err) => err ? reject(err) : resolve())
6172
})
6273
return { success: true }
6374
}
6475
async get(...params) {
6576
const row = await new Promise((resolve, reject) => {
77+
this.#onError = reject
6678
this._statement.get(...params, (err, row) => err ? reject(err) : resolve(row))
6779
})
6880
return row

test/connectors/_tests.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,8 @@ export function testConnector<TConnector extends Connector = Connector>(opts: {
6161
const { rows } = await db.sql`SELECT * FROM users WHERE id = ${userId}`;
6262
expect(rows).toMatchInlineSnapshot(userSnapshot);
6363
});
64+
65+
it("deferred prepare errors", async () => {
66+
await expect(db.prepare("SELECT * FROM non_existing_table").all()).rejects.toThrowError("non_existing_table")
67+
});
6468
}

0 commit comments

Comments
 (0)