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.
Files changed (65) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +489 -0
  3. package/dist/btree/btree.d.ts +34 -0
  4. package/dist/btree/btree.d.ts.map +1 -0
  5. package/dist/btree/btree.js +235 -0
  6. package/dist/btree/btree.js.map +1 -0
  7. package/dist/btree/index.d.ts +3 -0
  8. package/dist/btree/index.d.ts.map +1 -0
  9. package/dist/btree/index.js +3 -0
  10. package/dist/btree/index.js.map +1 -0
  11. package/dist/btree/types.d.ts +36 -0
  12. package/dist/btree/types.d.ts.map +1 -0
  13. package/dist/btree/types.js +55 -0
  14. package/dist/btree/types.js.map +1 -0
  15. package/dist/core/database.d.ts +45 -0
  16. package/dist/core/database.d.ts.map +1 -0
  17. package/dist/core/database.js +248 -0
  18. package/dist/core/database.js.map +1 -0
  19. package/dist/core/index.d.ts +3 -0
  20. package/dist/core/index.d.ts.map +1 -0
  21. package/dist/core/index.js +3 -0
  22. package/dist/core/index.js.map +1 -0
  23. package/dist/core/table-store.d.ts +28 -0
  24. package/dist/core/table-store.d.ts.map +1 -0
  25. package/dist/core/table-store.js +153 -0
  26. package/dist/core/table-store.js.map +1 -0
  27. package/dist/flatbuffer-accessor.d.ts +35 -0
  28. package/dist/flatbuffer-accessor.d.ts.map +1 -0
  29. package/dist/flatbuffer-accessor.js +114 -0
  30. package/dist/flatbuffer-accessor.js.map +1 -0
  31. package/dist/index.d.ts +12 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +15 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/schema/index.d.ts +3 -0
  36. package/dist/schema/index.d.ts.map +1 -0
  37. package/dist/schema/index.js +3 -0
  38. package/dist/schema/index.js.map +1 -0
  39. package/dist/schema/parser.d.ts +25 -0
  40. package/dist/schema/parser.d.ts.map +1 -0
  41. package/dist/schema/parser.js +394 -0
  42. package/dist/schema/parser.js.map +1 -0
  43. package/dist/schema/types.d.ts +33 -0
  44. package/dist/schema/types.d.ts.map +1 -0
  45. package/dist/schema/types.js +29 -0
  46. package/dist/schema/types.js.map +1 -0
  47. package/dist/storage/index.d.ts +3 -0
  48. package/dist/storage/index.d.ts.map +1 -0
  49. package/dist/storage/index.js +3 -0
  50. package/dist/storage/index.js.map +1 -0
  51. package/dist/storage/stacked-flatbuffers.d.ts +38 -0
  52. package/dist/storage/stacked-flatbuffers.d.ts.map +1 -0
  53. package/dist/storage/stacked-flatbuffers.js +253 -0
  54. package/dist/storage/stacked-flatbuffers.js.map +1 -0
  55. package/dist/storage/types.d.ts +23 -0
  56. package/dist/storage/types.d.ts.map +1 -0
  57. package/dist/storage/types.js +27 -0
  58. package/dist/storage/types.js.map +1 -0
  59. package/package.json +79 -0
  60. package/wasm/flatsql-client.js +280 -0
  61. package/wasm/flatsql.js +2 -0
  62. package/wasm/flatsql.wasm +0 -0
  63. package/wasm/flatsql.worker.js +209 -0
  64. package/wasm/index.d.ts +234 -0
  65. 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,3 @@
1
+ export * from './table-store.js';
2
+ export * from './database.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export * from './table-store.js';
2
+ export * from './database.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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":"AAAA,sDAAsD;AACtD,6DAA6D;AAgB7D,qEAAqE;AACrE,6DAA6D;AAC7D,MAAM,OAAO,aAAa;IAChB,KAAK,CAAc;IACnB,WAAW,CAAc;IACzB,YAAY,GAA6B,IAAI,GAAG,EAAE,CAAC;IAE3D,YAAY,KAAkB,EAAE,YAAoB,EAAE,aAAqB,YAAY;QACrF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG;YACjB,KAAK,EAAE,IAAI,UAAU,EAAE;YACvB,KAAK,EAAE;gBACL,CAAC,IAAI,UAAU,EAAE,CAAC,EAAE,YAAY;aACjC;SACF,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,mBAAmB,CAAC,SAAiB,EAAE,YAAoB;QACzD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE;YAC/B,KAAK,EAAE,IAAI,SAAS,MAAM;YAC1B,KAAK,EAAE;gBACL,CAAC,IAAI,SAAS,MAAM,CAAC,EAAE,YAAY;aACpC;SACF,CAAC,CAAC;IACL,CAAC;IAED,6BAA6B;IACrB,SAAS,CAAC,SAAkB;QAClC,IAAI,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,oDAAoD;IACpD,QAAQ,CAAC,IAAgB,EAAE,IAAc;QACvC,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrD,IAAI,EAAE,WAAW;gBACjB,IAAI;aACL,CAAC,CAAC;YAEH,+BAA+B;YAC/B,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yCAAyC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,WAAW,CAAC,SAAiB,EAAE,MAA2B;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,oCAAoC;IACpC,MAAM,CAAC,IAAgB,EAAE,SAAkB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE;YAC3C,IAAI,EAAE,WAAW;YACjB,IAAI;SACL,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,oCAAoC;IACpC,QAAQ,CAAC,GAAwB,EAAE,SAAkB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;CACF;AAED,8DAA8D;AAC9D,8DAA8D;AAC9D,MAAM,OAAO,cAAc;IACjB,SAAS,GAA2D,IAAI,GAAG,EAAE,CAAC;IAC9E,QAAQ,GAA6D,IAAI,GAAG,EAAE,CAAC;IAEvF,wCAAwC;IACxC,gBAAgB,CACd,SAAiB,EACjB,QAAmD;QAEnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,wCAAwC;IACxC,eAAe,CACb,SAAiB,EACjB,OAAoD;QAEpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,QAAQ,CAAC,IAAgB,EAAE,IAAc;QACvC,+CAA+C;QAC/C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;YACtB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,SAAiB,EAAE,MAA2B;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;CACF"}
@@ -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"}