diff --git a/example/src/tests/queries.spec.ts b/example/src/tests/queries.spec.ts index 92307a21..8112c625 100644 --- a/example/src/tests/queries.spec.ts +++ b/example/src/tests/queries.spec.ts @@ -600,7 +600,7 @@ export function queriesTests() { await db.executeBatch(commands); const res = await db.execute('SELECT * FROM User'); - // console.log(res); + expect(res.rows).to.eql([ {id: id1, name: name1, age: age1, networth: networth1, nickname: null}, { @@ -613,6 +613,45 @@ export function queriesTests() { ]); }); + it('Batch execute with BLOB', async () => { + let db = open({ + name: 'queries.sqlite', + encryptionKey: 'test', + }); + + await db.execute('DROP TABLE IF EXISTS User;'); + await db.execute( + 'CREATE TABLE IF NOT EXISTS User (id TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT, networth BLOB, nickname TEXT) STRICT;', + ); + const id1 = '1'; + const name1 = 'name1'; + const age1 = 12; + const networth1 = new Uint8Array([1, 2, 3]); + + const id2 = '2'; + const name2 = 'name2'; + const age2 = 17; + const networth2 = new Uint8Array([3, 2, 1]); + + const commands: SQLBatchTuple[] = [ + [ + 'INSERT OR REPLACE INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [id1, name1, age1, networth1], + ], + [ + 'INSERT OR REPLACE INTO "User" (id, name, age, networth) VALUES(?, ?, ?, ?)', + [[id2, name2, age2, networth2]], + ], + ]; + + console.log('' + JSON.stringify(commands)); + // bomb~ (NOBRIDGE) ERROR Error: Exception in HostFunction: + await db.executeBatch(commands); + + const res = await db.execute('SELECT * FROM User'); + console.log('res:' + JSON.stringify(res)); + }); + it('DumbHostObject allows to write known props', async () => { const id = chance.integer(); const name = chance.name(); diff --git a/src/index.ts b/src/index.ts index a582ef0b..f04ced18 100644 --- a/src/index.ts +++ b/src/index.ts @@ -374,13 +374,45 @@ function enhanceDB(db: InternalDB, options: DBParams): DB { } }; + function sanitizeArrayBuffersInArray( + params?: any[] | any[][] + ): any[] | undefined { + if (!params) { + return params; + } + + return params.map((p) => { + if (Array.isArray(p)) { + return sanitizeArrayBuffersInArray(p); + } + + if (ArrayBuffer.isView(p)) { + return p.buffer; + } + + return p; + }); + } + // spreading the object does not work with HostObjects (db) // We need to manually assign the fields let enhancedDb = { delete: db.delete, attach: db.attach, detach: db.detach, - executeBatch: db.executeBatch, + executeBatch: async ( + commands: SQLBatchTuple[] + ): Promise => { + const sanitizedCommands = commands.map(([query, params]) => { + if (params) { + return [query, sanitizeArrayBuffersInArray(params)]; + } + + return [query]; + }); + + return db.executeBatch(sanitizedCommands as any[]); + }, loadFile: db.loadFile, updateHook: db.updateHook, commitHook: db.commitHook, @@ -394,26 +426,14 @@ function enhanceDB(db: InternalDB, options: DBParams): DB { query: string, params?: Scalar[] ): Promise => { - const sanitizedParams = params?.map((p) => { - if (ArrayBuffer.isView(p)) { - return p.buffer; - } - - return p; - }); + const sanitizedParams = sanitizeArrayBuffersInArray(params); return sanitizedParams ? await db.executeWithHostObjects(query, sanitizedParams as Scalar[]) : await db.executeWithHostObjects(query); }, executeRaw: async (query: string, params?: Scalar[]) => { - const sanitizedParams = params?.map((p) => { - if (ArrayBuffer.isView(p)) { - return p.buffer; - } - - return p; - }); + const sanitizedParams = sanitizeArrayBuffersInArray(params); return db.executeRaw(query, sanitizedParams as Scalar[]); }, @@ -421,24 +441,12 @@ function enhanceDB(db: InternalDB, options: DBParams): DB { // at some point I changed the API but they did not pin their dependency to a specific version // so re-inserting this so it starts working again executeRawAsync: async (query: string, params?: Scalar[]) => { - const sanitizedParams = params?.map((p) => { - if (ArrayBuffer.isView(p)) { - return p.buffer; - } - - return p; - }); + const sanitizedParams = sanitizeArrayBuffersInArray(params); return db.executeRaw(query, sanitizedParams as Scalar[]); }, executeSync: (query: string, params?: Scalar[]): QueryResult => { - const sanitizedParams = params?.map((p) => { - if (ArrayBuffer.isView(p)) { - return p.buffer; - } - - return p; - }); + const sanitizedParams = sanitizeArrayBuffersInArray(params); let intermediateResult = sanitizedParams ? db.executeSync(query, sanitizedParams as Scalar[]) @@ -476,13 +484,7 @@ function enhanceDB(db: InternalDB, options: DBParams): DB { query: string, params?: Scalar[] | undefined ): Promise => { - const sanitizedParams = params?.map((p) => { - if (ArrayBuffer.isView(p)) { - return p.buffer; - } - - return p; - }); + const sanitizedParams = sanitizeArrayBuffersInArray(params); let intermediateResult = await db.execute( query,