Skip to content

Commit a3dbfe3

Browse files
committed
Do not sanitize params
1 parent fef18d6 commit a3dbfe3

4 files changed

Lines changed: 25 additions & 71 deletions

File tree

cpp/utils.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -100,24 +100,17 @@ inline JSVariant to_variant(jsi::Runtime &rt, const jsi::Value &value) {
100100
size_t byteOffset = 0;
101101
size_t byteLength = 0;
102102
uint8_t *sourceData = nullptr;
103+
jsi::Function arrayBufferCtor =
104+
rt.global().getPropertyAsFunction(rt, "ArrayBuffer");
105+
jsi::Function isViewFn =
106+
arrayBufferCtor.getPropertyAsFunction(rt, "isView");
107+
bool isArrayBufferView = isViewFn.call(rt, obj).getBool();
103108

104109
if (obj.isArrayBuffer(rt)) {
105110
auto buffer = obj.getArrayBuffer(rt);
106111
sourceData = buffer.data(rt);
107112
byteLength = buffer.size(rt);
108-
} else {
109-
jsi::Function arrayBufferCtor =
110-
rt.global().getPropertyAsFunction(rt, "ArrayBuffer");
111-
jsi::Function isViewFn =
112-
arrayBufferCtor.getPropertyAsFunction(rt, "isView");
113-
bool isArrayBufferView = isViewFn.call(rt, obj).getBool();
114-
115-
if (!isArrayBufferView) {
116-
throw std::runtime_error(
117-
"Object is not an ArrayBuffer or ArrayBuffer view, cannot bind "
118-
"to SQLite");
119-
}
120-
113+
} else if (isArrayBufferView) {
121114
jsi::Object bufferObject = obj.getPropertyAsObject(rt, "buffer");
122115
auto buffer = bufferObject.getArrayBuffer(rt);
123116

@@ -132,6 +125,10 @@ inline JSVariant to_variant(jsi::Runtime &rt, const jsi::Value &value) {
132125
}
133126

134127
sourceData = buffer.data(rt) + byteOffset;
128+
} else {
129+
throw std::runtime_error(
130+
"Object is not an ArrayBuffer or ArrayBuffer view, cannot bind "
131+
"to SQLite");
135132
}
136133

137134
uint8_t *data = new uint8_t[byteLength];

example/src/tests/blob.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
describe,
66
expect,
77
it,
8+
itOnly,
89
} from "@op-engineering/op-test";
910

1011
let db: DB;
@@ -56,7 +57,7 @@ describe("Blobs", () => {
5657

5758
const result = await db.execute("SELECT content FROM BlobTable");
5859

59-
const finalUint8 = new Uint8Array(result.rows[0]!.content as any);
60+
const finalUint8 = new Uint8Array(result.rows[0]?.content as any);
6061
expect(finalUint8[0]).toBe(42);
6162
});
6263

@@ -74,7 +75,9 @@ describe("Blobs", () => {
7475
expect(content).toBeTruthy();
7576

7677
const finalUint8 = new Uint8Array(content as ArrayBuffer);
77-
expect(Array.from(finalUint8)).toEqual([98, 99]);
78+
const res = Array.from(finalUint8);
79+
expect(res[0]).toEqual(98);
80+
expect(res[1]).toEqual(99);
7881
});
7982

8083
it("Uint16Array", async () => {

example/src/tests/queries.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ describe("Queries tests", () => {
101101
} catch (e: any) {
102102
expect(
103103
e.message.includes(
104-
"Exception in HostFunction: Object is not an ArrayBuffer, cannot bind to SQLite",
104+
"Object is not an ArrayBuffer or ArrayBuffer view",
105105
),
106106
).toEqual(true);
107107
}

src/functions.ts

Lines changed: 9 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -68,26 +68,6 @@ function enhanceDB(db: _InternalDB, options: DBParams): DB {
6868
}
6969
};
7070

71-
function sanitizeArrayBuffersInArray(
72-
params?: any[] | any[][],
73-
): any[] | undefined {
74-
if (!params) {
75-
return params;
76-
}
77-
78-
return params.map((p) => {
79-
if (Array.isArray(p)) {
80-
return sanitizeArrayBuffersInArray(p);
81-
}
82-
83-
if (ArrayBuffer.isView(p)) {
84-
return p.buffer;
85-
}
86-
87-
return p;
88-
});
89-
}
90-
9171
// spreading the object does not work with HostObjects (db)
9272
// We need to manually assign the fields
9373
const enhancedDb = {
@@ -112,14 +92,6 @@ function enhanceDB(db: _InternalDB, options: DBParams): DB {
11292
executeBatch: async (
11393
commands: SQLBatchTuple[],
11494
): Promise<BatchQueryResult> => {
115-
// Do normal for loop and replace in place for performance
116-
for (let i = 0; i < commands.length; i++) {
117-
// [1] is the params arg
118-
if (commands[i]![1]) {
119-
commands[i]![1] = sanitizeArrayBuffersInArray(commands[i]![1]) as any;
120-
}
121-
}
122-
12395
async function run() {
12496
try {
12597
enhancedDb.executeSync("BEGIN TRANSACTION;");
@@ -160,33 +132,24 @@ function enhanceDB(db: _InternalDB, options: DBParams): DB {
160132
query: string,
161133
params?: Scalar[],
162134
): Promise<QueryResult> => {
163-
const sanitizedParams = sanitizeArrayBuffersInArray(params);
164-
165-
return sanitizedParams
166-
? await db.executeWithHostObjects(query, sanitizedParams as Scalar[])
135+
return params
136+
? await db.executeWithHostObjects(query, params)
167137
: await db.executeWithHostObjects(query);
168138
},
169139
executeRaw: async (query: string, params?: Scalar[]) => {
170-
const sanitizedParams = sanitizeArrayBuffersInArray(params);
171-
172-
return db.executeRaw(query, sanitizedParams as Scalar[]);
140+
return db.executeRaw(query, params as Scalar[]);
173141
},
174142
executeRawSync: (query: string, params?: Scalar[]) => {
175-
const sanitizedParams = sanitizeArrayBuffersInArray(params);
176-
return db.executeRawSync(query, sanitizedParams as Scalar[]);
143+
return db.executeRawSync(query, params as Scalar[]);
177144
},
178145
// Wrapper for executeRaw, drizzleORM uses this function
179146
// at some point I changed the API but they did not pin their dependency to a specific version
180147
// so re-inserting this so it starts working again
181148
executeRawAsync: async (query: string, params?: Scalar[]) => {
182-
const sanitizedParams = sanitizeArrayBuffersInArray(params);
183-
184-
return db.executeRaw(query, sanitizedParams as Scalar[]);
149+
return db.executeRaw(query, params as Scalar[]);
185150
},
186151
executeSync: (query: string, params?: Scalar[]): QueryResult => {
187-
let res = params
188-
? db.executeSync(query, sanitizeArrayBuffersInArray(params) as Scalar[])
189-
: db.executeSync(query);
152+
let res = params ? db.executeSync(query, params) : db.executeSync(query);
190153

191154
if (!res.rows) {
192155
const rows: Record<string, Scalar>[] = [];
@@ -222,12 +185,7 @@ function enhanceDB(db: _InternalDB, options: DBParams): DB {
222185
query: string,
223186
params?: Scalar[] | undefined,
224187
): Promise<QueryResult> => {
225-
let res = params
226-
? await db.execute(
227-
query,
228-
sanitizeArrayBuffersInArray(params) as Scalar[],
229-
)
230-
: await db.execute(query);
188+
let res = params ? await db.execute(query, params) : await db.execute(query);
231189

232190
if (!res.rows) {
233191
const rows: Record<string, Scalar>[] = [];
@@ -258,14 +216,10 @@ function enhanceDB(db: _InternalDB, options: DBParams): DB {
258216

259217
return {
260218
bindSync: (params: Scalar[]) => {
261-
const sanitizedParams = sanitizeArrayBuffersInArray(params);
262-
263-
stmt.bindSync(sanitizedParams!);
219+
stmt.bindSync(params);
264220
},
265221
bind: async (params: Scalar[]) => {
266-
const sanitizedParams = sanitizeArrayBuffersInArray(params);
267-
268-
await stmt.bind(sanitizedParams!);
222+
await stmt.bind(params);
269223
},
270224
execute: stmt.execute,
271225
};

0 commit comments

Comments
 (0)