Skip to content

Commit cd61ef0

Browse files
authored
chore: bump sqlite version to 3.46.0 & adjust to ffi api breaking changes (#132)
* chore: bump sqlite version to 3.46.0 * fix: adjust to ffi breaking changes
1 parent 0efd04f commit cd61ef0

File tree

5 files changed

+70
-137
lines changed

5 files changed

+70
-137
lines changed

Diff for: sqlite

Submodule sqlite updated 234 files

Diff for: src/blob.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,17 @@ export class SQLBlob {
4040
readonly: true,
4141
db: "main",
4242
}, options);
43-
const pHandle = new Uint32Array(2);
43+
const pHandle = new BigUint64Array(1);
4444
unwrap(sqlite3_blob_open(
4545
db.unsafeHandle,
4646
toCString(options.db ?? "main"),
4747
toCString(options.table),
4848
toCString(options.column),
49-
options.row,
49+
BigInt(options.row),
5050
options.readonly === false ? 1 : 0,
5151
pHandle,
5252
));
53-
this.#handle = Deno.UnsafePointer.create(pHandle[0] + 2 ** 32 * pHandle[1]);
53+
this.#handle = Deno.UnsafePointer.create(pHandle[0]);
5454
}
5555

5656
/** Byte size of the Blob */

Diff for: src/database.ts

+36-20
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ export function isComplete(statement: string): boolean {
124124
return Boolean(sqlite3_complete(toCString(statement)));
125125
}
126126

127+
const BIG_MAX = BigInt(Number.MAX_SAFE_INTEGER);
128+
127129
/**
128130
* Represents a SQLite3 database connection.
129131
*
@@ -231,9 +233,9 @@ export class Database {
231233
}
232234
}
233235

234-
const pHandle = new Uint32Array(2);
236+
const pHandle = new BigUint64Array(1);
235237
const result = sqlite3_open_v2(toCString(this.#path), pHandle, flags, null);
236-
this.#handle = Deno.UnsafePointer.create(pHandle[0] + 2 ** 32 * pHandle[1]);
238+
this.#handle = Deno.UnsafePointer.create(pHandle[0]);
237239
if (result !== 0) sqlite3_close_v2(this.#handle);
238240
unwrap(result);
239241

@@ -314,15 +316,15 @@ export class Database {
314316
*/
315317
exec(sql: string, ...params: RestBindParameters): number {
316318
if (params.length === 0) {
317-
const pErr = new Uint32Array(2);
319+
const pErr = new BigUint64Array(1);
318320
sqlite3_exec(
319321
this.#handle,
320322
toCString(sql),
321323
null,
322324
null,
323325
new Uint8Array(pErr.buffer),
324326
);
325-
const errPtr = Deno.UnsafePointer.create(pErr[0] + 2 ** 32 * pErr[1]);
327+
const errPtr = Deno.UnsafePointer.create(pErr[0]);
326328
if (errPtr !== null) {
327329
const err = readCstr(errPtr);
328330
sqlite3_free(errPtr);
@@ -444,13 +446,19 @@ export class Database {
444446
const args: any[] = [];
445447
for (let i = 0; i < nArgs; i++) {
446448
const arg = Deno.UnsafePointer.create(
447-
Number(argptr.getBigUint64(i * 8)),
449+
argptr.getBigUint64(i * 8),
448450
);
449451
const type = sqlite3_value_type(arg);
450452
switch (type) {
451-
case SQLITE_INTEGER:
452-
args.push(sqlite3_value_int64(arg));
453+
case SQLITE_INTEGER: {
454+
const value = sqlite3_value_int64(arg);
455+
if (value < -BIG_MAX || value > BIG_MAX) {
456+
args.push(value);
457+
} else {
458+
args.push(Number(value));
459+
}
453460
break;
461+
}
454462
case SQLITE_FLOAT:
455463
args.push(sqlite3_value_double(arg));
456464
break;
@@ -498,15 +506,16 @@ export class Database {
498506
} else if (typeof result === "boolean") {
499507
sqlite3_result_int(ctx, result ? 1 : 0);
500508
} else if (typeof result === "number") {
501-
if (Number.isSafeInteger(result)) sqlite3_result_int64(ctx, result);
502-
else sqlite3_result_double(ctx, result);
509+
if (Number.isSafeInteger(result)) {
510+
sqlite3_result_int64(ctx, BigInt(result));
511+
} else sqlite3_result_double(ctx, result);
503512
} else if (typeof result === "bigint") {
504513
sqlite3_result_int64(ctx, result);
505514
} else if (typeof result === "string") {
506515
const buffer = new TextEncoder().encode(result);
507-
sqlite3_result_text(ctx, buffer, buffer.byteLength, 0);
516+
sqlite3_result_text(ctx, buffer, buffer.byteLength, 0n);
508517
} else if (result instanceof Uint8Array) {
509-
sqlite3_result_blob(ctx, result, result.length, -1);
518+
sqlite3_result_blob(ctx, result, result.length, -1n);
510519
} else {
511520
const buffer = new TextEncoder().encode(
512521
`Invalid return value: ${Deno.inspect(result)}`,
@@ -585,13 +594,19 @@ export class Database {
585594
const args: any[] = [];
586595
for (let i = 0; i < nArgs; i++) {
587596
const arg = Deno.UnsafePointer.create(
588-
Number(argptr.getBigUint64(i * 8)),
597+
argptr.getBigUint64(i * 8),
589598
);
590599
const type = sqlite3_value_type(arg);
591600
switch (type) {
592-
case SQLITE_INTEGER:
593-
args.push(sqlite3_value_int64(arg));
601+
case SQLITE_INTEGER: {
602+
const value = sqlite3_value_int64(arg);
603+
if (value < -BIG_MAX || value > BIG_MAX) {
604+
args.push(value);
605+
} else {
606+
args.push(Number(value));
607+
}
594608
break;
609+
}
595610
case SQLITE_FLOAT:
596611
args.push(sqlite3_value_double(arg));
597612
break;
@@ -662,15 +677,16 @@ export class Database {
662677
} else if (typeof result === "boolean") {
663678
sqlite3_result_int(ctx, result ? 1 : 0);
664679
} else if (typeof result === "number") {
665-
if (Number.isSafeInteger(result)) sqlite3_result_int64(ctx, result);
666-
else sqlite3_result_double(ctx, result);
680+
if (Number.isSafeInteger(result)) {
681+
sqlite3_result_int64(ctx, BigInt(result));
682+
} else sqlite3_result_double(ctx, result);
667683
} else if (typeof result === "bigint") {
668684
sqlite3_result_int64(ctx, result);
669685
} else if (typeof result === "string") {
670686
const buffer = new TextEncoder().encode(result);
671-
sqlite3_result_text(ctx, buffer, buffer.byteLength, 0);
687+
sqlite3_result_text(ctx, buffer, buffer.byteLength, 0n);
672688
} else if (result instanceof Uint8Array) {
673-
sqlite3_result_blob(ctx, result, result.length, -1);
689+
sqlite3_result_blob(ctx, result, result.length, -1n);
674690
} else {
675691
const buffer = new TextEncoder().encode(
676692
`Invalid return value: ${Deno.inspect(result)}`,
@@ -729,7 +745,7 @@ export class Database {
729745
throw new Error("Extension loading is not enabled");
730746
}
731747

732-
const pzErrMsg = new Uint32Array(2);
748+
const pzErrMsg = new BigUint64Array(1);
733749

734750
const result = sqlite3_load_extension(
735751
this.#handle,
@@ -739,7 +755,7 @@ export class Database {
739755
);
740756

741757
const pzErrPtr = Deno.UnsafePointer.create(
742-
pzErrMsg[0] + 2 ** 32 * pzErrMsg[1],
758+
pzErrMsg[0],
743759
);
744760
if (pzErrPtr !== null) {
745761
const pzErr = readCstr(pzErrPtr);

Diff for: src/ffi.ts

-9
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,6 @@ const symbols = {
7979
result: "i32",
8080
},
8181

82-
sqlite3_step_cb: {
83-
name: "sqlite3_step",
84-
callback: true,
85-
parameters: [
86-
"pointer", // sqlite3_stmt *pStmt
87-
],
88-
result: "i32",
89-
},
90-
9182
sqlite3_column_count: {
9283
parameters: [
9384
"pointer", // sqlite3_stmt *pStmt

0 commit comments

Comments
 (0)