@visorcraft/mongreldb-kit 0.7.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.
Files changed (65) hide show
  1. package/dist/constraints.d.ts +35 -0
  2. package/dist/constraints.d.ts.map +1 -0
  3. package/dist/constraints.js +404 -0
  4. package/dist/constraints.js.map +1 -0
  5. package/dist/db.d.ts +135 -0
  6. package/dist/db.d.ts.map +1 -0
  7. package/dist/db.js +495 -0
  8. package/dist/db.js.map +1 -0
  9. package/dist/defaults.d.ts +26 -0
  10. package/dist/defaults.d.ts.map +1 -0
  11. package/dist/defaults.js +56 -0
  12. package/dist/defaults.js.map +1 -0
  13. package/dist/errors.d.ts +54 -0
  14. package/dist/errors.d.ts.map +1 -0
  15. package/dist/errors.js +104 -0
  16. package/dist/errors.js.map +1 -0
  17. package/dist/index.d.ts +13 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +13 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/internalTables.d.ts +63 -0
  22. package/dist/internalTables.d.ts.map +1 -0
  23. package/dist/internalTables.js +60 -0
  24. package/dist/internalTables.js.map +1 -0
  25. package/dist/keys.d.ts +7 -0
  26. package/dist/keys.d.ts.map +1 -0
  27. package/dist/keys.js +84 -0
  28. package/dist/keys.js.map +1 -0
  29. package/dist/migrate.d.ts +132 -0
  30. package/dist/migrate.d.ts.map +1 -0
  31. package/dist/migrate.js +1004 -0
  32. package/dist/migrate.js.map +1 -0
  33. package/dist/packing.d.ts +12 -0
  34. package/dist/packing.d.ts.map +1 -0
  35. package/dist/packing.js +137 -0
  36. package/dist/packing.js.map +1 -0
  37. package/dist/query.d.ts +423 -0
  38. package/dist/query.d.ts.map +1 -0
  39. package/dist/query.js +1645 -0
  40. package/dist/query.js.map +1 -0
  41. package/dist/remote.d.ts +29 -0
  42. package/dist/remote.d.ts.map +1 -0
  43. package/dist/remote.js +42 -0
  44. package/dist/remote.js.map +1 -0
  45. package/dist/rows.d.ts +5 -0
  46. package/dist/rows.d.ts.map +1 -0
  47. package/dist/rows.js +38 -0
  48. package/dist/rows.js.map +1 -0
  49. package/dist/schema.d.ts +91 -0
  50. package/dist/schema.d.ts.map +1 -0
  51. package/dist/schema.js +206 -0
  52. package/dist/schema.js.map +1 -0
  53. package/dist/tsv.d.ts +4 -0
  54. package/dist/tsv.d.ts.map +1 -0
  55. package/dist/tsv.js +102 -0
  56. package/dist/tsv.js.map +1 -0
  57. package/dist/types.d.ts +99 -0
  58. package/dist/types.d.ts.map +1 -0
  59. package/dist/types.js +2 -0
  60. package/dist/types.js.map +1 -0
  61. package/dist/validation.d.ts +3 -0
  62. package/dist/validation.d.ts.map +1 -0
  63. package/dist/validation.js +98 -0
  64. package/dist/validation.js.map +1 -0
  65. package/package.json +50 -0
@@ -0,0 +1,35 @@
1
+ import type { Database as NativeDatabase, Transaction, Cell, RowJs } from '@visorcraft/mongreldb/native.js';
2
+ import type { Schema } from './schema.js';
3
+ import type { TableSpec, PkValue } from './types.js';
4
+ export interface ConstraintKit {
5
+ db: MongrelDatabase;
6
+ schema: Schema;
7
+ }
8
+ type MongrelDatabase = NativeDatabase & {
9
+ transaction(fn: (txn: Transaction) => void | Promise<void>, opts?: {
10
+ maxRetries?: number;
11
+ baseDelayMs?: number;
12
+ }): Promise<bigint>;
13
+ };
14
+ /** True when some table in the schema has a foreign key referencing `tableName`. */
15
+ export declare function isReferencedTable(schema: Schema, tableName: string): boolean;
16
+ export declare function toCells(table: TableSpec, row: Record<string, unknown>): Cell[];
17
+ export declare function findByPk(db: NativeDatabase, table: TableSpec, pkValue: PkValue): RowJs | null;
18
+ export declare function pkValueFromRow(table: TableSpec, row: Record<string, unknown>): PkValue;
19
+ export declare function pkValuesEqual(a: PkValue, b: PkValue): boolean;
20
+ export declare function stageUniqueGuards(kit: ConstraintKit, txn: Transaction, table: TableSpec, row: Record<string, unknown>, pkValue: PkValue): void;
21
+ export declare function stagePkGuard(kit: ConstraintKit, txn: Transaction, table: TableSpec, pkValue: PkValue, pkExplicit: boolean, pkSeen?: Set<string>): void;
22
+ export declare function deletePkGuard(kit: ConstraintKit, txn: Transaction, table: TableSpec, pkValue: PkValue): void;
23
+ export declare function deleteUniqueGuards(kit: ConstraintKit, txn: Transaction, table: TableSpec, pkValue: PkValue, onlyConstraints?: string[]): void;
24
+ export declare function touchRowGuard(kit: ConstraintKit, txn: Transaction, tableName: string, pkValue: PkValue): void;
25
+ export declare function deleteRowGuard(kit: ConstraintKit, txn: Transaction, tableName: string, pkValue: PkValue): void;
26
+ export declare function parentExists(kit: ConstraintKit, tableName: string, pkValue: PkValue): boolean;
27
+ export declare function enforceForeignKeys(kit: ConstraintKit, txn: Transaction, table: TableSpec, row: Record<string, unknown>): void;
28
+ export declare function planDelete(kit: ConstraintKit, txn: Transaction, table: TableSpec, pkValue: PkValue, known?: {
29
+ row: Record<string, unknown>;
30
+ rowId: bigint;
31
+ }): void;
32
+ /** Delete every Kit guard row owned by `tableName` (used by `truncateTable`). */
33
+ export declare function deleteGuardsForTable(kit: ConstraintKit, txn: Transaction, tableName: string): void;
34
+ export {};
35
+ //# sourceMappingURL=constraints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints.d.ts","sourceRoot":"","sources":["../src/constraints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,404 @@
1
+ import { validateRow } from './validation.js';
2
+ import { kitUniqueKeys, kitRowGuards } from './internalTables.js';
3
+ import { KitDuplicateError, KitForeignKeyError, KitNotFoundError, KitRestrictError, KitError } from './errors.js';
4
+ import { KIT_KEY_VERSION, encodedPk, encodeRowGuardKey, encodeUniqueKey } from './keys.js';
5
+ import { cellValue, rowFromRowJs } from './rows.js';
6
+ function columnId(table, name) {
7
+ const col = table.columns.find((c) => c.name === name);
8
+ if (!col) {
9
+ throw new Error(`Column "${name}" not found in table "${table.name}"`);
10
+ }
11
+ return col.id;
12
+ }
13
+ function isoNow() {
14
+ return new Date().toISOString();
15
+ }
16
+ /** True when some table in the schema has a foreign key referencing `tableName`. */
17
+ export function isReferencedTable(schema, tableName) {
18
+ return schema
19
+ .tablesList()
20
+ .some((t) => t.foreignKeys.some((fk) => fk.referencesTable === tableName));
21
+ }
22
+ export function toCells(table, row) {
23
+ return table.columns.map((col) => {
24
+ const value = row[col.name];
25
+ if (value === null || value === undefined) {
26
+ // A cell with only `columnId` (no typed value) stores SQL NULL, so a
27
+ // nullable column reads back as null rather than a zero/empty sentinel.
28
+ return { columnId: col.id };
29
+ }
30
+ switch (col.storageType) {
31
+ case 'bool':
32
+ return { columnId: col.id, boolean: value };
33
+ case 'int64':
34
+ return { columnId: col.id, int64: value };
35
+ case 'float64':
36
+ return { columnId: col.id, float64: value };
37
+ case 'text':
38
+ case 'timestamp':
39
+ case 'date':
40
+ case 'json':
41
+ return { columnId: col.id, text: value };
42
+ case 'bytes':
43
+ return { columnId: col.id, bytes: Buffer.from(value) };
44
+ case 'embedding':
45
+ return { columnId: col.id, embedding: value.map(Number) };
46
+ case 'sparse': {
47
+ const terms = value;
48
+ return {
49
+ columnId: col.id,
50
+ sparseTokens: terms.map((p) => p[0]),
51
+ sparseWeights: terms.map((p) => p[1])
52
+ };
53
+ }
54
+ default: {
55
+ const _exhaustive = col.storageType;
56
+ throw new Error(`Unsupported storage type for cell conversion: ${_exhaustive}`);
57
+ }
58
+ }
59
+ });
60
+ }
61
+ export function findByPk(db, table, pkValue) {
62
+ if (table.primaryKey.length === 1) {
63
+ const scalar = Array.isArray(pkValue) ? pkValue[0] : pkValue;
64
+ if (scalar === null) {
65
+ throw new Error(`Primary key value cannot be null in table "${table.name}"`);
66
+ }
67
+ const pkCol = table.columns.find((c) => c.name === table.primaryKey[0]);
68
+ if (!pkCol) {
69
+ throw new Error(`Primary key column not found in table "${table.name}"`);
70
+ }
71
+ const results = db.table(table.name).query([equalityCondition(pkCol, scalar)]);
72
+ return results[0] ?? null;
73
+ }
74
+ if (!Array.isArray(pkValue) || pkValue.length !== table.primaryKey.length) {
75
+ throw new Error(`Primary key value for "${table.name}" must be an array with ${table.primaryKey.length} components`);
76
+ }
77
+ const conditions = table.primaryKey.map((name, i) => {
78
+ const col = table.columns.find((c) => c.name === name);
79
+ if (!col) {
80
+ throw new Error(`Primary key column "${name}" not found in table "${table.name}"`);
81
+ }
82
+ return equalityCondition(col, pkValue[i]);
83
+ });
84
+ const results = db.table(table.name).query(conditions);
85
+ return results[0] ?? null;
86
+ }
87
+ export function pkValueFromRow(table, row) {
88
+ if (table.primaryKey.length === 1) {
89
+ const value = row[table.primaryKey[0]];
90
+ if (typeof value !== 'string' && typeof value !== 'bigint') {
91
+ throw new Error(`Primary key value must be string or bigint`);
92
+ }
93
+ return value;
94
+ }
95
+ return table.primaryKey.map((name) => {
96
+ const value = row[name];
97
+ if (value === null || value === undefined) {
98
+ return null;
99
+ }
100
+ if (typeof value !== 'string' && typeof value !== 'bigint') {
101
+ throw new Error(`Primary key component "${name}" must be string, bigint, or null`);
102
+ }
103
+ return value;
104
+ });
105
+ }
106
+ export function pkValuesEqual(a, b) {
107
+ const left = Array.isArray(a) ? a : [a];
108
+ const right = Array.isArray(b) ? b : [b];
109
+ if (left.length !== right.length)
110
+ return false;
111
+ for (let i = 0; i < left.length; i++) {
112
+ if (left[i] !== right[i])
113
+ return false;
114
+ }
115
+ return true;
116
+ }
117
+ function buildParentPk(parentTable, referencesColumns, fkValues) {
118
+ if (referencesColumns.length !== parentTable.primaryKey.length) {
119
+ throw new Error(`Foreign key references ${referencesColumns.length} columns but parent primary key has ${parentTable.primaryKey.length} columns`);
120
+ }
121
+ if (referencesColumns.length === 1) {
122
+ const value = fkValues[0];
123
+ if (typeof value !== 'string' && typeof value !== 'bigint') {
124
+ throw new Error(`Foreign key value must be string or bigint`);
125
+ }
126
+ return value;
127
+ }
128
+ return fkValues.map((value) => {
129
+ if (value === null || value === undefined) {
130
+ return null;
131
+ }
132
+ if (typeof value !== 'string' && typeof value !== 'bigint') {
133
+ throw new Error(`Foreign key value must be string, bigint, or null`);
134
+ }
135
+ return value;
136
+ });
137
+ }
138
+ function equalityCondition(col, value) {
139
+ if (col.storageType === 'int64') {
140
+ return {
141
+ kind: 2 /* ConditionKind.RangeInt */,
142
+ columnId: col.id,
143
+ int64Lo: value,
144
+ int64Hi: value
145
+ };
146
+ }
147
+ return {
148
+ kind: 1 /* ConditionKind.BitmapEq */,
149
+ columnId: col.id,
150
+ text: String(value)
151
+ };
152
+ }
153
+ function queryChildren(db, childTable, fk, parentRow) {
154
+ const conditions = fk.columns.map((colName, i) => {
155
+ const col = childTable.columns.find((c) => c.name === colName);
156
+ if (!col) {
157
+ throw new Error(`FK column "${colName}" not found in table "${childTable.name}"`);
158
+ }
159
+ const refCol = fk.referencesColumns[i];
160
+ return equalityCondition(col, parentRow[refCol]);
161
+ });
162
+ return db.table(childTable.name).query(conditions);
163
+ }
164
+ export function stageUniqueGuards(kit, txn, table, row, pkValue) {
165
+ const ownerPk = encodedPk(pkValue);
166
+ const now = isoNow();
167
+ for (const uq of table.unique) {
168
+ const values = uq.columns.map((colName) => row[colName] === undefined ? null : row[colName]);
169
+ if (values.some((value) => value === null || value === undefined)) {
170
+ continue;
171
+ }
172
+ const encodedKey = encodeUniqueKey(KIT_KEY_VERSION, uq.name, values);
173
+ const existing = findByPk(kit.db, kitUniqueKeys, encodedKey);
174
+ if (existing) {
175
+ const ownerTableCell = existing.cells.find((c) => c.columnId === columnId(kitUniqueKeys, 'owner_table'));
176
+ const ownerPkCell = existing.cells.find((c) => c.columnId === columnId(kitUniqueKeys, 'owner_pk'));
177
+ const existingTable = String(cellValue(ownerTableCell) ?? '');
178
+ const existingPk = String(cellValue(ownerPkCell) ?? '');
179
+ if (existingTable !== table.name || existingPk !== ownerPk) {
180
+ throw new KitDuplicateError(table.name, uq.name);
181
+ }
182
+ continue;
183
+ }
184
+ txn.put('__kit_unique_keys', [
185
+ { columnId: columnId(kitUniqueKeys, 'encoded_key'), text: encodedKey },
186
+ { columnId: columnId(kitUniqueKeys, 'constraint_name'), text: uq.name },
187
+ { columnId: columnId(kitUniqueKeys, 'owner_table'), text: table.name },
188
+ { columnId: columnId(kitUniqueKeys, 'owner_pk'), text: ownerPk },
189
+ { columnId: columnId(kitUniqueKeys, 'created_at'), text: now }
190
+ ]);
191
+ }
192
+ }
193
+ function pkGuardConstraintName(table) {
194
+ return `__pk_${table.name}`;
195
+ }
196
+ export function stagePkGuard(kit, txn, table, pkValue, pkExplicit, pkSeen) {
197
+ // An auto-assigned (sequence) primary key is guaranteed unique, so it needs
198
+ // no duplicate check — this keeps inserts (and bulk loads) cheap.
199
+ if (!pkExplicit)
200
+ return;
201
+ // A single-column explicit PK is checked for duplicates. A batch passes a
202
+ // pre-loaded set of existing + already-staged PKs so the check stays O(1) per
203
+ // row (one scan up front) instead of a per-row lookup; a single insert checks
204
+ // the table directly.
205
+ if (table.primaryKey.length === 1) {
206
+ if (pkSeen) {
207
+ const k = encodedPk(pkValue);
208
+ if (pkSeen.has(k)) {
209
+ throw new KitDuplicateError(table.name, pkGuardConstraintName(table));
210
+ }
211
+ pkSeen.add(k);
212
+ }
213
+ else if (findByPk(kit.db, table, pkValue)) {
214
+ throw new KitDuplicateError(table.name, pkGuardConstraintName(table));
215
+ }
216
+ return;
217
+ }
218
+ // A composite explicit PK has no single native key to check, so it uses a
219
+ // guard row (conflict-safe) like the unique-constraint machinery.
220
+ const pkValues = pkValue;
221
+ if (pkValues.some((value) => value === null || value === undefined)) {
222
+ throw new Error(`Primary key components cannot be null in table "${table.name}"`);
223
+ }
224
+ const constraintName = pkGuardConstraintName(table);
225
+ const encodedKey = encodeUniqueKey(KIT_KEY_VERSION, constraintName, pkValues);
226
+ const existing = findByPk(kit.db, kitUniqueKeys, encodedKey);
227
+ if (existing) {
228
+ throw new KitDuplicateError(table.name, constraintName);
229
+ }
230
+ txn.put('__kit_unique_keys', [
231
+ { columnId: columnId(kitUniqueKeys, 'encoded_key'), text: encodedKey },
232
+ { columnId: columnId(kitUniqueKeys, 'constraint_name'), text: constraintName },
233
+ { columnId: columnId(kitUniqueKeys, 'owner_table'), text: table.name },
234
+ { columnId: columnId(kitUniqueKeys, 'owner_pk'), text: encodedPk(pkValue) },
235
+ { columnId: columnId(kitUniqueKeys, 'created_at'), text: isoNow() }
236
+ ]);
237
+ }
238
+ export function deletePkGuard(kit, txn, table, pkValue) {
239
+ // Single-column PKs use a native existence check (no guard row to delete).
240
+ if (table.primaryKey.length === 1)
241
+ return;
242
+ const pkValues = pkValue;
243
+ if (pkValues.some((value) => value === null || value === undefined))
244
+ return;
245
+ const constraintName = pkGuardConstraintName(table);
246
+ const encodedKey = encodeUniqueKey(KIT_KEY_VERSION, constraintName, pkValues);
247
+ const existing = findByPk(kit.db, kitUniqueKeys, encodedKey);
248
+ if (existing) {
249
+ txn.delete('__kit_unique_keys', existing.rowId);
250
+ }
251
+ }
252
+ export function deleteUniqueGuards(kit, txn, table, pkValue, onlyConstraints) {
253
+ // No unique constraints means no guard rows to clean up — skip the per-row
254
+ // query on __kit_unique_keys entirely (a hot cost in bulk deletes).
255
+ if (table.unique.length === 0)
256
+ return;
257
+ const ownerPk = encodedPk(pkValue);
258
+ const ownerTableCol = columnId(kitUniqueKeys, 'owner_table');
259
+ const allowed = onlyConstraints
260
+ ? new Set(onlyConstraints)
261
+ : new Set(table.unique.map((uq) => uq.name));
262
+ const existing = kit.db.table('__kit_unique_keys').query([
263
+ { kind: 1 /* ConditionKind.BitmapEq */, columnId: ownerTableCol, text: table.name }
264
+ ]);
265
+ for (const guard of existing) {
266
+ const constraintCell = guard.cells.find((c) => c.columnId === columnId(kitUniqueKeys, 'constraint_name'));
267
+ if (!allowed.has(String(cellValue(constraintCell) ?? ''))) {
268
+ continue;
269
+ }
270
+ const ownerPkCell = guard.cells.find((c) => c.columnId === columnId(kitUniqueKeys, 'owner_pk'));
271
+ if (cellValue(ownerPkCell) === ownerPk) {
272
+ txn.delete('__kit_unique_keys', guard.rowId);
273
+ }
274
+ }
275
+ }
276
+ export function touchRowGuard(kit, txn, tableName, pkValue) {
277
+ const encodedKey = encodeRowGuardKey(tableName, pkValue);
278
+ const existing = findByPk(kit.db, kitRowGuards, encodedKey);
279
+ const version = existing
280
+ ? (existing.cells.find((c) => c.columnId === columnId(kitRowGuards, 'version'))?.int64 ??
281
+ 0n) + 1n
282
+ : 1n;
283
+ const now = isoNow();
284
+ txn.put('__kit_row_guards', [
285
+ { columnId: columnId(kitRowGuards, 'encoded_guard_key'), text: encodedKey },
286
+ { columnId: columnId(kitRowGuards, 'table_name'), text: tableName },
287
+ { columnId: columnId(kitRowGuards, 'primary_key'), text: encodedPk(pkValue) },
288
+ { columnId: columnId(kitRowGuards, 'version'), int64: version },
289
+ { columnId: columnId(kitRowGuards, 'updated_at'), text: now }
290
+ ]);
291
+ }
292
+ export function deleteRowGuard(kit, txn, tableName, pkValue) {
293
+ const encodedKey = encodeRowGuardKey(tableName, pkValue);
294
+ const existing = findByPk(kit.db, kitRowGuards, encodedKey);
295
+ if (existing) {
296
+ txn.delete('__kit_row_guards', existing.rowId);
297
+ }
298
+ }
299
+ export function parentExists(kit, tableName, pkValue) {
300
+ const table = kit.schema.table(tableName);
301
+ return findByPk(kit.db, table, pkValue) !== null;
302
+ }
303
+ export function enforceForeignKeys(kit, txn, table, row) {
304
+ for (const fk of table.foreignKeys) {
305
+ const values = fk.columns.map((colName) => row[colName]);
306
+ if (values.some((v) => v === null || v === undefined)) {
307
+ continue;
308
+ }
309
+ const parentTable = kit.schema.table(fk.referencesTable);
310
+ const parentPk = buildParentPk(parentTable, fk.referencesColumns, values);
311
+ if (!parentExists(kit, parentTable.name, parentPk)) {
312
+ throw new KitForeignKeyError(table.name, fk.name);
313
+ }
314
+ touchRowGuard(kit, txn, parentTable.name, parentPk);
315
+ }
316
+ }
317
+ export function planDelete(kit, txn, table, pkValue, known) {
318
+ planDeleteRecursive(kit, txn, table, pkValue, new Set(), new Set(), known);
319
+ }
320
+ function planDeleteRecursive(kit, txn, table, pkValue, currentPath, deleted, known) {
321
+ const visitKey = `${table.name}:${encodedPk(pkValue)}`;
322
+ if (deleted.has(visitKey))
323
+ return;
324
+ if (currentPath.has(visitKey)) {
325
+ throw new KitError(`Circular delete detected involving ${table.name}`);
326
+ }
327
+ currentPath.add(visitKey);
328
+ // The caller (e.g. a bulk delete) often already has the row from its scan;
329
+ // reuse it instead of re-reading per row, which would be O(n^2) on a delete.
330
+ let row;
331
+ let rowId;
332
+ if (known) {
333
+ row = known.row;
334
+ rowId = known.rowId;
335
+ }
336
+ else {
337
+ const rowJs = findByPk(kit.db, table, pkValue);
338
+ if (!rowJs) {
339
+ throw new KitNotFoundError(table.name, pkValue);
340
+ }
341
+ row = rowFromRowJs(table, rowJs);
342
+ rowId = rowJs.rowId;
343
+ }
344
+ for (const childTable of kit.schema.tablesList()) {
345
+ for (const fk of childTable.foreignKeys) {
346
+ if (fk.referencesTable !== table.name) {
347
+ continue;
348
+ }
349
+ const children = queryChildren(kit.db, childTable, fk, row);
350
+ if (children.length === 0) {
351
+ continue;
352
+ }
353
+ if (fk.onDelete === 'restrict') {
354
+ throw new KitRestrictError(childTable.name, fk.name);
355
+ }
356
+ if (fk.onDelete === 'set null') {
357
+ for (const childJs of children) {
358
+ const childRow = rowFromRowJs(childTable, childJs);
359
+ const childPk = pkValueFromRow(childTable, childRow);
360
+ const patched = { ...childRow };
361
+ for (const colName of fk.columns) {
362
+ patched[colName] = null;
363
+ }
364
+ validateRow(childTable, patched);
365
+ deleteUniqueGuards(kit, txn, childTable, childPk);
366
+ txn.delete(childTable.name, childJs.rowId);
367
+ txn.put(childTable.name, toCells(childTable, patched));
368
+ stageUniqueGuards(kit, txn, childTable, patched, childPk);
369
+ }
370
+ }
371
+ else if (fk.onDelete === 'cascade') {
372
+ for (const childJs of children) {
373
+ const childRow = rowFromRowJs(childTable, childJs);
374
+ const childPk = pkValueFromRow(childTable, childRow);
375
+ planDeleteRecursive(kit, txn, childTable, childPk, currentPath, deleted);
376
+ }
377
+ }
378
+ }
379
+ }
380
+ txn.delete(table.name, rowId);
381
+ deleteUniqueGuards(kit, txn, table, pkValue);
382
+ deletePkGuard(kit, txn, table, pkValue);
383
+ deleteRowGuard(kit, txn, table.name, pkValue);
384
+ deleted.add(visitKey);
385
+ currentPath.delete(visitKey);
386
+ }
387
+ /** Delete every Kit guard row owned by `tableName` (used by `truncateTable`). */
388
+ export function deleteGuardsForTable(kit, txn, tableName) {
389
+ const ownerTableCol = columnId(kitUniqueKeys, 'owner_table');
390
+ const uniqueKeys = kit.db.table('__kit_unique_keys').query([
391
+ { kind: 1 /* ConditionKind.BitmapEq */, columnId: ownerTableCol, text: tableName }
392
+ ]);
393
+ for (const row of uniqueKeys) {
394
+ txn.delete('__kit_unique_keys', row.rowId);
395
+ }
396
+ const tableNameCol = columnId(kitRowGuards, 'table_name');
397
+ const rowGuards = kit.db.table('__kit_row_guards').query([
398
+ { kind: 1 /* ConditionKind.BitmapEq */, columnId: tableNameCol, text: tableName }
399
+ ]);
400
+ for (const row of rowGuards) {
401
+ txn.delete('__kit_row_guards', row.rowId);
402
+ }
403
+ }
404
+ //# sourceMappingURL=constraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constraints.js","sourceRoot":"","sources":["../src/constraints.ts"],"names":[],"mappings":"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"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,135 @@
1
+ import type { Database as NativeDatabase, Transaction } from '@visorcraft/mongreldb/native.js';
2
+ import { Schema } from './schema.js';
3
+ import { type Migration } from './migrate.js';
4
+ /** A reservoir-sampled approximate aggregate with a confidence interval. */
5
+ export interface ApproxAggregate {
6
+ point: number;
7
+ ci_low: number;
8
+ ci_high: number;
9
+ n_population: number;
10
+ n_sample_live: number;
11
+ n_passing: number;
12
+ }
13
+ type MongrelColumnSpec = {
14
+ id: number;
15
+ name: string;
16
+ ty: number;
17
+ primaryKey: boolean;
18
+ nullable: boolean;
19
+ autoIncrement?: boolean;
20
+ embeddingDim?: number;
21
+ encrypted?: boolean;
22
+ encryptedIndexable?: boolean;
23
+ };
24
+ type MongrelDatabase = NativeDatabase & {
25
+ transaction(fn: (txn: Transaction) => void | Promise<void>, opts?: {
26
+ maxRetries?: number;
27
+ baseDelayMs?: number;
28
+ }): Promise<bigint>;
29
+ alterColumn(table: string, columnName: string, column: MongrelColumnSpec): bigint;
30
+ };
31
+ /**
32
+ * Run `fn` inside a fresh transaction, retrying bounded-exponentially on
33
+ * retryable conflicts. Exported so query builders and `KitDatabase` methods
34
+ * can share one implementation.
35
+ */
36
+ export declare function runSyncTxn(kit: KitDatabase, fn: (txn: Transaction) => void, opts?: {
37
+ maxRetries?: number;
38
+ baseDelayMs?: number;
39
+ }): void;
40
+ export declare class KitDatabase {
41
+ private readonly db;
42
+ readonly schema: Schema;
43
+ private constructor();
44
+ static open(path: string, schema: Schema): Promise<KitDatabase>;
45
+ static openSync(path: string, schema: Schema, options?: {
46
+ encryption?: {
47
+ passphrase: string;
48
+ };
49
+ }): KitDatabase;
50
+ static createEncryptedSync(path: string, schema: Schema, passphrase: string): KitDatabase;
51
+ static openEncryptedSync(path: string, schema: Schema, passphrase: string): KitDatabase;
52
+ private static initialize;
53
+ private ensureInternalTables;
54
+ private ensureAppTable;
55
+ private writeSchemaCatalog;
56
+ migrateSync(schema: Schema, migrations: Migration[]): void;
57
+ close(): void;
58
+ get nativeDb(): MongrelDatabase;
59
+ tableNames(): string[];
60
+ /** Verify run footer checksums; returns integrity issues grouped by table. */
61
+ check(): unknown;
62
+ /** Drop corrupt runs; returns the doctor report. */
63
+ doctor(): unknown;
64
+ /**
65
+ * Flush every table's in-memory writes to durable sorted runs. Besides
66
+ * durability, this empties the memtable, which enables the engine's
67
+ * incremental-aggregate fast path (see `incrementalAggregate`).
68
+ */
69
+ flush(): void;
70
+ /** The current visible commit epoch (monotonically increasing version). */
71
+ snapshotEpoch(): bigint;
72
+ /** Export every visible row of `table` as a TSV document. */
73
+ exportTsv(table: string): string;
74
+ /** Read every row of `table` visible at commit `epoch` (MVCC time-travel). */
75
+ rowsAtEpoch(table: string, epoch: bigint): Record<string, unknown>[];
76
+ /**
77
+ * Reservoir-sampled approximate aggregate (`count`/`sum`/`avg`) with a
78
+ * `z`-score confidence interval (default ~95%). Returns
79
+ * `{ point, ci_low, ci_high, n_population, n_sample_live, n_passing }`, or
80
+ * `null` when the reservoir is empty. `column` is required for `sum`/`avg`.
81
+ */
82
+ approxAggregate(table: string, agg: 'count' | 'sum' | 'avg', column?: string, z?: number): ApproxAggregate | null;
83
+ /**
84
+ * Stream `table` in batches of at most `batchSize` rows, invoking `cb` once
85
+ * per batch. Implemented with `limit`/`offset` pagination, so memory stays
86
+ * bounded to one batch. (Not snapshot-consistent across batches, and O(n·
87
+ * pages) — the Rust/Python kit's `scan_batched` uses the engine's native
88
+ * single-pass cursor.)
89
+ */
90
+ scanBatched(table: string, batchSize: number, cb: (rows: Record<string, unknown>[]) => void): void;
91
+ /**
92
+ * Rank rows of `table` by Jaccard set-similarity between `query` and the
93
+ * string set stored (as a JSON array) in `column`, returning the top `k`
94
+ * with similarity `> 0`, highest first. The set-similarity / dedup-join
95
+ * primitive the `MinHash` index kind is meant to serve; an exact linear scan
96
+ * (a sub-linear MinHash/LSH index remains engine future-work).
97
+ */
98
+ setSimilarity(table: string, column: string, query: string[], k: number): {
99
+ row: Record<string, unknown>;
100
+ similarity: number;
101
+ }[];
102
+ /** Import a TSV document into `table`; returns the number of rows inserted. */
103
+ importTsv(table: string, text: string): number;
104
+ /**
105
+ * Rename a live table from `oldName` to `newName`. The source must exist and
106
+ * be live; the target must not collide with an existing table (the engine
107
+ * enforces both). The rename is durable: it is logged to the WAL and applied
108
+ * again on reopen. The `table_id`, schema, and on-disk layout are unchanged,
109
+ * so outstanding handles and indexes remain valid.
110
+ *
111
+ * Internal `__kit_`-prefixed names are off-limits in both directions: an app
112
+ * table cannot be renamed to a `__kit_` name (it would vanish from
113
+ * {@link KitDatabase.tableNames}, which filters that prefix) and an internal
114
+ * table cannot be renamed away from its expected name (the Kit looks internal
115
+ * tables up by name). This keeps the internal-table namespace invariant
116
+ * intact without the engine needing to know about Kit conventions.
117
+ */
118
+ renameTable(oldName: string, newName: string): void;
119
+ begin(): Transaction;
120
+ /**
121
+ * Reserve (without inserting) the next engine-native AUTO_INCREMENT value for
122
+ * `tableName`, advancing the engine's per-table counter. Returns `null` when
123
+ * the table has no auto-increment column.
124
+ *
125
+ * This is the replacement for the legacy `allocateSequenceSync` hot-row
126
+ * scheme: it is a pure in-memory counter bump (no `__kit_sequences` row, no
127
+ * extra commit) that becomes durable when a row carrying the reserved id
128
+ * commits. An aborted reservation simply leaves a gap, which the never-reuse
129
+ * rule permits. Used by `prepareInsertRowSync` so a transaction can stage the
130
+ * row with an explicit id and still return it from `executeSync()`.
131
+ */
132
+ reserveAutoIncSync(tableName: string): bigint | null;
133
+ }
134
+ export {};
135
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}