@cutils/sqlite 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,31 @@
1
+ // Reusable scratch buffer for the shim's mutable-bytes out params.
2
+ // Strings/blobs arrive as "required bytes" return values; when the buffer is
3
+ // too small it doubles until the call fits.
4
+
5
+ export class Scratch {
6
+ buf: Uint8Array;
7
+
8
+ constructor() {
9
+ this.buf = new Uint8Array(4096);
10
+ }
11
+
12
+ /** Grow until `cap` bytes fit. */
13
+ ensure(cap: number): void {
14
+ let n = this.buf.length;
15
+ while (n < cap) {
16
+ n = n * 2;
17
+ }
18
+ if (n !== this.buf.length) {
19
+ this.buf = new Uint8Array(n);
20
+ }
21
+ }
22
+
23
+ /** Copy the first `n` bytes out (for blob returns — scratch is reused). */
24
+ copyOut(n: number): Uint8Array {
25
+ const out = new Uint8Array(n);
26
+ for (let i = 0; i < n; i++) {
27
+ out[i] = this.buf[i];
28
+ }
29
+ return out;
30
+ }
31
+ }
@@ -0,0 +1,151 @@
1
+ // declare-function bindings for vendor/shim/sqlite_shim.c.
2
+ // These must match vendor/manifest.json exactly (names, arity, types).
3
+ // Span ABI: `string` params marshal as (ptr,len) — the declares pass only
4
+ // the JS string; `mutable-bytes` out params marshal as (buf,len) — the
5
+ // declares pass only the Uint8Array. Thin exported wrappers re-expose the
6
+ // bindings: ambient declarations cannot be exported. Under plain Node the
7
+ // emitted calls resolve on globalThis — test/koffi-binding.mjs installs
8
+ // matching globals loaded through koffi.
9
+
10
+ declare function shim_open(path: string, flags: number): bigint;
11
+ declare function shim_close(db: bigint): number;
12
+ declare function shim_errcode(db: bigint): number;
13
+ declare function shim_errmsg(db: bigint, buf: Uint8Array): number;
14
+ declare function shim_in_transaction(db: bigint): number;
15
+ declare function shim_exec(db: bigint, sql: string): number;
16
+ declare function shim_begin(db: bigint): number;
17
+ declare function shim_commit(db: bigint): number;
18
+ declare function shim_rollback(db: bigint): number;
19
+ declare function shim_savepoint(db: bigint, name: string, op: number): number;
20
+ declare function shim_prepare(db: bigint, sql: string): bigint;
21
+ declare function shim_step(stmt: bigint): number;
22
+ declare function shim_reset(stmt: bigint): number;
23
+ declare function shim_finalize(stmt: bigint): number;
24
+ declare function shim_clear_bindings(stmt: bigint): number;
25
+ declare function shim_stmt_readonly(stmt: bigint): number;
26
+ declare function shim_expanded_sql(stmt: bigint, buf: Uint8Array): number;
27
+ declare function shim_bind_count(stmt: bigint): number;
28
+ declare function shim_bind_index(stmt: bigint, name: string): number;
29
+ declare function shim_bind_int(stmt: bigint, idx: number, val: bigint): number;
30
+ declare function shim_bind_dbl(stmt: bigint, idx: number, val: number): number;
31
+ declare function shim_bind_text(stmt: bigint, idx: number, val: string): number;
32
+ declare function shim_bind_blob(stmt: bigint, idx: number, val: Uint8Array): number;
33
+ declare function shim_bind_null(stmt: bigint, idx: number): number;
34
+ declare function shim_column_count(stmt: bigint): number;
35
+ declare function shim_column_name(stmt: bigint, idx: number, buf: Uint8Array): number;
36
+ declare function shim_column_meta(
37
+ stmt: bigint,
38
+ idx: number,
39
+ which: number,
40
+ buf: Uint8Array,
41
+ ): number;
42
+ declare function shim_column_type(stmt: bigint, idx: number): number;
43
+ declare function shim_column_int64(stmt: bigint, idx: number): bigint;
44
+ declare function shim_column_dbl(stmt: bigint, idx: number): number;
45
+ declare function shim_column_text(stmt: bigint, idx: number, buf: Uint8Array): number;
46
+ declare function shim_column_blob(stmt: bigint, idx: number, buf: Uint8Array): number;
47
+ declare function shim_last_insert_rowid(db: bigint): bigint;
48
+ declare function shim_changes(db: bigint): number;
49
+
50
+ export function ffiOpen(path: string, flags: number): bigint {
51
+ return shim_open(path, flags);
52
+ }
53
+ export function ffiClose(db: bigint): number {
54
+ return shim_close(db);
55
+ }
56
+ export function ffiErrcode(db: bigint): number {
57
+ return shim_errcode(db);
58
+ }
59
+ export function ffiErrmsg(db: bigint, buf: Uint8Array): number {
60
+ return shim_errmsg(db, buf);
61
+ }
62
+ export function ffiInTransaction(db: bigint): number {
63
+ return shim_in_transaction(db);
64
+ }
65
+ export function ffiExec(db: bigint, sql: string): number {
66
+ return shim_exec(db, sql);
67
+ }
68
+ export function ffiBegin(db: bigint): number {
69
+ return shim_begin(db);
70
+ }
71
+ export function ffiCommit(db: bigint): number {
72
+ return shim_commit(db);
73
+ }
74
+ export function ffiRollback(db: bigint): number {
75
+ return shim_rollback(db);
76
+ }
77
+ export function ffiSavepoint(db: bigint, name: string, op: number): number {
78
+ return shim_savepoint(db, name, op);
79
+ }
80
+ export function ffiPrepare(db: bigint, sql: string): bigint {
81
+ return shim_prepare(db, sql);
82
+ }
83
+ export function ffiStep(stmt: bigint): number {
84
+ return shim_step(stmt);
85
+ }
86
+ export function ffiReset(stmt: bigint): number {
87
+ return shim_reset(stmt);
88
+ }
89
+ export function ffiFinalize(stmt: bigint): number {
90
+ return shim_finalize(stmt);
91
+ }
92
+ export function ffiClearBindings(stmt: bigint): number {
93
+ return shim_clear_bindings(stmt);
94
+ }
95
+ export function ffiStmtReadonly(stmt: bigint): number {
96
+ return shim_stmt_readonly(stmt);
97
+ }
98
+ export function ffiExpandedSql(stmt: bigint, buf: Uint8Array): number {
99
+ return shim_expanded_sql(stmt, buf);
100
+ }
101
+ export function ffiBindCount(stmt: bigint): number {
102
+ return shim_bind_count(stmt);
103
+ }
104
+ export function ffiBindIndex(stmt: bigint, name: string): number {
105
+ return shim_bind_index(stmt, name);
106
+ }
107
+ export function ffiBindInt(stmt: bigint, idx: number, val: bigint): number {
108
+ return shim_bind_int(stmt, idx, val);
109
+ }
110
+ export function ffiBindDbl(stmt: bigint, idx: number, val: number): number {
111
+ return shim_bind_dbl(stmt, idx, val);
112
+ }
113
+ export function ffiBindText(stmt: bigint, idx: number, val: string): number {
114
+ return shim_bind_text(stmt, idx, val);
115
+ }
116
+ export function ffiBindBlob(stmt: bigint, idx: number, val: Uint8Array): number {
117
+ return shim_bind_blob(stmt, idx, val);
118
+ }
119
+ export function ffiBindNull(stmt: bigint, idx: number): number {
120
+ return shim_bind_null(stmt, idx);
121
+ }
122
+ export function ffiColumnCount(stmt: bigint): number {
123
+ return shim_column_count(stmt);
124
+ }
125
+ export function ffiColumnName(stmt: bigint, idx: number, buf: Uint8Array): number {
126
+ return shim_column_name(stmt, idx, buf);
127
+ }
128
+ export function ffiColumnMeta(stmt: bigint, idx: number, which: number, buf: Uint8Array): number {
129
+ return shim_column_meta(stmt, idx, which, buf);
130
+ }
131
+ export function ffiColumnType(stmt: bigint, idx: number): number {
132
+ return shim_column_type(stmt, idx);
133
+ }
134
+ export function ffiColumnInt64(stmt: bigint, idx: number): bigint {
135
+ return shim_column_int64(stmt, idx);
136
+ }
137
+ export function ffiColumnDbl(stmt: bigint, idx: number): number {
138
+ return shim_column_dbl(stmt, idx);
139
+ }
140
+ export function ffiColumnText(stmt: bigint, idx: number, buf: Uint8Array): number {
141
+ return shim_column_text(stmt, idx, buf);
142
+ }
143
+ export function ffiColumnBlob(stmt: bigint, idx: number, buf: Uint8Array): number {
144
+ return shim_column_blob(stmt, idx, buf);
145
+ }
146
+ export function ffiLastInsertRowid(db: bigint): bigint {
147
+ return shim_last_insert_rowid(db);
148
+ }
149
+ export function ffiChanges(db: bigint): number {
150
+ return shim_changes(db);
151
+ }
@@ -0,0 +1,9 @@
1
+ // Savepoint name generation for nested transactions.
2
+ // Names must satisfy the shim's identifier whitelist [A-Za-z0-9_].
3
+
4
+ let counter: number = 0;
5
+
6
+ export function nextSavepoint(): string {
7
+ counter += 1;
8
+ return "sp_" + String(counter);
9
+ }
@@ -0,0 +1,13 @@
1
+ // string <-> UTF-8 helpers over TextEncoder/TextDecoder (subset-clean).
2
+
3
+ const encoder: TextEncoder = new TextEncoder();
4
+ const decoder: TextDecoder = new TextDecoder();
5
+
6
+ export function utf8Encode(s: string): Uint8Array {
7
+ return encoder.encode(s);
8
+ }
9
+
10
+ /** Decode the first `n` bytes of `buf` as UTF-8. */
11
+ export function utf8Decode(buf: Uint8Array, n: number): string {
12
+ return decoder.decode(buf.slice(0, n));
13
+ }
package/src/types.ts ADDED
@@ -0,0 +1,83 @@
1
+ // Public value/row types and the Standard Schema v1 seam types.
2
+ //
3
+ // The Standard Schema types are a LOCAL MIRROR of `@standard-schema/spec`,
4
+ // not an import: scriptc 0.3.3 refuses to analyze the spec package's shipped
5
+ // JS even for a type-only import, so the package owns a structural copy of
6
+ // the spec surface (props + validate signature + InferOutput inference).
7
+ // Structurally every conforming validator satisfies it — `@chttp/val` schemas,
8
+ // valibot schemas, anything with `~standard.validate`.
9
+
10
+ /** Standard Typed `types` member shape (valibot-style). */
11
+ export interface StdTypes<Input, Output> {
12
+ input: Input;
13
+ output: Output;
14
+ }
15
+
16
+ /**
17
+ * Standard Schema `~standard` props — a CLASS, not an interface:
18
+ * interface-typed class fields erase to `unknown` under scriptc (SC1090),
19
+ * so the seam shape is declared as classes (the same trick `@chttp/val`
20
+ * uses). Structurally every conforming validator still satisfies it:
21
+ * `version` is `number` (not literal `1`, so `@chttp/val`'s
22
+ * `version: number` field assigns) and `validate` returns `unknown` so
23
+ * both sync results and spec-conformant `Result | Promise<Result>`
24
+ * signatures are compatible. Async validators are rejected at call time.
25
+ */
26
+ export class StdProps {
27
+ version: number = 0;
28
+ vendor: string = "";
29
+
30
+ validate(input: unknown): unknown {
31
+ return { value: input, issues: null };
32
+ }
33
+ }
34
+
35
+ /** Standard Schema v1 shape (local mirror of the spec). */
36
+ export class StandardSchemaV1 {
37
+ "~standard": StdProps = new StdProps();
38
+ }
39
+
40
+ /**
41
+ * Row output inference: reads the optional `types` member when the schema
42
+ * carries it (valibot and other spec-complete validators), else `unknown`
43
+ * (`@chttp/val` today — its coarse inference is a val-side ticket).
44
+ */
45
+ export type InferOutput<S extends StandardSchemaV1> = S extends {
46
+ "~standard": { types: { output: infer O } };
47
+ }
48
+ ? O
49
+ : unknown;
50
+
51
+ /** A value SQLite can store / return. */
52
+ export type SqlValue = number | bigint | string | null | Uint8Array;
53
+ /** A bindable value; booleans bind as INTEGER 0/1. */
54
+ export type BindValue = SqlValue | boolean;
55
+ /** A row as returned by `get`/`all` before schema validation. */
56
+ export type Row = Record<string, SqlValue>;
57
+ /** Write-side parameters for named binds (`@x`, `:x`, `$x`). */
58
+ export type BindRecord = Record<string, BindValue>;
59
+
60
+ export interface RunResult {
61
+ changes: number;
62
+ lastInsertRowid: number;
63
+ }
64
+
65
+ export interface OpenOpts {
66
+ /** Open read-only (fails if the file does not exist). */
67
+ readonly?: boolean;
68
+ /** Fail instead of creating the file when it does not exist. */
69
+ fileMustExist?: boolean;
70
+ }
71
+
72
+ export interface ColumnInfo {
73
+ /** Column name as the statement returns it. */
74
+ name: string;
75
+ /** Origin column name, or null for expressions / metadata off. */
76
+ column: string | null;
77
+ /** Origin table name. */
78
+ table: string | null;
79
+ /** Origin database name ("main", "temp", or an ATTACH alias). */
80
+ database: string | null;
81
+ /** Declared column type from the DDL, or null for expressions. */
82
+ type: string | null;
83
+ }
@@ -0,0 +1,60 @@
1
+ // Standard-Schema seam: `schema["~standard"].validate(row)` with structural
2
+ // result handling — val returns `{ value, issues: null }`, spec-conformant
3
+ // validators return `{ value }` (issues member absent) or `{ issues }`.
4
+ // A Promise result (async validator) is rejected: this FFI surface is sync.
5
+
6
+ import { SqliteError } from "./errors.ts";
7
+ import { StandardSchemaV1 } from "./types.ts";
8
+
9
+ interface StdResultLite {
10
+ value: unknown;
11
+ issues: unknown;
12
+ }
13
+
14
+ interface StdIssueLite {
15
+ message: string;
16
+ }
17
+
18
+ function summarizeIssues(issues: unknown): string {
19
+ if (typeof issues !== "object" || issues === null) {
20
+ return "schema validation failed";
21
+ }
22
+ const list = issues as StdIssueLite[];
23
+ const first = list[0];
24
+ if (typeof first !== "object" || first === null) {
25
+ return "schema validation failed";
26
+ }
27
+ let msg = first.message;
28
+ if (typeof msg !== "string" || msg.length === 0) {
29
+ msg = "schema validation failed";
30
+ }
31
+ if (list.length > 1) {
32
+ return msg + " (+" + String(list.length - 1) + " more issues)";
33
+ }
34
+ return msg;
35
+ }
36
+
37
+ /**
38
+ * Run `schema["~standard"].validate(value)` synchronously. Returns the
39
+ * validator's (possibly transformed) output. Throws `SqliteError` with
40
+ * `code: "VALIDATION"` on failure.
41
+ */
42
+ export function validateRow(schema: StandardSchemaV1, value: unknown): unknown {
43
+ const res = schema["~standard"].validate(value) as unknown as StdResultLite;
44
+ if (typeof res !== "object" || res === null) {
45
+ throw new SqliteError("VALIDATION", "validator returned a non-standard result");
46
+ }
47
+ // Promise results (async validators) land here: no `value`/`issues`
48
+ // members, so both checks below fail into the non-standard throw.
49
+ const iss = res.issues;
50
+ if (iss !== null && typeof iss !== "undefined") {
51
+ throw new SqliteError("VALIDATION", summarizeIssues(iss));
52
+ }
53
+ if (typeof res.value === "undefined") {
54
+ throw new SqliteError(
55
+ "VALIDATION",
56
+ "validator returned a non-standard result (async validators are not supported)",
57
+ );
58
+ }
59
+ return res.value;
60
+ }
@@ -0,0 +1,48 @@
1
+ # vendor/
2
+
3
+ Vendored native dependencies for `@cutils/sqlite`. Everything under this
4
+ directory is compiled into the consumer's binary by `scriptc build --ffi`;
5
+ nothing here is a runtime dependency.
6
+
7
+ ## sqlite-amalgamation/
8
+
9
+ The SQLite amalgamation (`sqlite3.c` + `sqlite3.h`), vendored unmodified from
10
+ upstream. SQLite is dedicated to the public domain
11
+ (<https://www.sqlite.org/copyright.html>), so redistribution inside this package
12
+ needs no license attribution.
13
+
14
+ - Version: **3.50.4** (see `SQLITE_VERSION`; `SQLITE_VERSION_NUMBER` 3500400)
15
+ - Source: <https://www.sqlite.org/2025/sqlite-amalgamation-3500400.zip>
16
+ - Downloaded: 2026-10-15
17
+
18
+ SHA-256 checksums (verify with `sha256sum`):
19
+
20
+ ```
21
+ e3f5d6901e7492af4a1fc8c4d745cae84c264942524c3fbfc02b82a5ca8818c8 sqlite3.c
22
+ abd1514e0351f79393d1be882830afdb40a8099e8257f311f0bfdf8486f11bea sqlite3.h
23
+ ```
24
+
25
+ If these checksums ever differ, the files were modified or corrupted — do not
26
+ ship them; re-vendor from upstream instead.
27
+
28
+ Compiled with `-O2 -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION
29
+ -DSQLITE_ENABLE_COLUMN_METADATA`:
30
+
31
+ - `SQLITE_THREADSAFE=0` — single-connection, single-threaded model; matches the
32
+ wrapper's `Database` (one handle per instance).
33
+ - `SQLITE_OMIT_LOAD_EXTENSION` — no `load_extension`; removes attack surface.
34
+ - `SQLITE_ENABLE_COLUMN_METADATA` — enables `sqlite3_column_table_name` /
35
+ `column_database_name` / `column_origin_name` for `Stmt.columns()`.
36
+
37
+ ## shim/
38
+
39
+ `sqlite_shim.c` — the thin C shim (~300 LoC) that adapts the SQLite C API to
40
+ scriptc's FFI ABI (fixed-width signatures, `mutable-bytes` out params). This is
41
+ the only C code maintained in this package; the amalgamation is upstream,
42
+ unmodified.
43
+
44
+ ## manifest.json
45
+
46
+ The scriptc FFI manifest (`ffi_format: 7`) consumed by
47
+ `scriptc build --ffi` and `scriptc coverage --ffi`. `libraries` points at the
48
+ prebuilt archive `../build/libsqlite3-shim.a` produced by `pnpm build`.
@@ -0,0 +1,166 @@
1
+ {
2
+ "ffi_format": 7,
3
+ "functions": [
4
+ {
5
+ "name": "shim_open",
6
+ "symbol": "shim_open",
7
+ "params": ["string", "i32"],
8
+ "returns": "pointer"
9
+ },
10
+ { "name": "shim_close", "symbol": "shim_close", "params": ["pointer"], "returns": "i32" },
11
+ { "name": "shim_errcode", "symbol": "shim_errcode", "params": ["pointer"], "returns": "i32" },
12
+ {
13
+ "name": "shim_errmsg",
14
+ "symbol": "shim_errmsg",
15
+ "params": ["pointer", "mutable-bytes"],
16
+ "returns": "i32"
17
+ },
18
+ {
19
+ "name": "shim_in_transaction",
20
+ "symbol": "shim_in_transaction",
21
+ "params": ["pointer"],
22
+ "returns": "i32"
23
+ },
24
+ {
25
+ "name": "shim_exec",
26
+ "symbol": "shim_exec",
27
+ "params": ["pointer", "string"],
28
+ "returns": "i32"
29
+ },
30
+ { "name": "shim_begin", "symbol": "shim_begin", "params": ["pointer"], "returns": "i32" },
31
+ { "name": "shim_commit", "symbol": "shim_commit", "params": ["pointer"], "returns": "i32" },
32
+ { "name": "shim_rollback", "symbol": "shim_rollback", "params": ["pointer"], "returns": "i32" },
33
+ {
34
+ "name": "shim_savepoint",
35
+ "symbol": "shim_savepoint",
36
+ "params": ["pointer", "string", "i32"],
37
+ "returns": "i32"
38
+ },
39
+ {
40
+ "name": "shim_prepare",
41
+ "symbol": "shim_prepare",
42
+ "params": ["pointer", "string"],
43
+ "returns": "pointer"
44
+ },
45
+ { "name": "shim_step", "symbol": "shim_step", "params": ["pointer"], "returns": "i32" },
46
+ { "name": "shim_reset", "symbol": "shim_reset", "params": ["pointer"], "returns": "i32" },
47
+ { "name": "shim_finalize", "symbol": "shim_finalize", "params": ["pointer"], "returns": "i32" },
48
+ {
49
+ "name": "shim_clear_bindings",
50
+ "symbol": "shim_clear_bindings",
51
+ "params": ["pointer"],
52
+ "returns": "i32"
53
+ },
54
+ {
55
+ "name": "shim_stmt_readonly",
56
+ "symbol": "shim_stmt_readonly",
57
+ "params": ["pointer"],
58
+ "returns": "i32"
59
+ },
60
+ {
61
+ "name": "shim_expanded_sql",
62
+ "symbol": "shim_expanded_sql",
63
+ "params": ["pointer", "mutable-bytes"],
64
+ "returns": "i32"
65
+ },
66
+ {
67
+ "name": "shim_bind_count",
68
+ "symbol": "shim_bind_count",
69
+ "params": ["pointer"],
70
+ "returns": "i32"
71
+ },
72
+ {
73
+ "name": "shim_bind_index",
74
+ "symbol": "shim_bind_index",
75
+ "params": ["pointer", "string"],
76
+ "returns": "i32"
77
+ },
78
+ {
79
+ "name": "shim_bind_int",
80
+ "symbol": "shim_bind_int",
81
+ "params": ["pointer", "i32", "i64"],
82
+ "returns": "i32"
83
+ },
84
+ {
85
+ "name": "shim_bind_dbl",
86
+ "symbol": "shim_bind_dbl",
87
+ "params": ["pointer", "i32", "f64"],
88
+ "returns": "i32"
89
+ },
90
+ {
91
+ "name": "shim_bind_text",
92
+ "symbol": "shim_bind_text",
93
+ "params": ["pointer", "i32", "string"],
94
+ "returns": "i32"
95
+ },
96
+ {
97
+ "name": "shim_bind_blob",
98
+ "symbol": "shim_bind_blob",
99
+ "params": ["pointer", "i32", "bytes"],
100
+ "returns": "i32"
101
+ },
102
+ {
103
+ "name": "shim_bind_null",
104
+ "symbol": "shim_bind_null",
105
+ "params": ["pointer", "i32"],
106
+ "returns": "i32"
107
+ },
108
+ {
109
+ "name": "shim_column_count",
110
+ "symbol": "shim_column_count",
111
+ "params": ["pointer"],
112
+ "returns": "i32"
113
+ },
114
+ {
115
+ "name": "shim_column_name",
116
+ "symbol": "shim_column_name",
117
+ "params": ["pointer", "i32", "mutable-bytes"],
118
+ "returns": "i32"
119
+ },
120
+ {
121
+ "name": "shim_column_meta",
122
+ "symbol": "shim_column_meta",
123
+ "params": ["pointer", "i32", "i32", "mutable-bytes"],
124
+ "returns": "i32"
125
+ },
126
+ {
127
+ "name": "shim_column_type",
128
+ "symbol": "shim_column_type",
129
+ "params": ["pointer", "i32"],
130
+ "returns": "i32"
131
+ },
132
+ {
133
+ "name": "shim_column_int64",
134
+ "symbol": "shim_column_int64",
135
+ "params": ["pointer", "i32"],
136
+ "returns": "i64"
137
+ },
138
+ {
139
+ "name": "shim_column_dbl",
140
+ "symbol": "shim_column_dbl",
141
+ "params": ["pointer", "i32"],
142
+ "returns": "f64"
143
+ },
144
+ {
145
+ "name": "shim_column_text",
146
+ "symbol": "shim_column_text",
147
+ "params": ["pointer", "i32", "mutable-bytes"],
148
+ "returns": "i32"
149
+ },
150
+ {
151
+ "name": "shim_column_blob",
152
+ "symbol": "shim_column_blob",
153
+ "params": ["pointer", "i32", "mutable-bytes"],
154
+ "returns": "i32"
155
+ },
156
+ {
157
+ "name": "shim_last_insert_rowid",
158
+ "symbol": "shim_last_insert_rowid",
159
+ "params": ["pointer"],
160
+ "returns": "i64"
161
+ },
162
+ { "name": "shim_changes", "symbol": "shim_changes", "params": ["pointer"], "returns": "i32" }
163
+ ],
164
+ "libraries": ["../build/libsqlite3-shim.a"],
165
+ "system_libraries": ["m"]
166
+ }