@vibesdotdev/localdb 0.0.2 → 1.0.0-rc.2
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/LICENSE +18 -0
- package/README.md +123 -2
- package/dist/cli/commands/_shared.consumer.d.ts +1 -3
- package/dist/cli/commands/_shared.consumer.d.ts.map +1 -1
- package/dist/cli/commands/_shared.consumer.js +1 -11
- package/dist/cli/commands/_shared.consumer.js.map +1 -1
- package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.descriptor.js +1 -1
- package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.descriptor.js.map +1 -1
- package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.d.ts +9 -3
- package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.d.ts.map +1 -1
- package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.js +59 -45
- package/dist/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.js.map +1 -1
- package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.descriptor.js +1 -1
- package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.descriptor.js.map +1 -1
- package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.d.ts +8 -3
- package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.d.ts.map +1 -1
- package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.js +12 -10
- package/dist/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.js.map +1 -1
- package/dist/cli/commands/pools/dev.localdb.pools.cli-command.descriptor.js +1 -1
- package/dist/cli/commands/pools/dev.localdb.pools.cli-command.descriptor.js.map +1 -1
- package/dist/cli/commands/pools/dev.localdb.pools.cli-command.impl.d.ts +6 -3
- package/dist/cli/commands/pools/dev.localdb.pools.cli-command.impl.d.ts.map +1 -1
- package/dist/cli/commands/pools/dev.localdb.pools.cli-command.impl.js +8 -7
- package/dist/cli/commands/pools/dev.localdb.pools.cli-command.impl.js.map +1 -1
- package/dist/cli/commands/query/dev.localdb.query.cli-command.descriptor.js +1 -1
- package/dist/cli/commands/query/dev.localdb.query.cli-command.descriptor.js.map +1 -1
- package/dist/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.d.ts +13 -3
- package/dist/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.d.ts.map +1 -1
- package/dist/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.js +66 -51
- package/dist/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.js.map +1 -1
- package/dist/cli/commands/status/dev.localdb.status.cli-command.descriptor.js +1 -1
- package/dist/cli/commands/status/dev.localdb.status.cli-command.descriptor.js.map +1 -1
- package/dist/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.d.ts +9 -3
- package/dist/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.d.ts.map +1 -1
- package/dist/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.js +41 -29
- package/dist/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.js.map +1 -1
- package/dist/cli/inputs.d.ts +25 -0
- package/dist/cli/inputs.d.ts.map +1 -0
- package/dist/cli/inputs.js +81 -0
- package/dist/cli/inputs.js.map +1 -0
- package/dist/cli/types.d.ts +45 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +14 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/core/connection-pool.d.ts +204 -46
- package/dist/core/connection-pool.d.ts.map +1 -1
- package/dist/core/connection-pool.js +610 -101
- package/dist/core/connection-pool.js.map +1 -1
- package/dist/core/database.d.ts +243 -63
- package/dist/core/database.d.ts.map +1 -1
- package/dist/core/database.js +937 -203
- package/dist/core/database.js.map +1 -1
- package/dist/core/holders.d.ts +15 -0
- package/dist/core/holders.d.ts.map +1 -0
- package/dist/core/holders.js +4 -0
- package/dist/core/holders.js.map +1 -0
- package/dist/core/host-kinds.d.ts +22 -0
- package/dist/core/host-kinds.d.ts.map +1 -0
- package/dist/core/host-kinds.js +52 -0
- package/dist/core/host-kinds.js.map +1 -0
- package/dist/core/live-runtime.d.ts +17 -0
- package/dist/core/live-runtime.d.ts.map +1 -0
- package/dist/core/live-runtime.js +28 -0
- package/dist/core/live-runtime.js.map +1 -0
- package/dist/core/migration-registry.d.ts +115 -80
- package/dist/core/migration-registry.d.ts.map +1 -1
- package/dist/core/migration-registry.js +340 -199
- package/dist/core/migration-registry.js.map +1 -1
- package/dist/core/open-connection.d.ts +11 -0
- package/dist/core/open-connection.d.ts.map +1 -0
- package/dist/core/open-connection.js +70 -0
- package/dist/core/open-connection.js.map +1 -0
- package/dist/core/outcome.d.ts +21 -0
- package/dist/core/outcome.d.ts.map +1 -0
- package/dist/core/outcome.js +22 -0
- package/dist/core/outcome.js.map +1 -0
- package/dist/core/pool-api.d.ts +19 -0
- package/dist/core/pool-api.d.ts.map +1 -0
- package/dist/core/pool-api.js +59 -0
- package/dist/core/pool-api.js.map +1 -0
- package/dist/core/slow-statement.d.ts +81 -0
- package/dist/core/slow-statement.d.ts.map +1 -0
- package/dist/core/slow-statement.js +149 -0
- package/dist/core/slow-statement.js.map +1 -0
- package/dist/core/wal-policy.d.ts +86 -0
- package/dist/core/wal-policy.d.ts.map +1 -0
- package/dist/core/wal-policy.js +115 -0
- package/dist/core/wal-policy.js.map +1 -0
- package/dist/dev.localdb.cli-group.descriptor.d.ts +1 -1
- package/dist/dev.localdb.cli-group.descriptor.d.ts.map +1 -1
- package/dist/dev.localdb.context.descriptor.d.ts +15 -1
- package/dist/dev.localdb.context.descriptor.d.ts.map +1 -1
- package/dist/dev.localdb.context.descriptor.js +1 -1
- package/dist/dev.localdb.context.descriptor.js.map +1 -1
- package/dist/dev.localdb.context.impl.consumer.d.ts +12 -5
- package/dist/dev.localdb.context.impl.consumer.d.ts.map +1 -1
- package/dist/dev.localdb.context.impl.consumer.js +14 -5
- package/dist/dev.localdb.context.impl.consumer.js.map +1 -1
- package/dist/driver/sqlite-driver.base.d.ts +107 -0
- package/dist/driver/sqlite-driver.base.d.ts.map +1 -0
- package/dist/driver/sqlite-driver.base.js +426 -0
- package/dist/driver/sqlite-driver.base.js.map +1 -0
- package/dist/driver/sqlite-driver.d.ts +154 -0
- package/dist/driver/sqlite-driver.d.ts.map +1 -0
- package/dist/driver/sqlite-driver.js +103 -0
- package/dist/driver/sqlite-driver.js.map +1 -0
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/localdb.client.descriptor.d.ts +10 -0
- package/dist/localdb.client.descriptor.d.ts.map +1 -0
- package/dist/localdb.client.descriptor.js +13 -0
- package/dist/localdb.client.descriptor.js.map +1 -0
- package/dist/localdb.client.impl.consumer.d.ts +11 -0
- package/dist/localdb.client.impl.consumer.d.ts.map +1 -0
- package/dist/localdb.client.impl.consumer.js +11 -0
- package/dist/localdb.client.impl.consumer.js.map +1 -0
- package/dist/localdb.plugin.d.ts +2 -2
- package/dist/localdb.plugin.d.ts.map +1 -1
- package/dist/localdb.plugin.js +58 -10
- package/dist/localdb.plugin.js.map +1 -1
- package/dist/location.d.ts +6 -0
- package/dist/location.d.ts.map +1 -0
- package/dist/location.js +6 -0
- package/dist/location.js.map +1 -0
- package/dist/migrations/load-sql.d.ts +25 -21
- package/dist/migrations/load-sql.d.ts.map +1 -1
- package/dist/migrations/load-sql.js +91 -76
- package/dist/migrations/load-sql.js.map +1 -1
- package/dist/pool.d.ts +3 -0
- package/dist/pool.d.ts.map +1 -0
- package/dist/pool.js +3 -0
- package/dist/pool.js.map +1 -0
- package/dist/schemas/api.d.ts +133 -59
- package/dist/schemas/api.d.ts.map +1 -1
- package/dist/schemas/api.js +1 -1
- package/dist/schemas/api.js.map +1 -1
- package/dist/schemas/migrations.d.ts +123 -0
- package/dist/schemas/migrations.d.ts.map +1 -0
- package/dist/schemas/migrations.js +55 -0
- package/dist/schemas/migrations.js.map +1 -0
- package/dist/schemas/pool.d.ts +27 -0
- package/dist/schemas/pool.d.ts.map +1 -0
- package/dist/schemas/pool.js +7 -0
- package/dist/schemas/pool.js.map +1 -0
- package/dist/schemas/sqlite-driver-base.d.ts +50 -0
- package/dist/schemas/sqlite-driver-base.d.ts.map +1 -0
- package/dist/schemas/sqlite-driver-base.js +2 -0
- package/dist/schemas/sqlite-driver-base.js.map +1 -0
- package/dist/testing/sqlite-driver-conformance.d.ts +42 -0
- package/dist/testing/sqlite-driver-conformance.d.ts.map +1 -0
- package/dist/testing/sqlite-driver-conformance.js +471 -0
- package/dist/testing/sqlite-driver-conformance.js.map +1 -0
- package/package.json +78 -104
- package/dist/core/error-context.d.ts +0 -2
- package/dist/core/error-context.d.ts.map +0 -1
- package/dist/core/error-context.js +0 -17
- package/dist/core/error-context.js.map +0 -1
- package/dist/core/runtime.d.ts +0 -3
- package/dist/core/runtime.d.ts.map +0 -1
- package/dist/core/runtime.js +0 -17
- package/dist/core/runtime.js.map +0 -1
- package/dist/localdb.cloud.plugin.d.ts +0 -17
- package/dist/localdb.cloud.plugin.d.ts.map +0 -1
- package/dist/localdb.cloud.plugin.js +0 -23
- package/dist/localdb.cloud.plugin.js.map +0 -1
- package/src/cli/commands/_shared.consumer.ts +0 -20
- package/src/cli/commands/migrate/dev.localdb.migrate.cli-command.descriptor.ts +0 -20
- package/src/cli/commands/migrate/dev.localdb.migrate.cli-command.impl.consumer.ts +0 -97
- package/src/cli/commands/namespaces/dev.localdb.namespaces.cli-command.descriptor.ts +0 -17
- package/src/cli/commands/namespaces/dev.localdb.namespaces.cli-command.impl.ts +0 -46
- package/src/cli/commands/pools/dev.localdb.pools.cli-command.descriptor.ts +0 -16
- package/src/cli/commands/pools/dev.localdb.pools.cli-command.impl.ts +0 -37
- package/src/cli/commands/query/dev.localdb.query.cli-command.descriptor.ts +0 -21
- package/src/cli/commands/query/dev.localdb.query.cli-command.impl.consumer.ts +0 -69
- package/src/cli/commands/status/dev.localdb.status.cli-command.descriptor.ts +0 -20
- package/src/cli/commands/status/dev.localdb.status.cli-command.impl.consumer.ts +0 -93
- package/src/core/connection-pool.ts +0 -240
- package/src/core/database.ts +0 -419
- package/src/core/error-context.ts +0 -19
- package/src/core/migration-registry.ts +0 -321
- package/src/core/runtime.ts +0 -17
- package/src/dev.localdb.cli-group.descriptor.ts +0 -20
- package/src/dev.localdb.context.descriptor.ts +0 -13
- package/src/dev.localdb.context.impl.consumer.ts +0 -12
- package/src/index.ts +0 -28
- package/src/localdb.cloud.plugin.ts +0 -24
- package/src/localdb.plugin.ts +0 -43
- package/src/migrations/atlas/001-initial-schema.sql +0 -173
- package/src/migrations/atlas/002-lang-server-fields.sql +0 -12
- package/src/migrations/atlas/003-config-id-dedup.sql +0 -31
- package/src/migrations/atlas/004-fix-on-conflict-constraints.sql +0 -25
- package/src/migrations/atlas/005-diagnostics.sql +0 -66
- package/src/migrations/atlas/006-diagnostic-summaries.sql +0 -65
- package/src/migrations/atlas/007-diagnostic-slice.sql +0 -83
- package/src/migrations/load-sql.ts +0 -133
- package/src/schemas/api.ts +0 -92
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The conformance matrix every `localdb/sqlite-driver` implementation passes
|
|
3
|
+
* (`./test-tooling/sqlite-driver-conformance`).
|
|
4
|
+
*
|
|
5
|
+
* Test tooling, host- and framework-neutral: each case throws a typed
|
|
6
|
+
* `sqlite-driver-conformance-failed` refusal on a broken promise, so each
|
|
7
|
+
* host's `bun:test` suite and a real-Node `node --test` run all execute the
|
|
8
|
+
* same cases against their own driver. `at(name)` returns an absolute path
|
|
9
|
+
* inside a fresh fixture directory the caller owns; `files` is the caller's
|
|
10
|
+
* host, for the facts a driver-neutral case cannot observe.
|
|
11
|
+
*/
|
|
12
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
13
|
+
import { SQLITE_DRIVER_REFUSALS } from "../driver/sqlite-driver.js";
|
|
14
|
+
/** A broken conformance promise, typed. */
|
|
15
|
+
export class SqliteDriverConformanceError extends CapabilityError {
|
|
16
|
+
constructor(message, options) {
|
|
17
|
+
super(`conformance: ${message}`, 'INTERNAL', {
|
|
18
|
+
reason: 'sqlite-driver-conformance-failed',
|
|
19
|
+
retryable: false,
|
|
20
|
+
cause: options?.cause
|
|
21
|
+
});
|
|
22
|
+
this.name = 'SqliteDriverConformanceError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function check(condition, message) {
|
|
26
|
+
if (!condition)
|
|
27
|
+
throw new SqliteDriverConformanceError(message);
|
|
28
|
+
}
|
|
29
|
+
function isList(value) {
|
|
30
|
+
return Array.isArray(value);
|
|
31
|
+
}
|
|
32
|
+
/** A row, run result or details object: any object that is neither a list nor bytes. */
|
|
33
|
+
function isRecord(value) {
|
|
34
|
+
return value instanceof Object && !isList(value) && !(value instanceof Uint8Array);
|
|
35
|
+
}
|
|
36
|
+
/** Strict structural equality: `Object.is` leaves, same prototypes, same own enumerable keys, arrays and bytes element by element. */
|
|
37
|
+
function deepStrictEqual(actual, expected) {
|
|
38
|
+
if (Object.is(actual, expected))
|
|
39
|
+
return true;
|
|
40
|
+
if (actual instanceof Uint8Array || expected instanceof Uint8Array) {
|
|
41
|
+
return actual instanceof Uint8Array && expected instanceof Uint8Array &&
|
|
42
|
+
actual.byteLength === expected.byteLength && actual.every((byte, index) => byte === expected[index]);
|
|
43
|
+
}
|
|
44
|
+
if (isList(actual) || isList(expected)) {
|
|
45
|
+
return isList(actual) && isList(expected) &&
|
|
46
|
+
actual.length === expected.length && actual.every((item, index) => deepStrictEqual(item, expected[index]));
|
|
47
|
+
}
|
|
48
|
+
if (!isRecord(actual) || !isRecord(expected))
|
|
49
|
+
return false;
|
|
50
|
+
if (Object.getPrototypeOf(actual) !== Object.getPrototypeOf(expected))
|
|
51
|
+
return false;
|
|
52
|
+
const actualKeys = Object.keys(actual);
|
|
53
|
+
const expectedKeys = Object.keys(expected);
|
|
54
|
+
if (actualKeys.length !== expectedKeys.length)
|
|
55
|
+
return false;
|
|
56
|
+
return actualKeys.every((key) => Object.hasOwn(expected, key) && deepStrictEqual(actual[key], expected[key]));
|
|
57
|
+
}
|
|
58
|
+
function same(actual, expected, message) {
|
|
59
|
+
check(deepStrictEqual(actual, expected), message);
|
|
60
|
+
}
|
|
61
|
+
/** The typed refusal `run` raises; anything else (no throw, another error) fails the case. */
|
|
62
|
+
export function refusalOf(run) {
|
|
63
|
+
try {
|
|
64
|
+
run();
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error instanceof CapabilityError)
|
|
68
|
+
return error;
|
|
69
|
+
throw new SqliteDriverConformanceError('expected a CapabilityError', { cause: error });
|
|
70
|
+
}
|
|
71
|
+
throw new SqliteDriverConformanceError('expected the call to refuse');
|
|
72
|
+
}
|
|
73
|
+
function refuses(run, reason, message) {
|
|
74
|
+
const refusal = refusalOf(run);
|
|
75
|
+
check(refusal.reason === reason, `${message}: expected ${reason}, got ${refusal.reason}`);
|
|
76
|
+
check(refusal.cause === undefined, `${message}: driver refusal carries a raw cause`);
|
|
77
|
+
return refusal;
|
|
78
|
+
}
|
|
79
|
+
/** Every case. */
|
|
80
|
+
export const sqliteDriverConformance = [
|
|
81
|
+
{
|
|
82
|
+
name: 'opens a file, runs statements, and reads rows as plain objects',
|
|
83
|
+
run(driver, at) {
|
|
84
|
+
const db = driver.open(at('rows.db'));
|
|
85
|
+
try {
|
|
86
|
+
same(db.path, at('rows.db'), 'path');
|
|
87
|
+
db.exec('CREATE TABLE notes (id INTEGER PRIMARY KEY, body TEXT, data BLOB)');
|
|
88
|
+
const insert = db.prepare('INSERT INTO notes (body, data) VALUES (?, ?)');
|
|
89
|
+
same(insert.run('first', new Uint8Array([1, 2])), { changes: 1, lastInsertRowid: 1 }, 'run result');
|
|
90
|
+
insert.run('second', null);
|
|
91
|
+
const rows = db.prepare('SELECT id, body FROM notes ORDER BY id').all();
|
|
92
|
+
same(rows, [{ id: 1, body: 'first' }, { id: 2, body: 'second' }], 'all');
|
|
93
|
+
check(rows.every((row) => Object.getPrototypeOf(row) === Object.prototype), 'rows are plain objects');
|
|
94
|
+
same(db.prepare('SELECT body FROM notes WHERE id = ?').get(2), { body: 'second' }, 'get');
|
|
95
|
+
const blob = db.prepare('SELECT data FROM notes WHERE id = 1').get()?.data;
|
|
96
|
+
check(blob instanceof Uint8Array && blob.length === 2 && blob[1] === 2, 'blobs read back as bytes');
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
db.close();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'get answers null, never undefined, when there is no row',
|
|
105
|
+
run(driver) {
|
|
106
|
+
const db = driver.open(':memory:');
|
|
107
|
+
try {
|
|
108
|
+
check(db.prepare('SELECT 1 AS one WHERE 0').get() === null, 'no row is null');
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
db.close();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'binds bigint and copies bytes at bind time',
|
|
117
|
+
run(driver) {
|
|
118
|
+
const db = driver.open(':memory:');
|
|
119
|
+
try {
|
|
120
|
+
db.exec('CREATE TABLE t (n INTEGER, b BLOB)');
|
|
121
|
+
const bytes = new Uint8Array([7]);
|
|
122
|
+
db.prepare('INSERT INTO t VALUES (?, ?)').run(9007199254740993n, bytes);
|
|
123
|
+
bytes[0] = 0;
|
|
124
|
+
const row = db.prepare('SELECT CAST(n AS TEXT) AS n, b FROM t').get();
|
|
125
|
+
same(row?.n, '9007199254740993', 'bigint binds exactly');
|
|
126
|
+
const stored = row?.b;
|
|
127
|
+
check(stored instanceof Uint8Array && stored[0] === 7, 'bytes were copied when bound');
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
db.close();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: 'binds booleans as 1 and 0, as SQLite stores them',
|
|
136
|
+
run(driver) {
|
|
137
|
+
const db = driver.open(':memory:');
|
|
138
|
+
try {
|
|
139
|
+
same(db.prepare('SELECT ? AS yes, ? AS no').get(true, false), { yes: 1, no: 0 }, 'booleans');
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
db.close();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: 'an immediate transaction takes the write lock at BEGIN',
|
|
148
|
+
run(driver, at) {
|
|
149
|
+
const first = driver.open(at('immediate.db'));
|
|
150
|
+
const second = driver.open(at('immediate.db'));
|
|
151
|
+
try {
|
|
152
|
+
first.exec('PRAGMA journal_mode = WAL; CREATE TABLE t (a)');
|
|
153
|
+
first.transaction(() => {
|
|
154
|
+
// Another connection cannot take the write lock while this transaction holds it, before any write.
|
|
155
|
+
refuses(() => second.exec('BEGIN IMMEDIATE'), SQLITE_DRIVER_REFUSALS.busy, 'held at BEGIN');
|
|
156
|
+
}, { immediate: true });
|
|
157
|
+
second.exec('BEGIN IMMEDIATE');
|
|
158
|
+
second.exec('ROLLBACK');
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
second.close();
|
|
162
|
+
first.close();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: 'applies no pragma of its own: foreign keys are off and double-quoted literals are accepted',
|
|
168
|
+
run(driver) {
|
|
169
|
+
const db = driver.open(':memory:');
|
|
170
|
+
try {
|
|
171
|
+
same(db.prepare('PRAGMA foreign_keys').get(), { foreign_keys: 0 }, 'foreign_keys default');
|
|
172
|
+
same(db.prepare('PRAGMA busy_timeout').get(), { timeout: 0 }, 'busy_timeout default');
|
|
173
|
+
same(db.prepare('SELECT "literal" AS v').get(), { v: 'literal' }, 'double-quoted literal');
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
db.close();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: 'runs WAL pragmas and answers wal_checkpoint as { busy, log, checkpointed }',
|
|
182
|
+
run(driver, at) {
|
|
183
|
+
const db = driver.open(at('wal.db'));
|
|
184
|
+
try {
|
|
185
|
+
same(db.prepare('PRAGMA journal_mode = WAL').get(), { journal_mode: 'wal' }, 'journal_mode');
|
|
186
|
+
db.exec('CREATE TABLE t (a); INSERT INTO t VALUES (1)');
|
|
187
|
+
const outcome = db.prepare('PRAGMA wal_checkpoint(TRUNCATE)').get();
|
|
188
|
+
check(outcome !== null && Object.keys(outcome).join(',') === 'busy,log,checkpointed', 'checkpoint row shape');
|
|
189
|
+
same(outcome?.busy, 0, 'checkpoint not busy');
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
db.close();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
name: 'a transaction commits, rolls back on a throw, nests with savepoints and reports inTransaction',
|
|
198
|
+
run(driver) {
|
|
199
|
+
const db = driver.open(':memory:');
|
|
200
|
+
try {
|
|
201
|
+
db.exec('CREATE TABLE t (a INTEGER)');
|
|
202
|
+
const insert = db.prepare('INSERT INTO t VALUES (?)');
|
|
203
|
+
const value = db.transaction(() => {
|
|
204
|
+
check(db.inTransaction, 'inside a transaction');
|
|
205
|
+
insert.run(1);
|
|
206
|
+
const inner = refusalOf(() => db.transaction(() => {
|
|
207
|
+
insert.run(2);
|
|
208
|
+
throw new CapabilityError('inner', 'INTERNAL', { reason: 'conformance-inner' });
|
|
209
|
+
}));
|
|
210
|
+
same(inner.reason, 'conformance-inner', 'inner failure reaches the caller');
|
|
211
|
+
check(db.inTransaction, 'the outer transaction survives an inner rollback');
|
|
212
|
+
return 'done';
|
|
213
|
+
});
|
|
214
|
+
same(value, 'done', 'transaction returns the body value');
|
|
215
|
+
check(!db.inTransaction, 'committed');
|
|
216
|
+
refusalOf(() => db.transaction(() => {
|
|
217
|
+
insert.run(3);
|
|
218
|
+
throw new CapabilityError('outer', 'INTERNAL', { reason: 'conformance-outer' });
|
|
219
|
+
}));
|
|
220
|
+
check(!db.inTransaction, 'rolled back');
|
|
221
|
+
same(db.prepare('SELECT a FROM t ORDER BY a').all(), [{ a: 1 }], 'only the committed row remains');
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
db.close();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
name: 'an asynchronous transaction body is rolled back and refused',
|
|
230
|
+
run(driver) {
|
|
231
|
+
const db = driver.open(':memory:');
|
|
232
|
+
try {
|
|
233
|
+
db.exec('CREATE TABLE t (a INTEGER)');
|
|
234
|
+
refuses(() => db.transaction(() => {
|
|
235
|
+
db.prepare('INSERT INTO t VALUES (1)').run();
|
|
236
|
+
return Promise.resolve();
|
|
237
|
+
}), SQLITE_DRIVER_REFUSALS.transactionAsync, 'async body');
|
|
238
|
+
check(!db.inTransaction, 'rolled back');
|
|
239
|
+
same(db.prepare('SELECT count(*) AS n FROM t').get(), { n: 0 }, 'nothing committed');
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
db.close();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
name: 'a failing statement is cause-free sqlite-statement-failed with the primary result code',
|
|
248
|
+
run(driver) {
|
|
249
|
+
const db = driver.open(':memory:');
|
|
250
|
+
try {
|
|
251
|
+
db.exec('CREATE TABLE t (a UNIQUE)');
|
|
252
|
+
db.exec('INSERT INTO t VALUES (1)');
|
|
253
|
+
const refusal = refuses(() => db.exec('INSERT INTO t VALUES (1)'), SQLITE_DRIVER_REFUSALS.statementFailed, 'constraint');
|
|
254
|
+
same(refusal.code, 'INTERNAL', 'code');
|
|
255
|
+
same(refusal.details?.errcode, 19, 'SQLITE_CONSTRAINT primary code');
|
|
256
|
+
same(refusal.details?.condition, 'unique-constraint', 'the fixed condition owners branch on');
|
|
257
|
+
check(refusal.cause === undefined, 'host error is not carried as cause');
|
|
258
|
+
refuses(() => db.prepare('SELEC 1'), SQLITE_DRIVER_REFUSALS.statementFailed, 'syntax');
|
|
259
|
+
}
|
|
260
|
+
finally {
|
|
261
|
+
db.close();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: 'a refusal never repeats the statement or carries the raw host error',
|
|
267
|
+
run(driver) {
|
|
268
|
+
const canary = 'canary-7f3a91c2';
|
|
269
|
+
const db = driver.open(':memory:');
|
|
270
|
+
try {
|
|
271
|
+
const statements = [
|
|
272
|
+
[`SELECT '${canary}' FROM`, 'syntax-error'],
|
|
273
|
+
[`SELECT * FROM "${canary}"`, 'missing-table'],
|
|
274
|
+
[`INSERT INTO ${canary.replaceAll('-', '_')} VALUES (1)`, 'missing-table']
|
|
275
|
+
];
|
|
276
|
+
for (const [sql, condition] of statements) {
|
|
277
|
+
const refusal = refuses(() => db.prepare(sql).all(), SQLITE_DRIVER_REFUSALS.statementFailed, 'canary statement');
|
|
278
|
+
same(refusal.details?.condition, condition, `condition for ${condition}`);
|
|
279
|
+
const exposed = JSON.stringify({
|
|
280
|
+
message: refusal.message,
|
|
281
|
+
code: refusal.code,
|
|
282
|
+
reason: refusal.reason,
|
|
283
|
+
retryable: refusal.retryable,
|
|
284
|
+
details: refusal.details,
|
|
285
|
+
cause: refusal.cause
|
|
286
|
+
});
|
|
287
|
+
check(!exposed.includes(canary.slice(0, 6)) && !exposed.includes(canary.replaceAll('-', '_')), 'refusal leaks the statement');
|
|
288
|
+
check(!String(refusal).includes(canary.slice(0, 15)), 'the rendered refusal leaks the statement');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
finally {
|
|
292
|
+
db.close();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
name: 'each failure condition is classified from the result code: primary-key and unique collisions, missing column, existing object',
|
|
298
|
+
run(driver) {
|
|
299
|
+
const db = driver.open(':memory:');
|
|
300
|
+
try {
|
|
301
|
+
db.exec('CREATE TABLE p (id TEXT PRIMARY KEY, label TEXT UNIQUE)');
|
|
302
|
+
db.prepare('INSERT INTO p VALUES (?, ?)').run('k', 'a');
|
|
303
|
+
const cases = [
|
|
304
|
+
['INSERT INTO p VALUES (\'k\', \'b\')', 'unique-constraint', 'primary-key collision'],
|
|
305
|
+
['INSERT INTO p VALUES (\'other\', \'a\')', 'unique-constraint', 'unique collision'],
|
|
306
|
+
['SELECT nope FROM p', 'missing-column', 'missing column'],
|
|
307
|
+
['CREATE TABLE p (id TEXT)', 'already-exists', 'existing table'],
|
|
308
|
+
['SELECT * FROM never_created', 'missing-table', 'missing table']
|
|
309
|
+
];
|
|
310
|
+
for (const [sql, condition, label] of cases) {
|
|
311
|
+
const refusal = refuses(() => db.exec(sql), SQLITE_DRIVER_REFUSALS.statementFailed, label);
|
|
312
|
+
same(refusal.details?.condition, condition, label);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
db.close();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
name: 'a trigger RAISE is never classified from its text, whatever it says',
|
|
322
|
+
run(driver) {
|
|
323
|
+
const db = driver.open(':memory:');
|
|
324
|
+
try {
|
|
325
|
+
db.exec("CREATE TABLE t (a); CREATE TRIGGER tr BEFORE INSERT ON t BEGIN SELECT RAISE(ABORT, 'table t already exists'); END");
|
|
326
|
+
const raised = refuses(() => db.exec('INSERT INTO t VALUES (1)'), SQLITE_DRIVER_REFUSALS.statementFailed, 'raise');
|
|
327
|
+
same(raised.details?.condition, undefined, 'a RAISE carries no condition');
|
|
328
|
+
same(raised.details?.errcode, 19, 'it is a constraint result');
|
|
329
|
+
db.exec("CREATE TABLE u (a); CREATE TRIGGER tu BEFORE INSERT ON u BEGIN SELECT RAISE(ABORT, 'UNIQUE constraint failed: u.a'); END");
|
|
330
|
+
const mimic = refuses(() => db.exec('INSERT INTO u VALUES (1)'), SQLITE_DRIVER_REFUSALS.statementFailed, 'raise mimic');
|
|
331
|
+
same(mimic.details?.condition, undefined, 'a RAISE worded as a unique collision is not one');
|
|
332
|
+
}
|
|
333
|
+
finally {
|
|
334
|
+
db.close();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
name: 'a write a second connection blocks is typed sqlite-busy and retryable',
|
|
340
|
+
run(driver, at) {
|
|
341
|
+
const first = driver.open(at('busy.db'));
|
|
342
|
+
const second = driver.open(at('busy.db'));
|
|
343
|
+
try {
|
|
344
|
+
first.exec('PRAGMA journal_mode = WAL; CREATE TABLE t (a)');
|
|
345
|
+
first.exec('BEGIN IMMEDIATE');
|
|
346
|
+
const refusal = refuses(() => second.exec('BEGIN IMMEDIATE'), SQLITE_DRIVER_REFUSALS.busy, 'busy');
|
|
347
|
+
same(refusal.code, 'CONFLICT', 'code');
|
|
348
|
+
check(refusal.retryable, 'retryable');
|
|
349
|
+
same(refusal.details?.errcode, 5, 'SQLITE_BUSY');
|
|
350
|
+
same(refusal.message, 'SQLite is busy: another connection holds the lock.', 'the busy message is fixed text');
|
|
351
|
+
check(!refusal.message.includes('locked'), 'the busy message never repeats SQLite text');
|
|
352
|
+
first.exec('ROLLBACK');
|
|
353
|
+
}
|
|
354
|
+
finally {
|
|
355
|
+
second.close();
|
|
356
|
+
first.close();
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
name: 'create: false refuses a missing file without creating it; readonly refuses writes',
|
|
362
|
+
run(driver, at) {
|
|
363
|
+
refuses(() => driver.open(at('absent.db'), { create: false }), SQLITE_DRIVER_REFUSALS.databaseMissing, 'missing');
|
|
364
|
+
refuses(() => driver.open(at('absent.db'), { create: false, readonly: true }), SQLITE_DRIVER_REFUSALS.databaseMissing, 'missing ro');
|
|
365
|
+
const created = driver.open(at('present.db'));
|
|
366
|
+
created.exec('CREATE TABLE t (a)');
|
|
367
|
+
created.close();
|
|
368
|
+
const reopened = driver.open(at('present.db'), { create: false });
|
|
369
|
+
reopened.close();
|
|
370
|
+
const readonly = driver.open(at('present.db'), { readonly: true });
|
|
371
|
+
try {
|
|
372
|
+
refuses(() => readonly.exec('INSERT INTO t VALUES (1)'), SQLITE_DRIVER_REFUSALS.statementFailed, 'readonly write');
|
|
373
|
+
}
|
|
374
|
+
finally {
|
|
375
|
+
readonly.close();
|
|
376
|
+
}
|
|
377
|
+
const again = refusalOf(() => driver.open(at('absent.db'), { create: false }));
|
|
378
|
+
same(again.code, 'NOT_FOUND', 'still missing, never created');
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
name: 'a file that cannot be opened is typed sqlite-open-failed',
|
|
383
|
+
run(driver, at) {
|
|
384
|
+
const refusal = refuses(() => driver.open(at('no-such-dir/x.db')), SQLITE_DRIVER_REFUSALS.openFailed, 'open failed');
|
|
385
|
+
same(refusal.code, 'UNAVAILABLE', 'code');
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
name: 'close is idempotent; any call after close is sqlite-connection-closed',
|
|
390
|
+
run(driver) {
|
|
391
|
+
const db = driver.open(':memory:');
|
|
392
|
+
const statement = db.prepare('SELECT 1 AS one');
|
|
393
|
+
db.close();
|
|
394
|
+
db.close();
|
|
395
|
+
check(!db.inTransaction, 'a closed connection is in no transaction');
|
|
396
|
+
refuses(() => db.exec('SELECT 1'), SQLITE_DRIVER_REFUSALS.connectionClosed, 'exec');
|
|
397
|
+
refuses(() => db.prepare('SELECT 1'), SQLITE_DRIVER_REFUSALS.connectionClosed, 'prepare');
|
|
398
|
+
refuses(() => db.transaction(() => 1), SQLITE_DRIVER_REFUSALS.connectionClosed, 'transaction');
|
|
399
|
+
refuses(() => statement.get(), SQLITE_DRIVER_REFUSALS.connectionClosed, 'statement');
|
|
400
|
+
}
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
name: 'hostile open input, parameters and SQL refuse typed through the shared guards',
|
|
404
|
+
run(driver) {
|
|
405
|
+
const revoked = Proxy.revocable({}, {});
|
|
406
|
+
revoked.revoke();
|
|
407
|
+
const throwing = Object.defineProperty({}, 'create', { get: () => { throw new Error('getter'); }, enumerable: true });
|
|
408
|
+
const untypedDriver = driver;
|
|
409
|
+
const requests = [
|
|
410
|
+
[42, undefined],
|
|
411
|
+
['', undefined],
|
|
412
|
+
[' ', undefined],
|
|
413
|
+
['relative.db', undefined],
|
|
414
|
+
['/tmp/nul\0.db', undefined],
|
|
415
|
+
[revoked.proxy, undefined],
|
|
416
|
+
[':memory:', revoked.proxy],
|
|
417
|
+
[':memory:', throwing],
|
|
418
|
+
[':memory:', { create: 'yes' }],
|
|
419
|
+
[':memory:', 'options']
|
|
420
|
+
];
|
|
421
|
+
for (const [index, [path, options]] of requests.entries()) {
|
|
422
|
+
refuses(() => untypedDriver.open(path, options), SQLITE_DRIVER_REFUSALS.openInvalid, `open request ${index}`);
|
|
423
|
+
}
|
|
424
|
+
const db = driver.open(':memory:');
|
|
425
|
+
try {
|
|
426
|
+
const untypedDb = db;
|
|
427
|
+
const select = untypedDb.prepare('SELECT ? AS v');
|
|
428
|
+
const bytesProxy = new Proxy(new Uint8Array([1]), {});
|
|
429
|
+
for (const [index, value] of [undefined, {}, [], Symbol('s'), () => 1, bytesProxy, Number.NaN, Number.POSITIVE_INFINITY].entries()) {
|
|
430
|
+
refuses(() => select.get(value), SQLITE_DRIVER_REFUSALS.bindingInvalid, `binding ${index}`);
|
|
431
|
+
}
|
|
432
|
+
refuses(() => untypedDb.exec(42), SQLITE_DRIVER_REFUSALS.sqlInvalid, 'sql');
|
|
433
|
+
refuses(() => untypedDb.prepare(revoked.proxy), SQLITE_DRIVER_REFUSALS.sqlInvalid, 'sql proxy');
|
|
434
|
+
}
|
|
435
|
+
finally {
|
|
436
|
+
db.close();
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
];
|
|
441
|
+
/**
|
|
442
|
+
* A closed connection releases its file at once, even after prepared
|
|
443
|
+
* statements ran: the set renamed aside reopens. LocalDB's recovery and
|
|
444
|
+
* `resetDatabase()` archive a database this way. Run by the Bun host's suite and
|
|
445
|
+
* by the Node host under real Node; Bun's `node:sqlite` holds a closed file
|
|
446
|
+
* until its statements are collected, so the Node driver's Bun-run suite
|
|
447
|
+
* leaves this case out.
|
|
448
|
+
*/
|
|
449
|
+
export const closeReleasesFileCase = {
|
|
450
|
+
name: 'a closed connection releases its file: the set renamed aside reopens',
|
|
451
|
+
run(driver, at, files) {
|
|
452
|
+
const db = driver.open(at('release.db'));
|
|
453
|
+
db.exec('PRAGMA journal_mode = WAL; CREATE TABLE t (a)');
|
|
454
|
+
db.prepare('INSERT INTO t VALUES (?)').run(1);
|
|
455
|
+
same(db.prepare('SELECT a FROM t').get(), { a: 1 }, 'read before close');
|
|
456
|
+
db.close();
|
|
457
|
+
files.rename(at('release.db'), at('release-archived.db'));
|
|
458
|
+
for (const sidecar of ['-wal', '-shm']) {
|
|
459
|
+
if (files.exists(at(`release.db${sidecar}`)))
|
|
460
|
+
files.rename(at(`release.db${sidecar}`), at(`release-archived.db${sidecar}`));
|
|
461
|
+
}
|
|
462
|
+
const archived = driver.open(at('release-archived.db'), { create: false });
|
|
463
|
+
try {
|
|
464
|
+
same(archived.prepare('SELECT count(*) AS n FROM t').get(), { n: 1 }, 'archived set keeps its row');
|
|
465
|
+
}
|
|
466
|
+
finally {
|
|
467
|
+
archived.close();
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
};
|
|
471
|
+
//# sourceMappingURL=sqlite-driver-conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-driver-conformance.js","sourceRoot":"","sources":["../../src/testing/sqlite-driver-conformance.ts"],"names":[],"mappings":"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"}
|