@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.
- package/dist/constraints.d.ts +35 -0
- package/dist/constraints.d.ts.map +1 -0
- package/dist/constraints.js +404 -0
- package/dist/constraints.js.map +1 -0
- package/dist/db.d.ts +135 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +495 -0
- package/dist/db.js.map +1 -0
- package/dist/defaults.d.ts +26 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +56 -0
- package/dist/defaults.js.map +1 -0
- package/dist/errors.d.ts +54 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +104 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/internalTables.d.ts +63 -0
- package/dist/internalTables.d.ts.map +1 -0
- package/dist/internalTables.js +60 -0
- package/dist/internalTables.js.map +1 -0
- package/dist/keys.d.ts +7 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +84 -0
- package/dist/keys.js.map +1 -0
- package/dist/migrate.d.ts +132 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +1004 -0
- package/dist/migrate.js.map +1 -0
- package/dist/packing.d.ts +12 -0
- package/dist/packing.d.ts.map +1 -0
- package/dist/packing.js +137 -0
- package/dist/packing.js.map +1 -0
- package/dist/query.d.ts +423 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +1645 -0
- package/dist/query.js.map +1 -0
- package/dist/remote.d.ts +29 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +42 -0
- package/dist/remote.js.map +1 -0
- package/dist/rows.d.ts +5 -0
- package/dist/rows.d.ts.map +1 -0
- package/dist/rows.js +38 -0
- package/dist/rows.js.map +1 -0
- package/dist/schema.d.ts +91 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +206 -0
- package/dist/schema.js.map +1 -0
- package/dist/tsv.d.ts +4 -0
- package/dist/tsv.d.ts.map +1 -0
- package/dist/tsv.js +102 -0
- package/dist/tsv.js.map +1 -0
- package/dist/types.d.ts +99 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +3 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +98 -0
- package/dist/validation.js.map +1 -0
- 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":"AACA,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAC5G,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAA8B,OAAO,EAAE,MAAM,YAAY,CAAC;AAajF,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,eAAe,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,KAAK,eAAe,GAAG,cAAc,GAAG;IACvC,WAAW,CACV,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC9C,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAClD,OAAO,CAAC,MAAM,CAAC,CAAC;CACnB,CAAC;AAcF,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAI5E;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,CAsC9E;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,KAAK,GAAG,IAAI,CA4B7F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAmBtF;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAQ7D;AA+DD,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,EAAE,OAAO,GACd,IAAI,CAmCN;AAMD,wBAAgB,YAAY,CAC3B,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,OAAO,EACnB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAClB,IAAI,CAyCN;AAED,wBAAgB,aAAa,CAC5B,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,OAAO,GACd,IAAI,CAWN;AAED,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,OAAO,EAChB,eAAe,CAAC,EAAE,MAAM,EAAE,GACxB,IAAI,CA0BN;AAED,wBAAgB,aAAa,CAC5B,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACd,IAAI,CAeN;AAED,wBAAgB,cAAc,CAC7B,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACd,IAAI,CAMN;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAG7F;AAED,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC1B,IAAI,CAaN;AAED,wBAAgB,UAAU,CACzB,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD,IAAI,CAEN;AA8ED,iFAAiF;AACjF,wBAAgB,oBAAoB,CACnC,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,WAAW,EAChB,SAAS,EAAE,MAAM,GACf,IAAI,CAgBN"}
|
|
@@ -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
|
package/dist/db.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|