642 lines
12 KiB
TypeScript
642 lines
12 KiB
TypeScript
import meta from "../deno.json" with { type: "json" };
|
|
import { dlopen } from "../deps.ts";
|
|
|
|
const symbols = {
|
|
sqlite3_open_v2: {
|
|
parameters: [
|
|
"buffer", // const char *filename
|
|
"buffer", // sqlite3 **ppDb
|
|
"i32", // int flags
|
|
"pointer", // const char *zVfs
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_close_v2: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_changes: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_total_changes: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_last_insert_rowid: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_get_autocommit: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_prepare_v2: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
"buffer", // const char *zSql
|
|
"i32", // int nByte
|
|
"buffer", // sqlite3_stmt **ppStmt
|
|
"pointer", // const char **pzTail
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_reset: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_clear_bindings: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_step: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_column_count: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_column_type: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_column_text: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "pointer",
|
|
},
|
|
sqlite3_column_value: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_finalize: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_exec: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
"buffer", // const char *sql
|
|
"pointer", // sqlite3_callback callback
|
|
"pointer", // void *arg
|
|
"buffer", // char **errmsg
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_free: {
|
|
parameters: [
|
|
"pointer", // void *p
|
|
],
|
|
result: "void",
|
|
},
|
|
|
|
sqlite3_column_int: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_column_double: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "f64",
|
|
},
|
|
|
|
sqlite3_column_blob: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_column_bytes: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_column_name: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_column_decltype: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "u64",
|
|
},
|
|
|
|
sqlite3_bind_parameter_index: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"buffer", // const char *zName
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_bind_text: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
"buffer", // const char *zData
|
|
"i32", // int nData
|
|
"pointer", // void (*xDel)(void*)
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_bind_blob: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
"buffer", // const void *zData
|
|
"i32", // int nData
|
|
"pointer", // void (*xDel)(void*)
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_bind_double: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
"f64", // double rValue
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_bind_int: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
"i32", // int iValue
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_bind_int64: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
"i64", // i64 iValue
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_bind_null: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_expanded_sql: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_bind_parameter_count: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_complete: {
|
|
parameters: [
|
|
"buffer", // const char *sql
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_sourceid: {
|
|
parameters: [],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_libversion: {
|
|
parameters: [],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_blob_open: {
|
|
parameters: [
|
|
"pointer", /* sqlite3 *db */
|
|
"buffer", /* const char *zDb */
|
|
"buffer", /* const char *zTable */
|
|
"buffer", /* const char *zColumn */
|
|
"i64", /* sqlite3_int64 iRow */
|
|
"i32", /* int flags */
|
|
"buffer", /* sqlite3_blob **ppBlob */
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_blob_read: {
|
|
parameters: [
|
|
"pointer", /* sqlite3_blob *blob */
|
|
"buffer", /* void *Z */
|
|
"i32", /* int N */
|
|
"i32", /* int iOffset */
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_blob_write: {
|
|
parameters: [
|
|
"pointer", /* sqlite3_blob *blob */
|
|
"buffer", /* const void *z */
|
|
"i32", /* int n */
|
|
"i32", /* int iOffset */
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_blob_bytes: {
|
|
parameters: ["pointer" /* sqlite3_blob *blob */],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_blob_close: {
|
|
parameters: ["pointer" /* sqlite3_blob *blob */],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_sql: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_stmt_readonly: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_bind_parameter_name: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_errcode: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_errmsg: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_errstr: {
|
|
parameters: [
|
|
"i32", // int rc
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_column_int64: {
|
|
parameters: [
|
|
"pointer", // sqlite3_stmt *pStmt
|
|
"i32", // int iCol
|
|
],
|
|
result: "i64",
|
|
},
|
|
|
|
sqlite3_backup_init: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *pDest
|
|
"buffer", // const char *zDestName
|
|
"pointer", // sqlite3 *pSource
|
|
"buffer", // const char *zSourceName
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_backup_step: {
|
|
parameters: [
|
|
"pointer", // sqlite3_backup *p
|
|
"i32", // int nPage
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_backup_finish: {
|
|
parameters: [
|
|
"pointer", // sqlite3_backup *p
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_backup_remaining: {
|
|
parameters: [
|
|
"pointer", // sqlite3_backup *p
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_backup_pagecount: {
|
|
parameters: [
|
|
"pointer", // sqlite3_backup *p
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_create_function: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
"buffer", // const char *zFunctionName
|
|
"i32", // int nArg
|
|
"i32", // int eTextRep
|
|
"pointer", // void *pApp
|
|
"pointer", // void (*xFunc)(sqlite3_context*,int,sqlite3_value**)
|
|
"pointer", // void (*xStep)(sqlite3_context*,int,sqlite3_value**)
|
|
"pointer", // void (*xFinal)(sqlite3_context*)
|
|
],
|
|
result: "i32",
|
|
optional: true,
|
|
},
|
|
|
|
sqlite3_result_blob: {
|
|
parameters: [
|
|
"pointer", // sqlite3_context *p
|
|
"buffer", // const void *z
|
|
"i32", // int n
|
|
"isize", // void (*xDel)(void*)
|
|
],
|
|
result: "void",
|
|
},
|
|
|
|
sqlite3_result_double: {
|
|
parameters: [
|
|
"pointer", // sqlite3_context *p
|
|
"f64", // double rVal
|
|
],
|
|
result: "void",
|
|
},
|
|
|
|
sqlite3_result_error: {
|
|
parameters: [
|
|
"pointer", // sqlite3_context *p
|
|
"buffer", // const char *z
|
|
"i32", // int n
|
|
],
|
|
result: "void",
|
|
},
|
|
|
|
sqlite3_result_int: {
|
|
parameters: [
|
|
"pointer", // sqlite3_context *p
|
|
"i32", // int iVal
|
|
],
|
|
result: "void",
|
|
},
|
|
|
|
sqlite3_result_int64: {
|
|
parameters: [
|
|
"pointer", // sqlite3_context *p
|
|
"i64", // sqlite3_int64 iVal
|
|
],
|
|
result: "void",
|
|
},
|
|
|
|
sqlite3_result_null: {
|
|
parameters: [
|
|
"pointer", // sqlite3_context *p
|
|
],
|
|
result: "void",
|
|
},
|
|
|
|
sqlite3_result_text: {
|
|
parameters: [
|
|
"pointer", // sqlite3_context *p
|
|
"buffer", // const char *z
|
|
"i32", // int n
|
|
"isize", // void (*xDel)(void*)
|
|
],
|
|
result: "void",
|
|
},
|
|
|
|
sqlite3_value_type: {
|
|
parameters: [
|
|
"pointer", // sqlite3_value *pVal
|
|
],
|
|
result: "i32",
|
|
},
|
|
sqlite3_value_subtype: {
|
|
parameters: [
|
|
"pointer", // sqlite3_value *pVal
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_value_blob: {
|
|
parameters: [
|
|
"pointer", // sqlite3_value *pVal
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_value_double: {
|
|
parameters: [
|
|
"pointer", // sqlite3_value *pVal
|
|
],
|
|
result: "f64",
|
|
},
|
|
|
|
sqlite3_value_int: {
|
|
parameters: [
|
|
"pointer", // sqlite3_value *pVal
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_value_int64: {
|
|
parameters: [
|
|
"pointer", // sqlite3_value *pVal
|
|
],
|
|
result: "i64",
|
|
},
|
|
|
|
sqlite3_value_text: {
|
|
parameters: [
|
|
"pointer", // sqlite3_value *pVal
|
|
],
|
|
result: "pointer",
|
|
},
|
|
|
|
sqlite3_value_bytes: {
|
|
parameters: [
|
|
"pointer", // sqlite3_value *pVal
|
|
],
|
|
result: "i32",
|
|
},
|
|
|
|
sqlite3_aggregate_context: {
|
|
parameters: [
|
|
"pointer", // sqlite3_context *p
|
|
"i32", // int nBytes
|
|
],
|
|
result: "pointer",
|
|
optional: true,
|
|
},
|
|
|
|
sqlite3_enable_load_extension: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
"i32", // int onoff
|
|
],
|
|
result: "i32",
|
|
optional: true,
|
|
},
|
|
|
|
sqlite3_load_extension: {
|
|
parameters: [
|
|
"pointer", // sqlite3 *db
|
|
"buffer", // const char *zFile
|
|
"buffer", // const char *zProc
|
|
"buffer", // const char **pzErrMsg
|
|
],
|
|
result: "i32",
|
|
optional: true,
|
|
},
|
|
|
|
sqlite3_initialize: {
|
|
parameters: [],
|
|
result: "i32",
|
|
},
|
|
} as const satisfies Deno.ForeignLibraryInterface;
|
|
|
|
let lib: Deno.DynamicLibrary<typeof symbols>["symbols"];
|
|
|
|
function tryGetEnv(key: string): string | undefined {
|
|
try {
|
|
return Deno.env.get(key);
|
|
} catch (e) {
|
|
if (e instanceof Deno.errors.PermissionDenied) {
|
|
return undefined;
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
try {
|
|
const customPath = tryGetEnv("DENO_SQLITE_PATH");
|
|
const sqliteLocal = tryGetEnv("DENO_SQLITE_LOCAL");
|
|
|
|
if (sqliteLocal === "1") {
|
|
lib = Deno.dlopen(
|
|
new URL(
|
|
`../build/${Deno.build.os === "windows" ? "" : "lib"}sqlite3${
|
|
Deno.build.arch !== "x86_64" ? `_${Deno.build.arch}` : ""
|
|
}.${
|
|
Deno.build.os === "windows"
|
|
? "dll"
|
|
: Deno.build.os === "darwin"
|
|
? "dylib"
|
|
: "so"
|
|
}`,
|
|
import.meta.url,
|
|
),
|
|
symbols,
|
|
).symbols;
|
|
} else if (customPath) {
|
|
lib = Deno.dlopen(customPath, symbols).symbols;
|
|
} else {
|
|
lib = (
|
|
await dlopen(
|
|
{
|
|
name: "sqlite3",
|
|
url: `${meta.github}/releases/download/${meta.version}/`,
|
|
suffixes: {
|
|
aarch64: "_aarch64",
|
|
},
|
|
},
|
|
symbols,
|
|
)
|
|
).symbols;
|
|
}
|
|
} catch (e) {
|
|
if (e instanceof Deno.errors.PermissionDenied) {
|
|
throw e;
|
|
}
|
|
|
|
throw new Error("Failed to load SQLite3 Dynamic Library", { cause: e });
|
|
}
|
|
|
|
const init = lib.sqlite3_initialize();
|
|
if (init !== 0) {
|
|
throw new Error(`Failed to initialize SQLite3: ${init}`);
|
|
}
|
|
|
|
export default lib;
|