11import type { SQLiteDBCore } from '@subframe7536/sqlite-wasm'
22import {
3- changes as changesCore ,
4- close as closeCore ,
5- lastInsertRowId as lastInsertRowIdCore ,
3+ close as coreClose ,
4+ query as coreQuery ,
5+ iterator as coreIterator ,
66} from '@subframe7536/sqlite-wasm'
7- import { SQLITE_OK , SQLITE_ROW } from '@subframe7536/sqlite-wasm/constant'
8- import type { QueryResult } from 'kysely'
97import type { IGenericSqlite , Promisable } from 'kysely-generic-sqlite'
10- import { parseBigInt } from 'kysely-generic-sqlite'
118import type { MessageHandleFn } from 'kysely-generic-sqlite/worker'
129import { createWebOnMessageCallback } from 'kysely-generic-sqlite/worker-helper-web'
1310
@@ -23,83 +20,6 @@ export const defaultCreateDatabaseFn: CreateDatabaseFn = async ({ fileName, url,
2320 )
2421}
2522
26- function createRowMapper ( sqlite : SQLiteDBCore [ 'sqlite' ] , stmt : number ) {
27- const cols = sqlite . column_names ( stmt )
28- return ( row : any [ ] ) => Object . fromEntries ( cols . map ( ( key , i ) => [ key , row [ i ] ] ) )
29- }
30-
31- async function queryData (
32- core : SQLiteDBCore ,
33- sql : string ,
34- parameters ?: readonly any [ ] ,
35- ) : Promise < QueryResult < any > > {
36- const iterator = core . sqlite . statements ( core . pointer , sql ) [ Symbol . asyncIterator ] ( )
37- const { value : stmt } = await iterator . next ( )
38-
39- try {
40- if ( parameters ?. length ) {
41- core . sqlite . bind_collection ( stmt , parameters )
42- }
43-
44- const size = core . sqlite . column_count ( stmt )
45- if ( size === 0 ) {
46- await core . sqlite . step ( stmt )
47- return {
48- rows : [ ] ,
49- insertId : parseBigInt ( lastInsertRowIdCore ( core ) ) ,
50- numAffectedRows : parseBigInt ( changesCore ( core ) ) ,
51- }
52- }
53-
54- const mapRow = createRowMapper ( core . sqlite , stmt )
55- const result = [ ]
56- let idx = 0
57- while ( ( await core . sqlite . step ( stmt ) ) === SQLITE_ROW ) {
58- result [ idx ++ ] = mapRow ( core . sqlite . row ( stmt ) )
59- }
60- return { rows : result }
61- } finally {
62- await iterator . return ?.( )
63- }
64- }
65-
66- async function * iterateDate (
67- core : SQLiteDBCore ,
68- sql : string ,
69- parameters ?: readonly any [ ] ,
70- chunkSize = 1 ,
71- ) : AsyncIterableIterator < any [ ] > {
72- const { sqlite, pointer } = core
73- let cache = new Array ( chunkSize )
74- for await ( const stmt of sqlite . statements ( pointer , sql ) ) {
75- if ( parameters ?. length ) {
76- sqlite . bind_collection ( stmt , parameters )
77- }
78- let idx = 0
79- const mapRow = createRowMapper ( core . sqlite , stmt )
80- while ( 1 ) {
81- const result = await sqlite . step ( stmt )
82- if ( result === SQLITE_ROW ) {
83- cache [ idx ] = mapRow ( core . sqlite . row ( stmt ) )
84- if ( ++ idx === chunkSize ) {
85- yield cache . slice ( 0 , idx )
86- idx = 0
87- }
88- } else if ( result === SQLITE_OK ) {
89- if ( ++ idx === chunkSize ) {
90- yield [ ]
91- }
92- } else {
93- if ( idx > 0 ) {
94- yield cache . slice ( 0 , idx )
95- }
96- break
97- }
98- }
99- }
100- cache = undefined !
101- }
102-
10323/**
10424 * Handle worker message, support custom message handler,
10525 * built-in: {@link defaultCreateDatabaseFn}
@@ -136,9 +56,11 @@ export function createOnMessageCallback(
13656export function createSqliteExecutor ( db : SQLiteDBCore ) : IGenericSqlite < SQLiteDBCore > {
13757 return {
13858 db,
139- query : async ( _isSelect , sql , parameters ) => await queryData ( db , sql , parameters ) ,
140- close : async ( ) => await closeCore ( db ) ,
59+ query : async ( _isSelect , sql , parameters ) => ( {
60+ rows : await coreQuery ( db , sql , parameters as any [ ] ) ,
61+ } ) ,
62+ close : async ( ) => await coreClose ( db ) ,
14163 iterator : ( _isSelect , sql , parameters , chunkSize ) =>
142- iterateDate ( db , sql , parameters as any [ ] , chunkSize ) ,
64+ coreIterator ( db , sql , parameters as any [ ] , chunkSize ) ,
14365 }
14466}
0 commit comments