@citadeldb/wasm 0.8.0 → 0.9.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.
package/README.md CHANGED
@@ -19,12 +19,24 @@ await init();
19
19
 
20
20
  const db = new CitadelDb("my-passphrase");
21
21
 
22
- // SQL
22
+ // Single statement
23
23
  db.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL);");
24
24
  db.execute("INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob');");
25
25
  const result = db.query("SELECT * FROM users;");
26
26
  // { columns: ["id", "name"], rows: [[1, "Alice"], [2, "Bob"]] }
27
27
 
28
+ // Multi-statement script — returns one outcome per statement
29
+ const outcomes = db.run(`
30
+ CREATE TABLE posts (id INTEGER PRIMARY KEY, title TEXT NOT NULL);
31
+ INSERT INTO posts VALUES (1, 'Hello'), (2, 'World');
32
+ SELECT * FROM posts;
33
+ `);
34
+ // [
35
+ // { type: "ok" },
36
+ // { type: "rowsAffected", value: 2 },
37
+ // { type: "query", columns: ["id", "title"], rows: [[1, "Hello"], [2, "World"]] }
38
+ // ]
39
+
28
40
  // Key-value
29
41
  db.put(new Uint8Array([1, 2, 3]), new Uint8Array([4, 5, 6]));
30
42
  const value = db.get(new Uint8Array([1, 2, 3]));
@@ -45,9 +57,10 @@ db.free();
45
57
  | Method | Description |
46
58
  |--------|-------------|
47
59
  | `new CitadelDb(passphrase)` | Create an in-memory encrypted database |
48
- | `execute(sql)` | Execute DDL/DML, returns rows affected |
49
- | `executeBatch(sql)` | Execute multiple statements |
50
- | `query(sql)` | Execute SELECT, returns `{ columns, rows }` |
60
+ | `execute(sql)` | Execute single DDL/DML statement, returns rows affected |
61
+ | `query(sql)` | Execute single SELECT, returns `{ columns, rows }` |
62
+ | `run(sql)` | Execute `;`-separated statements, returns `[{type, ...}, ...]` |
63
+ | `executeBatch(sql)` | Execute `;`-separated statements, discards results |
51
64
  | `put(key, value)` | Insert into default table |
52
65
  | `get(key)` | Get from default table |
53
66
  | `delete(key)` | Delete from default table |
@@ -59,11 +72,11 @@ db.free();
59
72
 
60
73
  ## SQL Support
61
74
 
62
- **Statements** - CREATE/DROP TABLE, ALTER TABLE (ADD/DROP/RENAME COLUMN, RENAME TABLE), CREATE/DROP INDEX, CREATE/DROP VIEW, INSERT (VALUES, SELECT), SELECT, UPDATE, DELETE, BEGIN/COMMIT/ROLLBACK, SAVEPOINT/RELEASE/ROLLBACK TO, EXPLAIN
75
+ **Statements** - CREATE/DROP TABLE, ALTER TABLE (ADD/DROP/RENAME COLUMN, RENAME TABLE), CREATE/DROP INDEX (UNIQUE + multi-column), CREATE/DROP VIEW, INSERT (VALUES, SELECT), SELECT, UPDATE, DELETE, BEGIN/COMMIT/ROLLBACK, SAVEPOINT/RELEASE/ROLLBACK TO, SET TIME ZONE, EXPLAIN
63
76
 
64
- **Constraints** - PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT, CHECK (column + table level), FOREIGN KEY (RESTRICT/NO ACTION)
77
+ **Constraints** - PRIMARY KEY, NOT NULL, UNIQUE (column + table level, inline or `CREATE UNIQUE INDEX`), DEFAULT, CHECK (column + table level), FOREIGN KEY (RESTRICT/NO ACTION)
65
78
 
66
- **Types** - INTEGER, REAL, TEXT, BLOB, BOOLEAN
79
+ **Types** - INTEGER, REAL, TEXT, BLOB, BOOLEAN, DATE, TIME, TIMESTAMP (with timezone), INTERVAL
67
80
 
68
81
  **Clauses** - JOINs (INNER, LEFT, RIGHT, CROSS), subqueries (scalar, IN, EXISTS, correlated), CTEs (WITH / WITH RECURSIVE), UNION/INTERSECT/EXCEPT [ALL], CASE, BETWEEN, LIKE, DISTINCT, GROUP BY/HAVING, ORDER BY, LIMIT/OFFSET
69
82
 
@@ -71,7 +84,19 @@ db.free();
71
84
 
72
85
  **Views** - CREATE/DROP VIEW, OR REPLACE, IF NOT EXISTS/IF EXISTS, column aliases, nested views
73
86
 
74
- **Functions** - COUNT, SUM, AVG, MIN, MAX, LENGTH, UPPER, LOWER, SUBSTR, ABS, ROUND, COALESCE, NULLIF, CAST, TYPEOF, HEX, TRIM, REPLACE, RANDOM, IIF, GLOB
87
+ **Scalar functions**
88
+ - Aggregate: COUNT, SUM, AVG, MIN, MAX
89
+ - String: LENGTH, UPPER, LOWER, SUBSTR/SUBSTRING, TRIM/LTRIM/RTRIM, REPLACE, INSTR, CONCAT, HEX
90
+ - Math: ABS, ROUND, CEIL/CEILING, FLOOR, SIGN, SQRT, RANDOM
91
+ - Conditional: COALESCE, NULLIF, IIF, CAST, TYPEOF
92
+
93
+ **Date / Time functions**
94
+ - Current: NOW, CURRENT_DATE, CURRENT_TIME/LOCALTIME, CURRENT_TIMESTAMP/LOCALTIMESTAMP, CLOCK_TIMESTAMP, STATEMENT_TIMESTAMP, TRANSACTION_TIMESTAMP
95
+ - Construction: MAKE_DATE, MAKE_TIME, MAKE_TIMESTAMP, MAKE_INTERVAL
96
+ - Extraction / truncation: EXTRACT, DATE_PART, DATEPART, DATE_TRUNC, DATE_BIN
97
+ - Conversion (SQLite-compatible): DATE, TIME, DATETIME, STRFTIME, JULIANDAY, UNIXEPOCH
98
+ - Arithmetic: AGE, TIMEDIFF, AT_TIMEZONE, JUSTIFY_DAYS, JUSTIFY_HOURS, JUSTIFY_INTERVAL, ISFINITE
99
+ - IANA zone support, BC dates, `+infinity`/`-infinity` sentinels, PG-normalized INTERVAL comparison
75
100
 
76
101
  **Prepared statements** - `$1, $2, ...` positional parameters with LRU statement cache
77
102
 
package/citadel_wasm.d.ts CHANGED
@@ -37,6 +37,11 @@ export class CitadelDb {
37
37
  * Returns `{ columns: string[], rows: any[][] }`.
38
38
  */
39
39
  query(sql: string): any;
40
+ /**
41
+ * Execute `;`-separated SQL statements. Returns an array of
42
+ * tagged outcome objects, one per statement.
43
+ */
44
+ run(sql: string): Array<any>;
40
45
  /**
41
46
  * Get database statistics.
42
47
  * Returns `{ entryCount: number, totalPages: number, treeDepth: number }`.
@@ -70,6 +75,7 @@ export interface InitOutput {
70
75
  readonly citadeldb_new: (a: number, b: number, c: number) => void;
71
76
  readonly citadeldb_put: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
72
77
  readonly citadeldb_query: (a: number, b: number, c: number, d: number) => void;
78
+ readonly citadeldb_run: (a: number, b: number, c: number, d: number) => void;
73
79
  readonly citadeldb_stats: (a: number, b: number) => void;
74
80
  readonly citadeldb_tableDelete: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
75
81
  readonly citadeldb_tableGet: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
package/citadel_wasm.js CHANGED
@@ -168,6 +168,29 @@ export class CitadelDb {
168
168
  wasm.__wbindgen_add_to_stack_pointer(16);
169
169
  }
170
170
  }
171
+ /**
172
+ * Execute `;`-separated SQL statements. Returns an array of
173
+ * tagged outcome objects, one per statement.
174
+ * @param {string} sql
175
+ * @returns {Array<any>}
176
+ */
177
+ run(sql) {
178
+ try {
179
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
180
+ const ptr0 = passStringToWasm0(sql, wasm.__wbindgen_export3, wasm.__wbindgen_export4);
181
+ const len0 = WASM_VECTOR_LEN;
182
+ wasm.citadeldb_run(retptr, this.__wbg_ptr, ptr0, len0);
183
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
184
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
185
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
186
+ if (r2) {
187
+ throw takeObject(r1);
188
+ }
189
+ return takeObject(r0);
190
+ } finally {
191
+ wasm.__wbindgen_add_to_stack_pointer(16);
192
+ }
193
+ }
171
194
  /**
172
195
  * Get database statistics.
173
196
  * Returns `{ entryCount: number, totalPages: number, treeDepth: number }`.
Binary file
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@citadeldb/wasm",
3
3
  "type": "module",
4
4
  "description": "WASM bindings for Citadel encrypted database",
5
- "version": "0.8.0",
5
+ "version": "0.9.0",
6
6
  "license": "MIT OR Apache-2.0",
7
7
  "repository": {
8
8
  "type": "git",