Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 40 additions & 1 deletion example/src/tests/queries.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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},
{
Expand All @@ -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: <unknown>
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();
Expand Down
74 changes: 38 additions & 36 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<BatchQueryResult> => {
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,
Expand All @@ -394,51 +426,27 @@ function enhanceDB(db: InternalDB, options: DBParams): DB {
query: string,
params?: Scalar[]
): Promise<QueryResult> => {
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[]);
},
// Wrapper for executeRaw, drizzleORM uses this function
// 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[])
Expand Down Expand Up @@ -476,13 +484,7 @@ function enhanceDB(db: InternalDB, options: DBParams): DB {
query: string,
params?: Scalar[] | undefined
): Promise<QueryResult> => {
const sanitizedParams = params?.map((p) => {
if (ArrayBuffer.isView(p)) {
return p.buffer;
}

return p;
});
const sanitizedParams = sanitizeArrayBuffersInArray(params);

let intermediateResult = await db.execute(
query,
Expand Down
Loading