Skip to content

Commit 976f2b8

Browse files
authored
fix(kysely-wasm): correct sqlite streaming statement lifetime (#37)
1 parent 1afdd54 commit 976f2b8

3 files changed

Lines changed: 26 additions & 19 deletions

File tree

packages/dialect-wasm/src/dialects/official-wasm.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export class OfficialWasmDialect extends GenericSqliteDialect {
7676
if (!isSelect) {
7777
throw new Error('Only support select query')
7878
}
79-
return runWithStatement(db, sql, parameters, iterator)
79+
return iterateWithStatement(db, sql, parameters)
8080
},
8181
}
8282
}, config.onCreateConnection)
@@ -103,10 +103,22 @@ function runWithStatement<T>(
103103
function* iterator(
104104
statement: import('@sqlite.org/sqlite-wasm').PreparedStatement,
105105
): IterableIterator<Record<string, import('@sqlite.org/sqlite-wasm').SqlValue>> {
106+
while (statement.step()) {
107+
yield statement.get({})
108+
}
109+
}
110+
111+
function* iterateWithStatement(
112+
db: import('@sqlite.org/sqlite-wasm').Database,
113+
sql: string,
114+
parameters: any[] | readonly any[],
115+
): IterableIterator<Record<string, import('@sqlite.org/sqlite-wasm').SqlValue>> {
116+
const statement = db.prepare(sql)
106117
try {
107-
while (statement.step()) {
108-
yield statement.get({})
118+
if (parameters.length) {
119+
statement.bind(parameters as import('@sqlite.org/sqlite-wasm').BindingSpec)
109120
}
121+
yield* iterator(statement)
110122
} finally {
111123
statement.finalize()
112124
}

packages/dialect-wasm/src/dialects/sqljs.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -45,36 +45,31 @@ export class SqlJsDialect extends GenericSqliteDialect {
4545
if (!isSelect) {
4646
throw new Error('Only support select query')
4747
}
48-
return runWithStatement(db, sql, parameters, iterator)
48+
return iterateWithStatement(db, sql, parameters)
4949
},
5050
}
5151
}, config.onCreateConnection)
5252
}
5353
}
5454

55-
function runWithStatement<T>(
55+
function* iterator<T>(stmt: import('sql.js').Statement): IterableIterator<T> {
56+
while (stmt.step()) {
57+
yield stmt.getAsObject() as unknown as T
58+
}
59+
}
60+
61+
function* iterateWithStatement<T>(
5662
db: import('sql.js').Database,
5763
sql: string,
5864
parameters: any[] | readonly any[],
59-
callback: (stmt: import('sql.js').Statement) => T,
60-
): T {
65+
): IterableIterator<T> {
6166
const statement = db.prepare(sql)
6267
try {
6368
if (parameters.length) {
6469
statement.bind(parameters as any[])
6570
}
66-
return callback(statement)
71+
yield* iterator(statement)
6772
} finally {
6873
statement.free()
6974
}
7075
}
71-
72-
function* iterator<T>(stmt: import('sql.js').Statement): IterableIterator<T> {
73-
try {
74-
while (stmt.step()) {
75-
yield stmt.getAsObject() as unknown as T
76-
}
77-
} finally {
78-
stmt.free()
79-
}
80-
}

packages/dialect-wasm/test/index.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe('dialect test', () => {
1313
return new SQL.Database()
1414
},
1515
})
16-
await testCase(dialect, expect, false)
16+
await testCase(dialect, expect)
1717
})
1818

1919
it('node-wasm', async () => {

0 commit comments

Comments
 (0)