flatsql 0.2.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/LICENSE +190 -0
- package/README.md +489 -0
- package/dist/btree/btree.d.ts +34 -0
- package/dist/btree/btree.d.ts.map +1 -0
- package/dist/btree/btree.js +235 -0
- package/dist/btree/btree.js.map +1 -0
- package/dist/btree/index.d.ts +3 -0
- package/dist/btree/index.d.ts.map +1 -0
- package/dist/btree/index.js +3 -0
- package/dist/btree/index.js.map +1 -0
- package/dist/btree/types.d.ts +36 -0
- package/dist/btree/types.d.ts.map +1 -0
- package/dist/btree/types.js +55 -0
- package/dist/btree/types.js.map +1 -0
- package/dist/core/database.d.ts +45 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +248 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/table-store.d.ts +28 -0
- package/dist/core/table-store.d.ts.map +1 -0
- package/dist/core/table-store.js +153 -0
- package/dist/core/table-store.js.map +1 -0
- package/dist/flatbuffer-accessor.d.ts +35 -0
- package/dist/flatbuffer-accessor.d.ts.map +1 -0
- package/dist/flatbuffer-accessor.js +114 -0
- package/dist/flatbuffer-accessor.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/parser.d.ts +25 -0
- package/dist/schema/parser.d.ts.map +1 -0
- package/dist/schema/parser.js +394 -0
- package/dist/schema/parser.js.map +1 -0
- package/dist/schema/types.d.ts +33 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +29 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/stacked-flatbuffers.d.ts +38 -0
- package/dist/storage/stacked-flatbuffers.d.ts.map +1 -0
- package/dist/storage/stacked-flatbuffers.js +253 -0
- package/dist/storage/stacked-flatbuffers.js.map +1 -0
- package/dist/storage/types.d.ts +23 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +27 -0
- package/dist/storage/types.js.map +1 -0
- package/package.json +79 -0
- package/wasm/flatsql-client.js +280 -0
- package/wasm/flatsql.js +2 -0
- package/wasm/flatsql.wasm +0 -0
- package/wasm/flatsql.worker.js +209 -0
- package/wasm/index.d.ts +234 -0
- package/wasm/index.js +463 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// Main database class: FlatBuffers-SQLite
|
|
2
|
+
// Provides SQL query interface over FlatBuffer storage
|
|
3
|
+
import { TableStore } from './table-store.js';
|
|
4
|
+
import { StackedFlatBufferStore } from '../storage/index.js';
|
|
5
|
+
import { parseSchema } from '../schema/index.js';
|
|
6
|
+
// Security: Maximum SQL query length to prevent ReDoS attacks
|
|
7
|
+
const MAX_SQL_LENGTH = 10000;
|
|
8
|
+
// Security: Maximum queries per second (0 = unlimited)
|
|
9
|
+
const DEFAULT_RATE_LIMIT = 0;
|
|
10
|
+
export class FlatSQLDatabase {
|
|
11
|
+
schema;
|
|
12
|
+
storage;
|
|
13
|
+
tables = new Map();
|
|
14
|
+
accessor;
|
|
15
|
+
// Security: Configuration options
|
|
16
|
+
maxSqlLength;
|
|
17
|
+
rateLimit;
|
|
18
|
+
queryTimestamps = [];
|
|
19
|
+
constructor(schema, accessor, options = {}) {
|
|
20
|
+
this.schema = schema;
|
|
21
|
+
this.storage = new StackedFlatBufferStore(schema.name);
|
|
22
|
+
this.accessor = accessor;
|
|
23
|
+
this.maxSqlLength = options.maxSqlLength ?? MAX_SQL_LENGTH;
|
|
24
|
+
this.rateLimit = options.rateLimit ?? DEFAULT_RATE_LIMIT;
|
|
25
|
+
// Initialize table stores
|
|
26
|
+
for (const tableDef of schema.tables) {
|
|
27
|
+
const tableStore = new TableStore(tableDef, this.storage, (data, path) => this.accessor.getField(data, path));
|
|
28
|
+
this.tables.set(tableDef.name, tableStore);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Create database from schema source (IDL or JSON Schema)
|
|
32
|
+
static fromSchema(source, accessor, name = 'default', options = {}) {
|
|
33
|
+
const schema = parseSchema(source, name);
|
|
34
|
+
return new FlatSQLDatabase(schema, accessor, options);
|
|
35
|
+
}
|
|
36
|
+
// Insert a record (as JSON that will be converted to FlatBuffer)
|
|
37
|
+
insert(tableName, data) {
|
|
38
|
+
const tableStore = this.tables.get(tableName);
|
|
39
|
+
if (!tableStore) {
|
|
40
|
+
throw new Error(`Table not found: ${tableName}`);
|
|
41
|
+
}
|
|
42
|
+
const buffer = this.accessor.buildBuffer(tableName, data);
|
|
43
|
+
return tableStore.insert(buffer);
|
|
44
|
+
}
|
|
45
|
+
// Insert raw FlatBuffer data
|
|
46
|
+
insertRaw(tableName, flatbufferData) {
|
|
47
|
+
const tableStore = this.tables.get(tableName);
|
|
48
|
+
if (!tableStore) {
|
|
49
|
+
throw new Error(`Table not found: ${tableName}`);
|
|
50
|
+
}
|
|
51
|
+
return tableStore.insert(flatbufferData);
|
|
52
|
+
}
|
|
53
|
+
// Stream in multiple FlatBuffers
|
|
54
|
+
stream(tableName, flatbuffers) {
|
|
55
|
+
const rowids = [];
|
|
56
|
+
for (const fb of flatbuffers) {
|
|
57
|
+
rowids.push(this.insertRaw(tableName, fb));
|
|
58
|
+
}
|
|
59
|
+
return rowids;
|
|
60
|
+
}
|
|
61
|
+
// Execute a simple SQL query
|
|
62
|
+
// Supports: SELECT columns FROM table WHERE column = value
|
|
63
|
+
// SELECT columns FROM table WHERE column BETWEEN min AND max
|
|
64
|
+
// SELECT * FROM table
|
|
65
|
+
query(sql) {
|
|
66
|
+
// Security: Check SQL length to prevent ReDoS
|
|
67
|
+
if (sql.length > this.maxSqlLength) {
|
|
68
|
+
throw new Error(`SQL query exceeds maximum length of ${this.maxSqlLength} characters`);
|
|
69
|
+
}
|
|
70
|
+
// Security: Rate limiting
|
|
71
|
+
if (this.rateLimit > 0) {
|
|
72
|
+
this.enforceRateLimit();
|
|
73
|
+
}
|
|
74
|
+
const parsed = this.parseSQL(sql);
|
|
75
|
+
if (parsed.type !== 'SELECT') {
|
|
76
|
+
throw new Error(`Unsupported query type: ${parsed.type}`);
|
|
77
|
+
}
|
|
78
|
+
const tableStore = this.tables.get(parsed.table);
|
|
79
|
+
if (!tableStore) {
|
|
80
|
+
throw new Error(`Table not found: ${parsed.table}`);
|
|
81
|
+
}
|
|
82
|
+
let records;
|
|
83
|
+
if (parsed.where) {
|
|
84
|
+
if (parsed.where.operator === '=') {
|
|
85
|
+
records = tableStore.findByIndex(parsed.where.column, parsed.where.value);
|
|
86
|
+
}
|
|
87
|
+
else if (parsed.where.operator === 'BETWEEN') {
|
|
88
|
+
records = tableStore.findByRange(parsed.where.column, parsed.where.minValue, parsed.where.maxValue);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Full scan with filter
|
|
92
|
+
records = tableStore.scanAll().filter(record => {
|
|
93
|
+
const value = record.fields.get(parsed.where.column);
|
|
94
|
+
return this.evaluateCondition(value, parsed.where.operator, parsed.where.value);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
records = tableStore.scanAll();
|
|
100
|
+
}
|
|
101
|
+
// Determine columns
|
|
102
|
+
const tableDef = tableStore.getTableDef();
|
|
103
|
+
const columns = parsed.columns[0] === '*'
|
|
104
|
+
? tableDef.columns.map(c => c.name)
|
|
105
|
+
: parsed.columns;
|
|
106
|
+
// Build result rows
|
|
107
|
+
const rows = records.map(record => {
|
|
108
|
+
return columns.map(col => {
|
|
109
|
+
if (col === '_rowid')
|
|
110
|
+
return record.rowid;
|
|
111
|
+
if (col === '_offset')
|
|
112
|
+
return record.offset;
|
|
113
|
+
return record.fields.get(col) ?? null;
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
return {
|
|
117
|
+
columns,
|
|
118
|
+
rows,
|
|
119
|
+
rowCount: rows.length,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
parseSQL(sql) {
|
|
123
|
+
const normalized = sql.trim().replace(/\s+/g, ' ');
|
|
124
|
+
// SELECT query
|
|
125
|
+
const selectMatch = normalized.match(/^SELECT\s+(.+?)\s+FROM\s+(\w+)(?:\s+WHERE\s+(.+?))?(?:\s+ORDER\s+BY\s+(.+?))?(?:\s+LIMIT\s+(\d+))?$/i);
|
|
126
|
+
if (selectMatch) {
|
|
127
|
+
const columns = selectMatch[1].split(',').map(c => c.trim());
|
|
128
|
+
const table = selectMatch[2];
|
|
129
|
+
const whereClause = selectMatch[3];
|
|
130
|
+
let where;
|
|
131
|
+
if (whereClause) {
|
|
132
|
+
// Parse BETWEEN
|
|
133
|
+
const betweenMatch = whereClause.match(/^(\w+)\s+BETWEEN\s+(.+?)\s+AND\s+(.+)$/i);
|
|
134
|
+
if (betweenMatch) {
|
|
135
|
+
where = {
|
|
136
|
+
column: betweenMatch[1],
|
|
137
|
+
operator: 'BETWEEN',
|
|
138
|
+
minValue: this.parseValue(betweenMatch[2]),
|
|
139
|
+
maxValue: this.parseValue(betweenMatch[3]),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Parse simple condition: column op value
|
|
144
|
+
const condMatch = whereClause.match(/^(\w+)\s*(=|!=|<>|<|>|<=|>=)\s*(.+)$/);
|
|
145
|
+
if (condMatch) {
|
|
146
|
+
where = {
|
|
147
|
+
column: condMatch[1],
|
|
148
|
+
operator: condMatch[2],
|
|
149
|
+
value: this.parseValue(condMatch[3]),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
type: 'SELECT',
|
|
156
|
+
table,
|
|
157
|
+
columns,
|
|
158
|
+
where,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
// Security: Don't expose SQL in error message (could contain sensitive data)
|
|
162
|
+
throw new Error('SQL parse error: unsupported query syntax');
|
|
163
|
+
}
|
|
164
|
+
parseValue(str) {
|
|
165
|
+
str = str.trim();
|
|
166
|
+
// String literal
|
|
167
|
+
if ((str.startsWith("'") && str.endsWith("'")) || (str.startsWith('"') && str.endsWith('"'))) {
|
|
168
|
+
return str.slice(1, -1);
|
|
169
|
+
}
|
|
170
|
+
// Integer (check for BigInt needs)
|
|
171
|
+
if (/^-?\d+$/.test(str)) {
|
|
172
|
+
const num = BigInt(str);
|
|
173
|
+
// Security: Use BigInt for values exceeding safe integer range
|
|
174
|
+
if (num > BigInt(Number.MAX_SAFE_INTEGER) || num < BigInt(Number.MIN_SAFE_INTEGER)) {
|
|
175
|
+
return num;
|
|
176
|
+
}
|
|
177
|
+
return Number(str);
|
|
178
|
+
}
|
|
179
|
+
// Float
|
|
180
|
+
if (/^-?\d+\.\d+$/.test(str)) {
|
|
181
|
+
return parseFloat(str);
|
|
182
|
+
}
|
|
183
|
+
// Boolean
|
|
184
|
+
if (str.toLowerCase() === 'true')
|
|
185
|
+
return true;
|
|
186
|
+
if (str.toLowerCase() === 'false')
|
|
187
|
+
return false;
|
|
188
|
+
// NULL
|
|
189
|
+
if (str.toLowerCase() === 'null')
|
|
190
|
+
return null;
|
|
191
|
+
return str;
|
|
192
|
+
}
|
|
193
|
+
// Security: Rate limiting enforcement
|
|
194
|
+
enforceRateLimit() {
|
|
195
|
+
const now = Date.now();
|
|
196
|
+
const windowMs = 1000; // 1 second window
|
|
197
|
+
// Remove timestamps older than the window
|
|
198
|
+
this.queryTimestamps = this.queryTimestamps.filter(ts => now - ts < windowMs);
|
|
199
|
+
if (this.queryTimestamps.length >= this.rateLimit) {
|
|
200
|
+
throw new Error(`Rate limit exceeded: maximum ${this.rateLimit} queries per second`);
|
|
201
|
+
}
|
|
202
|
+
this.queryTimestamps.push(now);
|
|
203
|
+
}
|
|
204
|
+
evaluateCondition(value, operator, target) {
|
|
205
|
+
switch (operator) {
|
|
206
|
+
case '=':
|
|
207
|
+
return value === target;
|
|
208
|
+
case '!=':
|
|
209
|
+
case '<>':
|
|
210
|
+
return value !== target;
|
|
211
|
+
case '<':
|
|
212
|
+
return value < target;
|
|
213
|
+
case '>':
|
|
214
|
+
return value > target;
|
|
215
|
+
case '<=':
|
|
216
|
+
return value <= target;
|
|
217
|
+
case '>=':
|
|
218
|
+
return value >= target;
|
|
219
|
+
default:
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// Get table definition
|
|
224
|
+
getTableDef(tableName) {
|
|
225
|
+
return this.tables.get(tableName)?.getTableDef();
|
|
226
|
+
}
|
|
227
|
+
// List all tables
|
|
228
|
+
listTables() {
|
|
229
|
+
return Array.from(this.tables.keys());
|
|
230
|
+
}
|
|
231
|
+
// Get raw storage data (for export)
|
|
232
|
+
exportData() {
|
|
233
|
+
return this.storage.getData();
|
|
234
|
+
}
|
|
235
|
+
// Get schema
|
|
236
|
+
getSchema() {
|
|
237
|
+
return this.schema;
|
|
238
|
+
}
|
|
239
|
+
// Get statistics
|
|
240
|
+
getStats() {
|
|
241
|
+
return Array.from(this.tables.entries()).map(([name, store]) => ({
|
|
242
|
+
tableName: name,
|
|
243
|
+
recordCount: store.getRecordCount(),
|
|
244
|
+
indexes: store.getIndexNames(),
|
|
245
|
+
}));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { StackedFlatBufferStore } from '../storage/index.js';
|
|
2
|
+
import { TableDef } from '../schema/index.js';
|
|
3
|
+
export interface TableRecord {
|
|
4
|
+
rowid: bigint;
|
|
5
|
+
offset: bigint;
|
|
6
|
+
data: Uint8Array;
|
|
7
|
+
fields: Map<string, any>;
|
|
8
|
+
}
|
|
9
|
+
export declare class TableStore {
|
|
10
|
+
private tableDef;
|
|
11
|
+
private storage;
|
|
12
|
+
private indexes;
|
|
13
|
+
private rowIdCounter;
|
|
14
|
+
private fieldAccessor;
|
|
15
|
+
constructor(tableDef: TableDef, storage: StackedFlatBufferStore, fieldAccessor: (data: Uint8Array, fieldPath: string[]) => any);
|
|
16
|
+
private columnTypeToKeyType;
|
|
17
|
+
insert(flatbufferData: Uint8Array): bigint;
|
|
18
|
+
findByIndex(columnName: string, key: any): TableRecord[];
|
|
19
|
+
findByRange(columnName: string, minKey: any, maxKey: any): TableRecord[];
|
|
20
|
+
scanAll(): TableRecord[];
|
|
21
|
+
getByRowId(rowid: bigint): TableRecord | null;
|
|
22
|
+
private entriesToRecords;
|
|
23
|
+
private extractFields;
|
|
24
|
+
getTableDef(): TableDef;
|
|
25
|
+
getIndexNames(): string[];
|
|
26
|
+
getRecordCount(): bigint;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=table-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-store.d.ts","sourceRoot":"","sources":["../../src/core/table-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAA4B,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC1B;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,YAAY,CAAc;IAGlC,OAAO,CAAC,aAAa,CAAiD;gBAGpE,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,sBAAsB,EAC/B,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAG;IAwB/D,OAAO,CAAC,mBAAmB;IAgB3B,MAAM,CAAC,cAAc,EAAE,UAAU,GAAG,MAAM;IA2B1C,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,WAAW,EAAE;IAWxD,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,WAAW,EAAE;IAWxE,OAAO,IAAI,WAAW,EAAE;IAsBxB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAK7C,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,aAAa;IAiBrB,WAAW,IAAI,QAAQ;IAIvB,aAAa,IAAI,MAAM,EAAE;IAIzB,cAAc,IAAI,MAAM;CAOzB"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Table store: manages FlatBuffer data and indexes for a single table
|
|
2
|
+
import { BTree, KeyType } from '../btree/index.js';
|
|
3
|
+
import { SQLColumnType } from '../schema/index.js';
|
|
4
|
+
export class TableStore {
|
|
5
|
+
tableDef;
|
|
6
|
+
storage;
|
|
7
|
+
indexes = new Map();
|
|
8
|
+
rowIdCounter = 1n;
|
|
9
|
+
// Field accessor function - extracts field value from FlatBuffer
|
|
10
|
+
fieldAccessor;
|
|
11
|
+
constructor(tableDef, storage, fieldAccessor) {
|
|
12
|
+
this.tableDef = tableDef;
|
|
13
|
+
this.storage = storage;
|
|
14
|
+
this.fieldAccessor = fieldAccessor;
|
|
15
|
+
// Create indexes for indexed columns
|
|
16
|
+
for (const column of tableDef.columns) {
|
|
17
|
+
if (column.isIndexed) {
|
|
18
|
+
const keyType = this.columnTypeToKeyType(column.sqlType);
|
|
19
|
+
this.indexes.set(column.name, new BTree({
|
|
20
|
+
name: `${tableDef.name}_${column.name}_idx`,
|
|
21
|
+
tableName: tableDef.name,
|
|
22
|
+
columnName: column.name,
|
|
23
|
+
keyType,
|
|
24
|
+
order: 64, // B-tree order
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
columnTypeToKeyType(sqlType) {
|
|
30
|
+
switch (sqlType) {
|
|
31
|
+
case SQLColumnType.INTEGER:
|
|
32
|
+
return KeyType.Int;
|
|
33
|
+
case SQLColumnType.REAL:
|
|
34
|
+
return KeyType.Float;
|
|
35
|
+
case SQLColumnType.TEXT:
|
|
36
|
+
return KeyType.String;
|
|
37
|
+
case SQLColumnType.BLOB:
|
|
38
|
+
return KeyType.Bytes;
|
|
39
|
+
default:
|
|
40
|
+
return KeyType.Bytes;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Insert a new record
|
|
44
|
+
insert(flatbufferData) {
|
|
45
|
+
const rowid = this.rowIdCounter++;
|
|
46
|
+
// Append to storage
|
|
47
|
+
const offset = this.storage.append(this.tableDef.name, flatbufferData);
|
|
48
|
+
// Update indexes
|
|
49
|
+
for (const column of this.tableDef.columns) {
|
|
50
|
+
const index = this.indexes.get(column.name);
|
|
51
|
+
if (!index)
|
|
52
|
+
continue;
|
|
53
|
+
let key;
|
|
54
|
+
if (column.name === '_rowid') {
|
|
55
|
+
key = Number(rowid);
|
|
56
|
+
}
|
|
57
|
+
else if (column.name === '_offset') {
|
|
58
|
+
key = Number(offset);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
key = this.fieldAccessor(flatbufferData, column.flatbufferPath);
|
|
62
|
+
}
|
|
63
|
+
index.insert(key, offset, flatbufferData.length, rowid);
|
|
64
|
+
}
|
|
65
|
+
return rowid;
|
|
66
|
+
}
|
|
67
|
+
// Find records by indexed column
|
|
68
|
+
findByIndex(columnName, key) {
|
|
69
|
+
const index = this.indexes.get(columnName);
|
|
70
|
+
if (!index) {
|
|
71
|
+
throw new Error(`No index on column: ${columnName}`);
|
|
72
|
+
}
|
|
73
|
+
const entries = index.search(key);
|
|
74
|
+
return this.entriesToRecords(entries);
|
|
75
|
+
}
|
|
76
|
+
// Range query on indexed column
|
|
77
|
+
findByRange(columnName, minKey, maxKey) {
|
|
78
|
+
const index = this.indexes.get(columnName);
|
|
79
|
+
if (!index) {
|
|
80
|
+
throw new Error(`No index on column: ${columnName}`);
|
|
81
|
+
}
|
|
82
|
+
const entries = index.range(minKey, maxKey);
|
|
83
|
+
return this.entriesToRecords(entries);
|
|
84
|
+
}
|
|
85
|
+
// Get all records (full table scan)
|
|
86
|
+
scanAll() {
|
|
87
|
+
const index = this.indexes.get('_rowid');
|
|
88
|
+
if (index) {
|
|
89
|
+
const entries = index.all();
|
|
90
|
+
return this.entriesToRecords(entries);
|
|
91
|
+
}
|
|
92
|
+
// Fallback: scan storage directly
|
|
93
|
+
const records = [];
|
|
94
|
+
for (const storedRecord of this.storage.iterateTableRecords(this.tableDef.name)) {
|
|
95
|
+
const fields = this.extractFields(storedRecord.data);
|
|
96
|
+
records.push({
|
|
97
|
+
rowid: storedRecord.header.sequence,
|
|
98
|
+
offset: storedRecord.offset,
|
|
99
|
+
data: storedRecord.data,
|
|
100
|
+
fields,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return records;
|
|
104
|
+
}
|
|
105
|
+
// Get record by rowid
|
|
106
|
+
getByRowId(rowid) {
|
|
107
|
+
const records = this.findByIndex('_rowid', Number(rowid));
|
|
108
|
+
return records.length > 0 ? records[0] : null;
|
|
109
|
+
}
|
|
110
|
+
entriesToRecords(entries) {
|
|
111
|
+
const records = [];
|
|
112
|
+
for (const entry of entries) {
|
|
113
|
+
const storedRecord = this.storage.readRecord(entry.dataOffset);
|
|
114
|
+
const fields = this.extractFields(storedRecord.data);
|
|
115
|
+
records.push({
|
|
116
|
+
rowid: entry.sequence,
|
|
117
|
+
offset: entry.dataOffset,
|
|
118
|
+
data: storedRecord.data,
|
|
119
|
+
fields,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return records;
|
|
123
|
+
}
|
|
124
|
+
extractFields(data) {
|
|
125
|
+
const fields = new Map();
|
|
126
|
+
for (const column of this.tableDef.columns) {
|
|
127
|
+
if (column.name.startsWith('_'))
|
|
128
|
+
continue;
|
|
129
|
+
try {
|
|
130
|
+
const value = this.fieldAccessor(data, column.flatbufferPath);
|
|
131
|
+
fields.set(column.name, value);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
fields.set(column.name, null);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return fields;
|
|
138
|
+
}
|
|
139
|
+
getTableDef() {
|
|
140
|
+
return this.tableDef;
|
|
141
|
+
}
|
|
142
|
+
getIndexNames() {
|
|
143
|
+
return Array.from(this.indexes.keys());
|
|
144
|
+
}
|
|
145
|
+
getRecordCount() {
|
|
146
|
+
const index = this.indexes.get('_rowid');
|
|
147
|
+
if (index) {
|
|
148
|
+
return index.getStats().entryCount;
|
|
149
|
+
}
|
|
150
|
+
return this.storage.getRecordCount();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=table-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-store.js","sourceRoot":"","sources":["../../src/core/table-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FlatBufferAccessor } from './core/database.js';
|
|
2
|
+
interface FlatcRunner {
|
|
3
|
+
generateBinary(schema: SchemaInput, json: string): Uint8Array;
|
|
4
|
+
generateJSON(schema: SchemaInput, binary: {
|
|
5
|
+
path: string;
|
|
6
|
+
data: Uint8Array;
|
|
7
|
+
}): string;
|
|
8
|
+
generateCode(schema: SchemaInput, language: string, options?: any): Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
interface SchemaInput {
|
|
11
|
+
entry: string;
|
|
12
|
+
files: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
export declare class FlatcAccessor implements FlatBufferAccessor {
|
|
15
|
+
private flatc;
|
|
16
|
+
private schemaInput;
|
|
17
|
+
private tableSchemas;
|
|
18
|
+
constructor(flatc: FlatcRunner, schemaSource: string, schemaName?: string);
|
|
19
|
+
registerTableSchema(tableName: string, schemaSource: string): void;
|
|
20
|
+
private getSchema;
|
|
21
|
+
getField(data: Uint8Array, path: string[]): any;
|
|
22
|
+
buildBuffer(tableName: string, fields: Record<string, any>): Uint8Array;
|
|
23
|
+
toJSON(data: Uint8Array, tableName?: string): Record<string, any>;
|
|
24
|
+
fromJSON(obj: Record<string, any>, tableName?: string): Uint8Array;
|
|
25
|
+
}
|
|
26
|
+
export declare class DirectAccessor implements FlatBufferAccessor {
|
|
27
|
+
private accessors;
|
|
28
|
+
private builders;
|
|
29
|
+
registerAccessor(tableName: string, accessor: (data: Uint8Array, path: string[]) => any): void;
|
|
30
|
+
registerBuilder(tableName: string, builder: (fields: Record<string, any>) => Uint8Array): void;
|
|
31
|
+
getField(data: Uint8Array, path: string[]): any;
|
|
32
|
+
buildBuffer(tableName: string, fields: Record<string, any>): Uint8Array;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=flatbuffer-accessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatbuffer-accessor.d.ts","sourceRoot":"","sources":["../src/flatbuffer-accessor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD,UAAU,WAAW;IACnB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC9D,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,GAAG,MAAM,CAAC;IACtF,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5F;AAED,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAID,qBAAa,aAAc,YAAW,kBAAkB;IACtD,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAuC;gBAE/C,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,GAAE,MAAqB;IAWvF,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAUlE,OAAO,CAAC,SAAS;IAQjB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG;IAwB/C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,UAAU;IAOvE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAUjE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU;CAInE;AAID,qBAAa,cAAe,YAAW,kBAAkB;IACvD,OAAO,CAAC,SAAS,CAAqE;IACtF,OAAO,CAAC,QAAQ,CAAuE;IAGvF,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,GAClD,IAAI;IAKP,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,UAAU,GACnD,IAAI;IAIP,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG;IAe/C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,UAAU;CAOxE"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// FlatBuffer accessor implementation using flatc-wasm
|
|
2
|
+
// Provides field extraction and buffer building capabilities
|
|
3
|
+
// Dynamic accessor that uses flatc-wasm for JSON<->Binary conversion
|
|
4
|
+
// This is the bridge between SQL queries and FlatBuffer data
|
|
5
|
+
export class FlatcAccessor {
|
|
6
|
+
flatc;
|
|
7
|
+
schemaInput;
|
|
8
|
+
tableSchemas = new Map();
|
|
9
|
+
constructor(flatc, schemaSource, schemaName = 'schema.fbs') {
|
|
10
|
+
this.flatc = flatc;
|
|
11
|
+
this.schemaInput = {
|
|
12
|
+
entry: `/${schemaName}`,
|
|
13
|
+
files: {
|
|
14
|
+
[`/${schemaName}`]: schemaSource,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// Register a table-specific schema (for multi-table scenarios)
|
|
19
|
+
registerTableSchema(tableName, schemaSource) {
|
|
20
|
+
this.tableSchemas.set(tableName, {
|
|
21
|
+
entry: `/${tableName}.fbs`,
|
|
22
|
+
files: {
|
|
23
|
+
[`/${tableName}.fbs`]: schemaSource,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// Get the schema for a table
|
|
28
|
+
getSchema(tableName) {
|
|
29
|
+
if (tableName && this.tableSchemas.has(tableName)) {
|
|
30
|
+
return this.tableSchemas.get(tableName);
|
|
31
|
+
}
|
|
32
|
+
return this.schemaInput;
|
|
33
|
+
}
|
|
34
|
+
// Extract a field value from FlatBuffer binary data
|
|
35
|
+
getField(data, path) {
|
|
36
|
+
try {
|
|
37
|
+
// Convert FlatBuffer to JSON
|
|
38
|
+
const json = this.flatc.generateJSON(this.schemaInput, {
|
|
39
|
+
path: '/data.bin',
|
|
40
|
+
data,
|
|
41
|
+
});
|
|
42
|
+
// Parse JSON and navigate path
|
|
43
|
+
let obj = JSON.parse(json);
|
|
44
|
+
for (const key of path) {
|
|
45
|
+
if (obj === null || obj === undefined) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
obj = obj[key];
|
|
49
|
+
}
|
|
50
|
+
return obj;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// Field not present or extraction failed
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Build a FlatBuffer from field values (JSON object)
|
|
58
|
+
buildBuffer(tableName, fields) {
|
|
59
|
+
const schema = this.getSchema(tableName);
|
|
60
|
+
const json = JSON.stringify(fields);
|
|
61
|
+
return this.flatc.generateBinary(schema, json);
|
|
62
|
+
}
|
|
63
|
+
// Convert FlatBuffer to JSON object
|
|
64
|
+
toJSON(data, tableName) {
|
|
65
|
+
const schema = this.getSchema(tableName);
|
|
66
|
+
const json = this.flatc.generateJSON(schema, {
|
|
67
|
+
path: '/data.bin',
|
|
68
|
+
data,
|
|
69
|
+
});
|
|
70
|
+
return JSON.parse(json);
|
|
71
|
+
}
|
|
72
|
+
// Convert JSON object to FlatBuffer
|
|
73
|
+
fromJSON(obj, tableName) {
|
|
74
|
+
const schema = this.getSchema(tableName);
|
|
75
|
+
return this.flatc.generateBinary(schema, JSON.stringify(obj));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Simple accessor for when you have generated TypeScript code
|
|
79
|
+
// Uses direct field access (much faster than JSON round-trip)
|
|
80
|
+
export class DirectAccessor {
|
|
81
|
+
accessors = new Map();
|
|
82
|
+
builders = new Map();
|
|
83
|
+
// Register a field accessor for a table
|
|
84
|
+
registerAccessor(tableName, accessor) {
|
|
85
|
+
this.accessors.set(tableName, accessor);
|
|
86
|
+
}
|
|
87
|
+
// Register a buffer builder for a table
|
|
88
|
+
registerBuilder(tableName, builder) {
|
|
89
|
+
this.builders.set(tableName, builder);
|
|
90
|
+
}
|
|
91
|
+
getField(data, path) {
|
|
92
|
+
// Try each registered accessor until one works
|
|
93
|
+
for (const accessor of this.accessors.values()) {
|
|
94
|
+
try {
|
|
95
|
+
const result = accessor(data, path);
|
|
96
|
+
if (result !== undefined) {
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Try next accessor
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
buildBuffer(tableName, fields) {
|
|
107
|
+
const builder = this.builders.get(tableName);
|
|
108
|
+
if (!builder) {
|
|
109
|
+
throw new Error(`No builder registered for table: ${tableName}`);
|
|
110
|
+
}
|
|
111
|
+
return builder(fields);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=flatbuffer-accessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatbuffer-accessor.js","sourceRoot":"","sources":["../src/flatbuffer-accessor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './btree/index.js';
|
|
2
|
+
export * from './storage/index.js';
|
|
3
|
+
export * from './schema/index.js';
|
|
4
|
+
export * from './core/index.js';
|
|
5
|
+
export * from './flatbuffer-accessor.js';
|
|
6
|
+
export { FlatSQLDatabase, QueryResult, FlatBufferAccessor } from './core/database.js';
|
|
7
|
+
export { TableStore, TableRecord } from './core/table-store.js';
|
|
8
|
+
export { BTree } from './btree/btree.js';
|
|
9
|
+
export { StackedFlatBufferStore } from './storage/stacked-flatbuffers.js';
|
|
10
|
+
export { parseSchema, DatabaseSchema, TableDef, ColumnDef } from './schema/index.js';
|
|
11
|
+
export { FlatcAccessor, DirectAccessor } from './flatbuffer-accessor.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
|