@g9tm/syncdata 1.2.2 → 1.3.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 (56) hide show
  1. package/PARITY.md +26 -2
  2. package/dist/abstractions/errors.d.ts +4 -0
  3. package/dist/abstractions/errors.js +4 -0
  4. package/dist/abstractions/errors.js.map +1 -1
  5. package/dist/client/engine.js +93 -51
  6. package/dist/client/engine.js.map +1 -1
  7. package/dist/client/runs.d.ts +5 -0
  8. package/dist/client/runs.js +8 -7
  9. package/dist/client/runs.js.map +1 -1
  10. package/dist/client/storeTypes.d.ts +22 -1
  11. package/dist/client/storeTypes.js +27 -0
  12. package/dist/client/storeTypes.js.map +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/node/index.d.ts +1 -0
  17. package/dist/node/index.js +1 -0
  18. package/dist/node/index.js.map +1 -1
  19. package/dist/node/snapshotFileSink.d.ts +3 -0
  20. package/dist/node/snapshotFileSink.js +79 -0
  21. package/dist/node/snapshotFileSink.js.map +1 -0
  22. package/dist/protocol/dtos.d.ts +76 -0
  23. package/dist/protocol/dtos.js +2 -0
  24. package/dist/protocol/dtos.js.map +1 -1
  25. package/dist/protocol/wire.d.ts +3 -1
  26. package/dist/protocol/wire.js +49 -0
  27. package/dist/protocol/wire.js.map +1 -1
  28. package/dist/sqlite/apply.d.ts +21 -1
  29. package/dist/sqlite/apply.js +218 -114
  30. package/dist/sqlite/apply.js.map +1 -1
  31. package/dist/sqlite/connection.d.ts +5 -0
  32. package/dist/sqlite/connection.js +17 -0
  33. package/dist/sqlite/connection.js.map +1 -1
  34. package/dist/sqlite/index.d.ts +2 -1
  35. package/dist/sqlite/index.js +1 -0
  36. package/dist/sqlite/index.js.map +1 -1
  37. package/dist/sqlite/options.d.ts +39 -1
  38. package/dist/sqlite/options.js +5 -1
  39. package/dist/sqlite/options.js.map +1 -1
  40. package/dist/sqlite/push.js +4 -1
  41. package/dist/sqlite/push.js.map +1 -1
  42. package/dist/sqlite/query.js +44 -15
  43. package/dist/sqlite/query.js.map +1 -1
  44. package/dist/sqlite/revocation.d.ts +1 -1
  45. package/dist/sqlite/revocation.js +4 -2
  46. package/dist/sqlite/revocation.js.map +1 -1
  47. package/dist/sqlite/snapshotFiles.d.ts +51 -0
  48. package/dist/sqlite/snapshotFiles.js +516 -0
  49. package/dist/sqlite/snapshotFiles.js.map +1 -0
  50. package/dist/sqlite/sql.d.ts +1 -1
  51. package/dist/sqlite/sql.js +4 -0
  52. package/dist/sqlite/sql.js.map +1 -1
  53. package/dist/sqlite/store.d.ts +20 -2
  54. package/dist/sqlite/store.js +147 -78
  55. package/dist/sqlite/store.js.map +1 -1
  56. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/sqlite/apply.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Apply.cs: the apply engine shared by pulls, reconciliation and push\n// results. It runs inside one write transaction with g9_ctx.applying = 1, so capture triggers ignore library writes (D-03).\n//\n// Bridge cost shapes the TypeScript form: on Lynx every driver call is a native round trip, so the row path queues its\n// statements and runs them in batches, and the per-row decisions the .NET store makes from a statement's result happen in\n// SQL instead — the metadata upsert reads changes() of the row upsert before it, and the clock moves with\n// `UPDATE g9_clock … WHERE changes() > 0` right after. The rows, metadata and clock end up exactly as the .NET store\n// leaves them (the parity tests compare both stores' databases).\nimport { G9EMoveOutPolicy } from '../abstractions/enums.js';\nimport { G9SyncErrorCodes, G9SyncException } from '../abstractions/errors.js';\nimport { G9Long } from '../abstractions/long.js';\nimport { delay } from '../internal/abort.js';\nimport { G9ApplyReport, G9ERevocationReason, REASON_TABLE_NOT_EMPTY, type G9ApplySlice } from '../client/storeTypes.js';\nimport { G9EPullPartKind, type G9DtBackfillRequest, type G9DtNegotiatedTable, type G9DtPullPlan } from '../protocol/dtos.js';\nimport { G9ERowBatchOp, G9RowBatchFormatError } from '../protocol/rowBatch/format.js';\nimport { openRowBatch, type G9RowBatchReader } from '../protocol/rowBatch/reader.js';\nimport { asNumber, asString, G9StatementBatch, type G9SqliteConnection } from './connection.js';\nimport type { G9SqlResult, G9SqlValue } from './driver.js';\nimport { findByServerName, keyValue, meta, nowMs, persistedJson, readPersistedDefinitions, readSubscriptions, type LocalTable, type StoreInternals } from './internals.js';\nimport { disposeReleasedRow, REVOKED_REJECTION_CODE } from './revocation.js';\nimport { bit, EPHEMERAL_SLOT, quote } from './sql.js';\nimport { frameValueToSql } from './values.js';\n\nconst NEXT_SEQ = '(SELECT seq FROM g9_clock WHERE id = 1) + 1';\nconst BUMP_IF_CHANGED = 'UPDATE g9_clock SET seq = seq + 1 WHERE id = 1 AND changes() > 0';\nconst BUMP = 'UPDATE g9_clock SET seq = seq + 1 WHERE id = 1';\n\n/** The state of one apply transaction (`ApplyContext`). */\nexport class ApplyContext {\n readonly connection: G9SqliteConnection;\n readonly batch: G9StatementBatch;\n readonly report = new G9ApplyReport();\n readonly dirty = new Set<string>();\n readonly subscriptions = new Map<string, { slot: number; ephemeral: boolean }>();\n readonly policies = new Map<string, G9EMoveOutPolicy>();\n readonly backfillColumns = new Map<number, readonly string[]>();\n readonly deferredIndexes: { name: string; sql: string }[] = [];\n /** Library triggers dropped for the apply, re-created from this SQL before commit. */\n readonly droppedTriggers: { name: string; sql: string }[] = [];\n rows = 0;\n hasRevoked = false;\n private readonly _dirtyTables = new Set<number>();\n private readonly _tableTime = new Map<string, number>();\n private readonly _progress: ((rows: number) => void) | null;\n private readonly _maxChangedKeys: number;\n private readonly _signal: AbortSignal | undefined;\n\n constructor(connection: G9SqliteConnection, progress: ((rows: number) => void) | null, maxChangedKeys: number, statementsPerBatch: number, signal?: AbortSignal) {\n this.connection = connection;\n this.batch = new G9StatementBatch(connection, statementsPerBatch);\n this._progress = progress;\n this._maxChangedKeys = maxChangedKeys;\n this._signal = signal;\n }\n\n addDirty(tid: number, key: string): void {\n this.dirty.add(tid + '\\u0000' + key);\n this._dirtyTables.add(tid);\n }\n\n isDirty(tid: number, key: string): boolean {\n return this._dirtyTables.has(tid) && this.dirty.has(tid + '\\u0000' + key);\n }\n\n hasDirty(tid: number): boolean {\n return this._dirtyTables.has(tid);\n }\n\n wantsChangedKey(table: string): boolean {\n const keys = this.report.changedKeys[table];\n return !keys || keys.length < this._maxChangedKeys;\n }\n\n addChanged(table: string, key: string): void {\n const keys = this.report.changedKeys[table] ?? (this.report.changedKeys[table] = []);\n if (keys.length < this._maxChangedKeys) keys.push(key);\n }\n\n tick(): void {\n this.rows++;\n if (this._progress && this.rows % 1000 === 0) this._progress(this.rows);\n }\n\n /** Queues a script; flushes when the batch is full. */\n async queue(script: string, params?: Parameters<G9StatementBatch['add']>[1], callback?: (results: G9SqlResult[]) => void): Promise<void> {\n if (this.batch.add(script, params, callback)) await this.flush();\n }\n\n /** Runs what is queued (before anything that reads, and at the end). Yields to the event loop between batches. */\n async flush(): Promise<void> {\n if (this.batch.count === 0) return;\n await this.batch.flush(this._signal);\n // Lynx: let the background thread breathe between bridge calls of a long apply.\n await delay(0);\n }\n\n addTableTime(table: string, rows: number, elapsedMs: number): void {\n this._tableTime.set(table.toLowerCase(), (this._tableTime.get(table.toLowerCase()) ?? 0) + elapsedMs);\n const diagnostics = this.report.diagnostics;\n diagnostics.rowsByTable[table] = (diagnostics.rowsByTable[table] ?? 0) + rows;\n this._tableNames.set(table.toLowerCase(), table);\n }\n\n private readonly _tableNames = new Map<string, string>();\n\n publishTableTimes(): void {\n this._tableTime.forEach((ms, lower) => {\n this.report.diagnostics.msByTable[this._tableNames.get(lower) ?? lower] = Math.floor(ms);\n });\n }\n}\n\n/**\n * Opens an apply and decides which rows it may not touch (`BeginApply`). `dirtyAfterSequence` narrows the protected set to\n * pending changes after it; `changedAfterSequence` widens it with every row changed after it (ADR-0046).\n */\nexport async function beginApply(\n store: StoreInternals,\n connection: G9SqliteConnection,\n options: {\n dirtyAfterSequence?: number | null;\n progress?: ((rows: number) => void) | null;\n backfills?: readonly G9DtBackfillRequest[];\n snapshotRows?: Map<number, number> | null;\n changedAfterSequence?: number | null;\n protectedRows?: { tid: number; key: string }[] | null;\n skipTriggers?: boolean;\n signal?: AbortSignal;\n },\n): Promise<ApplyContext> {\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\n const context = new ApplyContext(connection, options.progress ?? null, store.options.maxChangedKeysPerTable, store.options.statementsPerBatch, options.signal);\n\n if (options.protectedRows) {\n for (const { tid, key } of options.protectedRows) context.addDirty(tid, key);\n } else {\n const rows =\n options.dirtyAfterSequence === null || options.dirtyAfterSequence === undefined\n ? await connection.query('SELECT tid, pk FROM g9_rows WHERE dirty <> 0')\n : await connection.query('SELECT tid, pk FROM g9_rows WHERE dirty <> 0 AND local_seq > $m', { $m: options.dirtyAfterSequence });\n for (const r of rows) context.addDirty(asNumber(r[0]), asString(r[1]));\n if (options.changedAfterSequence !== null && options.changedAfterSequence !== undefined) {\n await readRowsChangedAfter(store, connection, options.changedAfterSequence, (tid, key) => context.addDirty(tid, key));\n }\n // Rows touched by a command the server has not executed yet keep their optimistic state until its result settles them.\n for (const r of await connection.query('SELECT r.tid, r.pk FROM g9_command_rows r JOIN g9_commands c ON c.command_id = r.command_id WHERE c.state = 0')) {\n context.addDirty(asNumber(r[0]), asString(r[1]));\n }\n }\n\n context.hasRevoked = (await connection.scalar('SELECT 1 FROM g9_revoked LIMIT 1')) !== null;\n\n const definitions = readPersistedDefinitions(await meta(connection, 'definitions_json'));\n const policyByName = new Map<string, G9EMoveOutPolicy>();\n for (const d of definitions) policyByName.set(d.name, d.moveOutPolicy);\n for (const record of await readSubscriptions(connection, null)) {\n context.subscriptions.set(record.key, { slot: record.slot, ephemeral: record.ephemeral });\n context.policies.set(record.key, policyByName.get(record.name) ?? G9EMoveOutPolicy.Delete);\n }\n for (const backfill of options.backfills ?? []) context.backfillColumns.set(backfill.tableId, backfill.columns);\n\n const diagnostics = context.report.diagnostics;\n diagnostics.transactions = 1;\n if (store.options.skipTriggersDuringApply) {\n const foreign = await foreignTriggerNames(store, connection);\n if (foreign.length > 0) {\n for (const name of foreign.slice(0, 10)) diagnostics.foreignTriggers.push(name);\n } else if (options.skipTriggers) {\n // No SQLITE_DBCONFIG_ENABLE_TRIGGER through a driver: the library's own triggers leave for the apply and come back,\n // byte for byte, before the commit (PARITY.md). DDL is transactional: readers never see them gone.\n const rows = await connection.query(\"SELECT name, sql FROM sqlite_master WHERE type = 'trigger' AND sql IS NOT NULL ORDER BY name\");\n for (const r of rows) {\n const name = asString(r[0]);\n if (!isLibraryTrigger(store, name)) continue;\n context.droppedTriggers.push({ name, sql: asString(r[1]) });\n }\n for (const trigger of context.droppedTriggers) await connection.exec('DROP TRIGGER ' + quote(trigger.name));\n if (context.droppedTriggers.length > 0) diagnostics.transactionsWithTriggersSkipped = 1;\n }\n }\n if (options.snapshotRows && store.options.rebuildIndexesAfterRows > 0) await deferIndexes(store, context, options.snapshotRows);\n return context;\n}\n\n/** `EndApply`: rebuilds deferred indexes, re-creates dropped triggers, clears the applying flag. */\nexport async function endApply(context: ApplyContext): Promise<void> {\n await context.flush();\n if (context.deferredIndexes.length > 0) {\n const started = Date.now();\n for (const index of context.deferredIndexes) await context.connection.exec(index.sql);\n context.deferredIndexes.length = 0;\n context.report.diagnostics.indexRebuildMs += Date.now() - started;\n }\n if (context.droppedTriggers.length > 0) {\n for (const trigger of context.droppedTriggers) await context.connection.runStatements([{ sql: trigger.sql, params: [] }]);\n context.droppedTriggers.length = 0;\n }\n context.publishTableTimes();\n await context.connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\n}\n\n/** `g9_{table}_{ai|au|ad|ci|cu|cd}` for a table of the model. */\nexport function isLibraryTrigger(store: StoreInternals, name: string): boolean {\n const separator = name.lastIndexOf('_');\n if (separator <= 3 || name.slice(0, 3).toLowerCase() !== 'g9_') return false;\n const suffix = name.slice(separator + 1).toLowerCase();\n return ['ai', 'au', 'ad', 'ci', 'cu', 'cd'].indexOf(suffix) >= 0 && store.byLocal.has(name.slice(3, separator).toLowerCase());\n}\n\n/** The triggers the library did not create. */\nexport async function foreignTriggerNames(store: StoreInternals, connection: G9SqliteConnection): Promise<string[]> {\n const foreign: string[] = [];\n for (const r of await connection.query(\"SELECT name FROM sqlite_master WHERE type = 'trigger' ORDER BY name\")) {\n const name = asString(r[0]);\n if (!isLibraryTrigger(store, name)) foreign.push(name);\n }\n return foreign;\n}\n\n/** Rows changed after a sequence, table by table (`g9_rows_feed (tid, local_seq)` serves each read). */\nexport async function readRowsChangedAfter(store: StoreInternals, connection: G9SqliteConnection, sequence: number, add: (tid: number, key: string) => void): Promise<void> {\n for (const table of store.byLocal.values()) {\n for (const r of await connection.query('SELECT pk FROM g9_rows WHERE tid = $t AND local_seq > $c', { $t: table.tid, $c: sequence })) add(table.tid, asString(r[0]));\n }\n}\n\n/** Rows each table receives from snapshot parts of a plan, by server table id. */\nexport function snapshotRowsByTable(plan: G9DtPullPlan): Map<number, number> {\n const out = new Map<number, number>();\n for (const part of plan.parts) {\n if (part.kind === G9EPullPartKind.Snapshot) out.set(part.tableId, (out.get(part.tableId) ?? 0) + part.rows);\n }\n return out;\n}\n\n/** Drops the plain indexes of tables a large snapshot fills (`DeferIndexes`, ADR-0034/0058). */\nasync function deferIndexes(store: StoreInternals, context: ApplyContext, snapshotRows: Map<number, number>): Promise<void> {\n const connection = context.connection;\n for (const [serverTableId, rows] of Array.from(snapshotRows.entries())) {\n const table = store.byServerId.get(serverTableId);\n if (rows < store.options.rebuildIndexesAfterRows || !table) continue;\n if ((await connection.scalar(`SELECT 1 FROM ${table.quoted} LIMIT 1`)) !== null) {\n const growth = store.options.rebuildIndexesMinimumGrowth;\n const existing = growth > 0 ? asNumber(await connection.scalar(`SELECT count(*) FROM ${table.quoted}`)) : Number.MAX_SAFE_INTEGER;\n if (growth <= 0 || rows < existing * growth) {\n context.report.diagnostics.liveIndexReasons[table.model.localName] = REASON_TABLE_NOT_EMPTY;\n continue;\n }\n }\n const indexes = (\n await connection.query(\n \"SELECT m.name, m.sql FROM pragma_index_list($t) AS i JOIN sqlite_master AS m ON m.type = 'index' AND m.name = i.name \" +\n 'WHERE i.origin = \\'c\\' AND i.\"unique\" = 0 AND m.sql IS NOT NULL',\n { $t: table.model.localName },\n )\n ).map((r) => ({ name: asString(r[0]), sql: asString(r[1]) }));\n for (const index of indexes) {\n await connection.exec('DROP INDEX ' + quote(index.name));\n context.deferredIndexes.push(index);\n }\n if (indexes.length === 0) continue;\n context.report.diagnostics.deferredIndexes[table.model.localName] = indexes.length;\n store.log('debug', 20111, `G9SyncData loads ${rows} row(s) into ${table.model.localName}: ${indexes.length} index(es) rebuilt after the load`);\n }\n}\n\n/** `synchronous=NORMAL` while a transaction writes only server-derived data (WAL only); returns the restore action. */\nexport async function downloadDurability(store: StoreInternals, connection: G9SqliteConnection): Promise<(() => Promise<void>) | null> {\n if (!store.options.synchronousNormalForDownloads) return null;\n if (asString(await connection.scalar('PRAGMA journal_mode')).toLowerCase() !== 'wal') return null;\n const previous = asNumber(await connection.scalar('PRAGMA synchronous'));\n if (previous <= 1) return null;\n await connection.exec('PRAGMA synchronous = NORMAL');\n return async () => {\n await connection.exec('PRAGMA synchronous = ' + previous);\n };\n}\n\n/** Applies one frame (`ApplyFrame`). */\nexport async function applyFrame(store: StoreInternals, context: ApplyContext, frame: Uint8Array, subscriptionKey: string | null): Promise<void> {\n let slot = -1;\n let ephemeral = false;\n let policy: G9EMoveOutPolicy = G9EMoveOutPolicy.Delete;\n if (subscriptionKey !== null) {\n const subscription = context.subscriptions.get(subscriptionKey);\n if (subscription) {\n slot = subscription.slot;\n ephemeral = subscription.ephemeral;\n policy = context.policies.get(subscriptionKey) ?? G9EMoveOutPolicy.Delete;\n }\n }\n const reader = await openRowBatch(frame, { maxBodyBytes: store.options.maxDecodedFrameBytes, decompressor: store.options.frameDecompressor });\n while (reader.nextSection()) {\n const table = store.byServerId.get(reader.tableId);\n if (!table || !table.negotiated) continue;\n const started = Date.now();\n const rowsBefore = context.rows;\n switch (reader.op) {\n case G9ERowBatchOp.Upsert:\n await applyUpserts(store, context, reader, table, slot, ephemeral ? subscriptionKey : null);\n break;\n case G9ERowBatchOp.Backfill:\n await applyBackfill(store, context, reader, table);\n break;\n case G9ERowBatchOp.Tombstone:\n while (reader.readRow()) await applyTombstone(context, table, reader.key, reader.version);\n break;\n case G9ERowBatchOp.MoveOut:\n while (reader.readRow()) {\n if (slot >= 0) await moveOut(store, context, table, reader.key, subscriptionKey as string, slot, ephemeral, policy);\n }\n break;\n }\n context.addTableTime(table.model.localName, context.rows - rowsBefore, Date.now() - started);\n }\n}\n\n/** The download row path (`ApplyUpserts`): a guarded upsert and a metadata upsert per row, batched. */\nasync function applyUpserts(store: StoreInternals, context: ApplyContext, reader: G9RowBatchReader, table: LocalTable, slot: number, ephemeralKey: string | null): Promise<void> {\n const columns = (table.negotiated as G9DtNegotiatedTable).columns;\n if (reader.columnCount !== columns.length) {\n throw new G9RowBatchFormatError(`${table.model.localName}: the frame has ${reader.columnCount} columns, ${columns.length} were negotiated.`);\n }\n const targets: { name: string; type: number; frame: number }[] = [];\n columns.forEach((c, i) => {\n if (table.model.indexOf(c.name) >= 0) targets.push({ name: c.name, type: c.type, frame: i });\n });\n const membership = slot >= 0 ? bit(slot).toSqlValue() : 0;\n const names = targets.map((t) => quote(t.name));\n // The update half is guarded (ADR-0058): a row that already holds exactly these values is not rewritten. IS NOT, so\n // NULLs compare; excluded.* carries the column's affinity.\n const upsertSql =\n `INSERT INTO ${table.quoted} (${table.keyQuoted}${names.map((n) => ', ' + n).join('')}) VALUES (?1${names.map((_, i) => ', ?' + (i + 2)).join('')}) ` +\n (names.length === 0\n ? `ON CONFLICT(${table.keyQuoted}) DO NOTHING`\n : `ON CONFLICT(${table.keyQuoted}) DO UPDATE SET ${names.map((n) => n + ' = excluded.' + n).join(', ')} WHERE ${names.map((n) => n + ' IS NOT excluded.' + n).join(' OR ')}`);\n // One statement for both of the .NET store's metadata statements: when the row upsert just changed the row (changes() of\n // the statement before), the metadata is rewritten; otherwise only when the metadata itself differs.\n const metaSql =\n 'INSERT INTO g9_rows (tid, pk, server_ver, local_seq, subs, dirty, dirty_mask, rejected, deleted) VALUES (?1, ?2, ?3, ' +\n NEXT_SEQ +\n ', ?4, 0, 0, 0, 0) ' +\n 'ON CONFLICT(tid, pk) DO UPDATE SET server_ver = excluded.server_ver, local_seq = excluded.local_seq, subs = subs | excluded.subs, ' +\n 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0 ' +\n 'WHERE changes() > 0 OR server_ver IS NOT excluded.server_ver OR (subs | excluded.subs) <> subs OR dirty <> 0 OR dirty_mask <> 0 OR rejected <> 0 OR deleted <> 0';\n const dirtyTable = context.hasDirty(table.tid);\n const localName = table.model.localName;\n\n while (reader.readRow()) {\n const key = reader.key;\n if (dirtyTable && context.isDirty(table.tid, key)) {\n if (slot >= 0) await addMembership(context, table, key, slot, ephemeralKey);\n context.report.skippedDirty++;\n context.tick();\n continue;\n }\n const values: G9SqlValue[] = [keyValue(table, key)];\n for (const target of targets) values.push(frameValueToSql(reader, target.frame, target.type, store.options));\n const statements = [\n { sql: upsertSql, params: values },\n { sql: metaSql, params: [table.tid, key, reader.versionLong.toSqlValue(), membership] },\n { sql: BUMP_IF_CHANGED, params: [] },\n ];\n if (ephemeralKey !== null) statements.push({ sql: 'INSERT OR IGNORE INTO g9_ephemeral_rows (sub_key, tid, pk) VALUES (?1, ?2, ?3)', params: [ephemeralKey, table.tid, key] });\n if (context.hasRevoked && slot >= 0) {\n statements.push({ sql: 'DELETE FROM g9_revoked WHERE tid = ?1 AND pk = ?2', params: [table.tid, key] });\n statements.push({ sql: 'DELETE FROM g9_rejections WHERE tid = ?1 AND pk = ?2 AND code = ?3', params: [table.tid, key, REVOKED_REJECTION_CODE] });\n }\n const full = context.batch.addStatements(statements, (results) => {\n const changed = ((results[0] as G9SqlResult).changes ?? 0) > 0;\n if (!changed) context.report.unchangedRows++;\n context.report.upserts++;\n if (changed && context.wantsChangedKey(localName)) context.addChanged(localName, key);\n });\n context.tick();\n if (full) await context.flush();\n }\n}\n\n/** `ApplyBackfill`: only the backfilled columns of rows the client already holds. */\nasync function applyBackfill(store: StoreInternals, context: ApplyContext, reader: G9RowBatchReader, table: LocalTable): Promise<void> {\n const names = context.backfillColumns.get((table.negotiated as G9DtNegotiatedTable).tableId);\n if (!names || names.length !== reader.columnCount) {\n while (reader.readRow()) {\n // skip\n }\n return;\n }\n const targets: { name: string; index: number; local: number }[] = [];\n names.forEach((name, i) => {\n const local = table.model.indexOf(name);\n if (local >= 0) targets.push({ name, index: i, local });\n });\n if (targets.length === 0) return;\n const sql = `UPDATE ${table.quoted} SET ${targets.map((t, i) => quote(t.name) + ' = ?' + (i + 1)).join(', ')} WHERE ${table.keyQuoted} = ?${targets.length + 1}`;\n while (reader.readRow()) {\n const key = reader.key;\n if (context.isDirty(table.tid, key)) {\n context.report.skippedDirty++;\n continue;\n }\n const params: G9SqlValue[] = targets.map((t) => frameValueToSql(reader, t.index, (table.model.columns[t.local] as { type: number }).type, store.options));\n params.push(keyValue(table, key));\n if (context.batch.addStatements([{ sql, params }])) await context.flush();\n context.tick();\n }\n}\n\n/** `ApplyTombstone`. */\nasync function applyTombstone(context: ApplyContext, table: LocalTable, key: string, version: number): Promise<void> {\n if (context.isDirty(table.tid, key)) {\n context.report.skippedDirty++;\n return;\n }\n const localName = table.model.localName;\n const full = context.batch.addStatements(\n [\n { sql: `DELETE FROM ${table.quoted} WHERE ${table.keyQuoted} = ?1`, params: [keyValue(table, key)] },\n {\n sql: 'UPDATE g9_rows SET deleted = 1, subs = 0, server_ver = ?1, local_seq = ' + NEXT_SEQ + ', dirty = 0, dirty_mask = 0 WHERE tid = ?2 AND pk = ?3 AND deleted = 0',\n params: [version, table.tid, key],\n },\n { sql: 'DELETE FROM g9_ephemeral_rows WHERE tid = ?1 AND pk = ?2', params: [table.tid, key] },\n { sql: BUMP, params: [] },\n ],\n (results) => {\n if (((results[0] as G9SqlResult).changes ?? 0) > 0) {\n context.report.deletes++;\n context.addChanged(localName, key);\n }\n },\n );\n context.tick();\n if (full) await context.flush();\n}\n\n/** `MoveOut`: drops the membership; with a Delete policy a row nobody holds goes through the revocation policy. */\nexport async function moveOut(\n store: StoreInternals,\n context: ApplyContext,\n table: LocalTable,\n key: string,\n subscriptionKey: string,\n slot: number,\n ephemeral: boolean,\n policy: G9EMoveOutPolicy,\n): Promise<void> {\n if (ephemeral) {\n context.batch.add('DELETE FROM g9_ephemeral_rows WHERE sub_key = $k AND tid = $t AND pk = $pk', { $k: subscriptionKey, $t: table.tid, $pk: key });\n context.batch.add('UPDATE g9_rows SET subs = subs & $n WHERE tid = $t AND pk = $pk AND NOT EXISTS (SELECT 1 FROM g9_ephemeral_rows WHERE tid = $t AND pk = $pk)', {\n $n: bit(EPHEMERAL_SLOT).not(),\n $t: table.tid,\n $pk: key,\n });\n } else {\n context.batch.add('UPDATE g9_rows SET subs = subs & $n WHERE tid = $t AND pk = $pk', { $n: bit(slot).not(), $t: table.tid, $pk: key });\n }\n context.report.moveOuts++;\n if (policy !== G9EMoveOutPolicy.Delete) {\n if (context.batch.count >= store.options.statementsPerBatch) await context.flush();\n return;\n }\n // No subscription holds it any more? The revocation policy decides (ADR-0026). It reads the row: run what is queued first.\n await context.flush();\n const removed = await disposeReleasedRow(store, context.connection, table, key, G9ERevocationReason.LeftScope, subscriptionKey, context.report);\n await context.connection.exec(BUMP);\n if (removed) context.addChanged(table.model.localName, key);\n}\n\n/** `AddMembership`. */\nexport async function addMembership(context: ApplyContext, table: LocalTable, key: string, slot: number, ephemeralKey: string | null): Promise<void> {\n context.batch.add('UPDATE g9_rows SET subs = subs | $b WHERE tid = $t AND pk = $pk AND deleted = 0', { $b: bit(slot), $t: table.tid, $pk: key });\n if (ephemeralKey !== null) context.batch.add('INSERT OR IGNORE INTO g9_ephemeral_rows (sub_key, tid, pk) VALUES ($k, $t, $pk)', { $k: ephemeralKey, $t: table.tid, $pk: key });\n}\n\n/** The rows an apply must not touch, read before the first slice commits (`ReadProtectedRows`). */\nasync function readProtectedRows(store: StoreInternals, connection: G9SqliteConnection, changedAfterSequence: number): Promise<{ tid: number; key: string }[]> {\n const rows: { tid: number; key: string }[] = [];\n for (const r of await connection.query('SELECT tid, pk FROM g9_rows WHERE dirty <> 0')) rows.push({ tid: asNumber(r[0]), key: asString(r[1]) });\n await readRowsChangedAfter(store, connection, changedAfterSequence, (tid, key) => rows.push({ tid, key }));\n for (const r of await connection.query('SELECT r.tid, r.pk FROM g9_command_rows r JOIN g9_commands c ON c.command_id = r.command_id WHERE c.state = 0')) {\n rows.push({ tid: asNumber(r[0]), key: asString(r[1]) });\n }\n return rows;\n}\n\n/** `ApplyStagedPullAsync`: atomic, or in committed slices (ADR-0053); cursors move only with the last slice. */\nexport async function applyStagedPull(\n store: StoreInternals,\n runId: string,\n rowsApplied: ((rows: number) => void) | null,\n slices: ((slice: G9ApplySlice) => void) | null,\n readStagedRun: (connection: G9SqliteConnection, runId: string) => Promise<import('../client/storeTypes.js').G9StagedPull | null>,\n signal?: AbortSignal,\n): Promise<G9ApplyReport> {\n store.ensureInitialized();\n return store.writeLock.run(async () => {\n const connection = store.writer();\n const restore = await downloadDurability(store, connection);\n try {\n const staged = await readStagedRun(connection, runId);\n if (!staged) throw new G9SyncException(G9SyncErrorCodes.LocalStoreError, 'The staged pull no longer exists.');\n const sequences = (await connection.query('SELECT seq FROM g9_stage WHERE run_id = $r AND payload IS NOT NULL ORDER BY seq', { $r: runId })).map((r) => asNumber(r[0]));\n\n // Slicing only pays for itself when someone is listening for the slices (ADR-0053); a LARGE snapshot stays in one\n // transaction with its indexes deferred (ADR-0056/0058).\n const sliceRows = slices === null ? 0 : store.options.applySliceRows;\n const snapshotRows = snapshotRowsByTable(staged.plan);\n let largeSnapshot = false;\n if (store.options.rebuildIndexesAfterRows > 0) snapshotRows.forEach((rows) => (largeSnapshot = largeSnapshot || rows >= store.options.rebuildIndexesAfterRows));\n const progressive = sliceRows > 0 && sequences.length > 1 && !largeSnapshot;\n // Read ONCE, before any slice commits (ADR-0046 + ADR-0053).\n const protectedRows = progressive ? await readProtectedRows(store, connection, staged.stageSequence) : null;\n const skipTriggers = staged.plan.totalRows >= store.options.skipTriggersMinRows && !progressive;\n\n const total = new G9ApplyReport();\n let appliedTotal = 0;\n let index = 0;\n const started = Date.now();\n let sliceBudget = sliceRows;\n\n // do/while: a pull with no payload chunks still writes its cursors and clears its stage, exactly once.\n do {\n if (signal && signal.aborted) throw cancellation();\n const slice: number[] = [];\n let final = true;\n for (; index < sequences.length; index++) {\n slice.push(sequences[index] as number);\n if (!progressive) continue;\n if ((await stagedRowCount(connection, runId, slice)) >= sliceBudget && index + 1 < sequences.length) {\n index++;\n final = false;\n break;\n }\n }\n if (store.options.applySliceRowsMax > sliceBudget) sliceBudget = Math.min(store.options.applySliceRowsMax, sliceBudget * 2);\n\n let context: ApplyContext | null = null;\n const syncedUpdates: { table: LocalTable; synced: string[] }[] = [];\n await connection.transaction('immediate', async () => {\n context = await beginApply(store, connection, {\n progress: rowsApplied,\n backfills: staged.backfills,\n snapshotRows: progressive ? null : snapshotRows,\n changedAfterSequence: staged.stageSequence,\n protectedRows,\n skipTriggers,\n signal,\n });\n for (const sequence of slice) {\n if (signal && signal.aborted) throw cancellation();\n const rows = await connection.query('SELECT payload, subscription_key FROM g9_stage WHERE run_id = $r AND seq = $s', { $r: runId, $s: sequence });\n const row = rows[0];\n if (!row) continue;\n const payload = row[0];\n if (!(payload instanceof ArrayBuffer)) continue;\n await applyFrame(store, context, new Uint8Array(payload), row[1] === null ? null : asString(row[1]));\n }\n\n if (final) {\n // Cursors move only here, and only when still the one the plan started from (ADR-0060; IS, a first pull plans from NULL).\n for (const cursor of staged.plan.cursors) {\n const update =\n 'UPDATE g9_subscriptions SET cursor = $c, definition_hash = $d, auth_hash = $a, state = 0, error_code = NULL, last_success_utc = $now WHERE key = $k';\n const params = { $c: cursor.cursor, $d: cursor.definitionHash, $a: cursor.authHash, $now: nowMs(), $k: cursor.key };\n if (Object.prototype.hasOwnProperty.call(staged.plannedFromCursors, cursor.key)) {\n await context.flush();\n await connection.exec(update + ' AND cursor IS $from', { ...params, $from: staged.plannedFromCursors[cursor.key] ?? null });\n } else {\n await context.flush();\n await connection.exec(update, params);\n }\n }\n for (const backfill of staged.backfills) {\n const table = store.byServerId.get(backfill.tableId);\n if (!table) continue;\n const synced = table.syncedColumns.slice();\n for (const column of backfill.columns) if (!synced.some((s) => s.toLowerCase() === column.toLowerCase())) synced.push(column);\n await connection.exec('UPDATE g9_tables SET synced_columns = $c WHERE tid = $t', { $c: persistedJson(synced), $t: table.tid });\n syncedUpdates.push({ table, synced });\n }\n }\n\n await endApply(context);\n if (slice.length > 0) await connection.exec('DELETE FROM g9_stage WHERE run_id = $r AND seq IN (' + slice.join(',') + ')', { $r: runId });\n if (final) await connection.exec('DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n });\n\n const applied = context as unknown as ApplyContext;\n for (const { table, synced } of syncedUpdates) table.syncedColumns = synced;\n appliedTotal += applied.rows;\n total.merge(applied.report);\n rowsApplied?.(appliedTotal);\n slices?.({ report: applied.report, rowsApplied: applied.rows, rowsAppliedTotal: appliedTotal, rowsPlanned: staged.plan.totalRows, isFinal: final });\n } while (index < sequences.length);\n\n total.diagnostics.elapsedMs = Date.now() - started;\n if (total.diagnostics.transactions > 0 && appliedTotal > 0) store.log('information', 20112, `G9SyncData applied ${appliedTotal} row(s): ${total.diagnostics.toString()}`);\n await maintainAfterApply(store, connection, appliedTotal);\n return total;\n } finally {\n if (restore) await restore();\n }\n });\n}\n\nfunction cancellation(): Error {\n const error = new Error('The operation was canceled.');\n error.name = 'AbortError';\n return error;\n}\n\nasync function stagedRowCount(connection: G9SqliteConnection, runId: string, slice: number[]): Promise<number> {\n return asNumber(await connection.scalar('SELECT coalesce(sum(row_count), 0) FROM g9_stage WHERE run_id = $r AND seq IN (' + slice.join(',') + ')', { $r: runId }));\n}\n\n/** Best-effort housekeeping after a large apply (`MaintainAfterApply`): planner statistics and one WAL checkpoint attempt. */\nasync function maintainAfterApply(store: StoreInternals, connection: G9SqliteConnection, appliedRows: number): Promise<void> {\n if (store.options.maintenanceAfterRows <= 0 || appliedRows < store.options.maintenanceAfterRows) return;\n try {\n await connection.exec('PRAGMA analysis_limit = 1000; PRAGMA optimize;');\n if (asString(await connection.scalar('PRAGMA journal_mode')).toLowerCase() !== 'wal') return;\n await connection.exec('PRAGMA busy_timeout = 250');\n try {\n const rows = await connection.query('PRAGMA wal_checkpoint(TRUNCATE)');\n if (rows[0] && asNumber(rows[0][0]) !== 0) {\n store.log('debug', 20113, `The WAL checkpoint after applying ${appliedRows} row(s) was blocked by a reader; the next one retries`);\n }\n } finally {\n await connection.exec('PRAGMA busy_timeout = ' + store.options.busyTimeoutMs);\n }\n } catch (error) {\n store.log('warning', 20114, `Maintenance after an apply failed and was skipped: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/** `ApplyReconcileAsync`. */\nexport async function applyReconcile(\n store: StoreInternals,\n subscriptionKey: string,\n table: G9DtNegotiatedTable,\n fetchedFrames: readonly Uint8Array[],\n addMembershipKeys: readonly string[],\n moveOutKeys: readonly string[],\n policy: G9EMoveOutPolicy,\n signal?: AbortSignal,\n): Promise<G9ApplyReport> {\n store.ensureInitialized();\n const local = findByServerName(store, table.name);\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\n return store.writeLock.run(async () => {\n const connection = store.writer();\n const restore = await downloadDurability(store, connection);\n try {\n return await connection.transaction('immediate', async () => {\n const context = await beginApply(store, connection, { backfills: [], signal });\n context.policies.set(subscriptionKey, policy);\n for (const frame of fetchedFrames) await applyFrame(store, context, frame, subscriptionKey);\n const subscription = context.subscriptions.get(subscriptionKey);\n if (subscription) {\n for (const key of addMembershipKeys) {\n await addMembership(context, local, key, subscription.slot, subscription.ephemeral ? subscriptionKey : null);\n context.report.membershipAdded++;\n }\n for (const key of moveOutKeys) await moveOut(store, context, local, key, subscriptionKey, subscription.slot, subscription.ephemeral, policy);\n }\n await endApply(context);\n return context.report;\n });\n } finally {\n if (restore) await restore();\n }\n });\n}\n\n/** For callers that need a G9Long bit as a bind value. */\nexport function bitValue(slot: number): G9Long {\n return bit(slot);\n}\n"]}
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/sqlite/apply.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Apply.cs: the apply engine shared by pulls, reconciliation and push\n// results. It runs inside one write transaction with g9_ctx.applying = 1, so capture triggers ignore library writes (D-03).\n//\n// Bridge cost shapes the TypeScript form: on Lynx every driver call is a native round trip, so the row path queues its\n// statements and runs them in batches, and the per-row decisions the .NET store makes from a statement's result happen in\n// SQL instead — the metadata upsert reads changes() of the row upsert before it, and the clock moves with\n// `UPDATE g9_clock … WHERE changes() > 0` right after. The rows, metadata and clock end up exactly as the .NET store\n// leaves them (the parity tests compare both stores' databases).\nimport { G9EMoveOutPolicy } from '../abstractions/enums.js';\nimport { G9SyncErrorCodes, G9SyncException } from '../abstractions/errors.js';\nimport { G9Long } from '../abstractions/long.js';\nimport { delay } from '../internal/abort.js';\nimport { G9ApplyReport, G9ERevocationReason, REASON_TABLE_NOT_EMPTY, type G9ApplySlice } from '../client/storeTypes.js';\nimport { G9EPullPartKind, type G9DtBackfillRequest, type G9DtNegotiatedTable, type G9DtPullPlan } from '../protocol/dtos.js';\nimport { G9ERowBatchOp, G9RowBatchFormatError } from '../protocol/rowBatch/format.js';\nimport { openRowBatch, type G9RowBatchReader } from '../protocol/rowBatch/reader.js';\nimport { asNumber, asString, G9StatementBatch, statementsOf, type G9SqliteConnection } from './connection.js';\nimport type { G9DriverStatement, G9SqlResult, G9SqlValue } from './driver.js';\nimport { findByServerName, keyValue, meta, nowMs, persistedJson, readPersistedDefinitions, readSubscriptions, type LocalTable, type StoreInternals } from './internals.js';\nimport { disposeReleasedRow, disposeReleasedRows, REVOKED_REJECTION_CODE } from './revocation.js';\nimport { bit, EPHEMERAL_SLOT, quote } from './sql.js';\nimport { frameValueToSql } from './values.js';\nimport {\n applySnapshotFile,\n attachedSchema,\n attachFiles,\n deleteFiles,\n fileSnapshotTimes,\n readStagedFiles,\n takeStagedFiles,\n verifyStagedFile,\n} from './snapshotFiles.js';\n\nconst NEXT_SEQ = '(SELECT seq FROM g9_clock WHERE id = 1) + 1';\nconst BUMP_IF_CHANGED = 'UPDATE g9_clock SET seq = seq + 1 WHERE id = 1 AND changes() > 0';\nconst BUMP = 'UPDATE g9_clock SET seq = seq + 1 WHERE id = 1';\n\n/** The state of one apply transaction (`ApplyContext`). */\nexport class ApplyContext {\n readonly connection: G9SqliteConnection;\n readonly batch: G9StatementBatch;\n readonly report = new G9ApplyReport();\n readonly dirty = new Set<string>();\n readonly subscriptions = new Map<string, { slot: number; ephemeral: boolean }>();\n readonly policies = new Map<string, G9EMoveOutPolicy>();\n readonly backfillColumns = new Map<number, readonly string[]>();\n readonly deferredIndexes: { name: string; sql: string }[] = [];\n /** Library triggers dropped for the apply, re-created from this SQL before commit. */\n readonly droppedTriggers: { name: string; sql: string }[] = [];\n rows = 0;\n hasRevoked = false;\n /** The database holds a trigger the library did not create: bulk disposals would not be exact (row by row then). */\n hasForeignTriggers = false;\n private readonly _dirtyTables = new Set<number>();\n private readonly _tableTime = new Map<string, number>();\n private readonly _progress: ((rows: number) => void) | null;\n private readonly _maxChangedKeys: number;\n private readonly _signal: AbortSignal | undefined;\n\n constructor(connection: G9SqliteConnection, progress: ((rows: number) => void) | null, maxChangedKeys: number, statementsPerBatch: number, signal?: AbortSignal) {\n this.connection = connection;\n this.batch = new G9StatementBatch(connection, statementsPerBatch);\n this._progress = progress;\n this._maxChangedKeys = maxChangedKeys;\n this._signal = signal;\n }\n\n addDirty(tid: number, key: string): void {\n this.dirty.add(tid + '\\u0000' + key);\n this._dirtyTables.add(tid);\n }\n\n isDirty(tid: number, key: string): boolean {\n return this._dirtyTables.has(tid) && this.dirty.has(tid + '\\u0000' + key);\n }\n\n hasDirty(tid: number): boolean {\n return this._dirtyTables.has(tid);\n }\n\n wantsChangedKey(table: string): boolean {\n const keys = this.report.changedKeys[table];\n return !keys || keys.length < this._maxChangedKeys;\n }\n\n get maxChangedKeys(): number {\n return this._maxChangedKeys;\n }\n\n /** Counts rows applied in bulk (a snapshot file's table) and reports progress once for them. */\n advance(rows: number): void {\n if (rows <= 0) return;\n this.rows += rows;\n if (this._progress) this._progress(this.rows);\n }\n\n addChanged(table: string, key: string): void {\n const keys = this.report.changedKeys[table] ?? (this.report.changedKeys[table] = []);\n if (keys.length < this._maxChangedKeys) keys.push(key);\n }\n\n tick(): void {\n this.rows++;\n if (this._progress && this.rows % 1000 === 0) this._progress(this.rows);\n }\n\n /** Queues a script; flushes when the batch is full. */\n async queue(script: string, params?: Parameters<G9StatementBatch['add']>[1], callback?: (results: G9SqlResult[]) => void): Promise<void> {\n if (this.batch.add(script, params, callback)) await this.flush();\n }\n\n /** Runs what is queued (before anything that reads, and at the end). Yields to the event loop between batches. */\n async flush(): Promise<void> {\n if (this.batch.count === 0) return;\n await this.batch.flush(this._signal);\n // Lynx: let the background thread breathe between bridge calls of a long apply.\n await delay(0);\n }\n\n addTableTime(table: string, rows: number, elapsedMs: number): void {\n this._tableTime.set(table.toLowerCase(), (this._tableTime.get(table.toLowerCase()) ?? 0) + elapsedMs);\n const diagnostics = this.report.diagnostics;\n diagnostics.rowsByTable[table] = (diagnostics.rowsByTable[table] ?? 0) + rows;\n this._tableNames.set(table.toLowerCase(), table);\n }\n\n private readonly _tableNames = new Map<string, string>();\n\n publishTableTimes(): void {\n this._tableTime.forEach((ms, lower) => {\n this.report.diagnostics.msByTable[this._tableNames.get(lower) ?? lower] = Math.floor(ms);\n });\n }\n}\n\n/**\n * Opens an apply and decides which rows it may not touch (`BeginApply`). `dirtyAfterSequence` narrows the protected set to\n * pending changes after it; `changedAfterSequence` widens it with every row changed after it (ADR-0046).\n */\nexport async function beginApply(\n store: StoreInternals,\n connection: G9SqliteConnection,\n options: {\n dirtyAfterSequence?: number | null;\n progress?: ((rows: number) => void) | null;\n backfills?: readonly G9DtBackfillRequest[];\n snapshotRows?: Map<number, number> | null;\n changedAfterSequence?: number | null;\n protectedRows?: { tid: number; key: string }[] | null;\n skipTriggers?: boolean;\n signal?: AbortSignal;\n },\n): Promise<ApplyContext> {\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\n const context = new ApplyContext(connection, options.progress ?? null, store.options.maxChangedKeysPerTable, store.options.statementsPerBatch, options.signal);\n\n if (options.protectedRows) {\n for (const { tid, key } of options.protectedRows) context.addDirty(tid, key);\n } else {\n const rows =\n options.dirtyAfterSequence === null || options.dirtyAfterSequence === undefined\n ? await connection.query('SELECT tid, pk FROM g9_rows WHERE dirty <> 0')\n : await connection.query('SELECT tid, pk FROM g9_rows WHERE dirty <> 0 AND local_seq > $m', { $m: options.dirtyAfterSequence });\n for (const r of rows) context.addDirty(asNumber(r[0]), asString(r[1]));\n if (options.changedAfterSequence !== null && options.changedAfterSequence !== undefined) {\n await readRowsChangedAfter(store, connection, options.changedAfterSequence, (tid, key) => context.addDirty(tid, key));\n }\n // Rows touched by a command the server has not executed yet keep their optimistic state until its result settles them.\n for (const r of await connection.query('SELECT r.tid, r.pk FROM g9_command_rows r JOIN g9_commands c ON c.command_id = r.command_id WHERE c.state = 0')) {\n context.addDirty(asNumber(r[0]), asString(r[1]));\n }\n }\n\n context.hasRevoked = (await connection.scalar('SELECT 1 FROM g9_revoked LIMIT 1')) !== null;\n\n const definitions = readPersistedDefinitions(await meta(connection, 'definitions_json'));\n const policyByName = new Map<string, G9EMoveOutPolicy>();\n for (const d of definitions) policyByName.set(d.name, d.moveOutPolicy);\n for (const record of await readSubscriptions(connection, null)) {\n context.subscriptions.set(record.key, { slot: record.slot, ephemeral: record.ephemeral });\n context.policies.set(record.key, policyByName.get(record.name) ?? G9EMoveOutPolicy.Delete);\n }\n for (const backfill of options.backfills ?? []) context.backfillColumns.set(backfill.tableId, backfill.columns);\n\n const diagnostics = context.report.diagnostics;\n diagnostics.transactions = 1;\n const foreign = await foreignTriggerNames(store, connection);\n context.hasForeignTriggers = foreign.length > 0;\n if (store.options.skipTriggersDuringApply) {\n if (foreign.length > 0) {\n for (const name of foreign.slice(0, 10)) diagnostics.foreignTriggers.push(name);\n } else if (options.skipTriggers) {\n // No SQLITE_DBCONFIG_ENABLE_TRIGGER through a driver: the library's own triggers leave for the apply and come back,\n // byte for byte, before the commit (PARITY.md). DDL is transactional: readers never see them gone.\n const rows = await connection.query(\"SELECT name, sql FROM sqlite_master WHERE type = 'trigger' AND sql IS NOT NULL ORDER BY name\");\n for (const r of rows) {\n const name = asString(r[0]);\n if (!isLibraryTrigger(store, name)) continue;\n context.droppedTriggers.push({ name, sql: asString(r[1]) });\n }\n for (const trigger of context.droppedTriggers) await connection.exec('DROP TRIGGER ' + quote(trigger.name));\n if (context.droppedTriggers.length > 0) diagnostics.transactionsWithTriggersSkipped = 1;\n }\n }\n if (options.snapshotRows && store.options.rebuildIndexesAfterRows > 0) await deferIndexes(store, context, options.snapshotRows);\n return context;\n}\n\n/** `EndApply`: rebuilds deferred indexes, re-creates dropped triggers, clears the applying flag. */\nexport async function endApply(context: ApplyContext): Promise<void> {\n await context.flush();\n if (context.deferredIndexes.length > 0) {\n const started = Date.now();\n for (const index of context.deferredIndexes) await context.connection.exec(index.sql);\n context.deferredIndexes.length = 0;\n context.report.diagnostics.indexRebuildMs += Date.now() - started;\n }\n if (context.droppedTriggers.length > 0) {\n for (const trigger of context.droppedTriggers) await context.connection.runStatements([{ sql: trigger.sql, params: [] }]);\n context.droppedTriggers.length = 0;\n }\n context.publishTableTimes();\n await context.connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\n}\n\n/** `g9_{table}_{ai|au|ad|ci|cu|cd}` for a table of the model. */\nexport function isLibraryTrigger(store: StoreInternals, name: string): boolean {\n const separator = name.lastIndexOf('_');\n if (separator <= 3 || name.slice(0, 3).toLowerCase() !== 'g9_') return false;\n const suffix = name.slice(separator + 1).toLowerCase();\n return ['ai', 'au', 'ad', 'ci', 'cu', 'cd'].indexOf(suffix) >= 0 && store.byLocal.has(name.slice(3, separator).toLowerCase());\n}\n\n/** The triggers the library did not create. */\nexport async function foreignTriggerNames(store: StoreInternals, connection: G9SqliteConnection): Promise<string[]> {\n const foreign: string[] = [];\n for (const r of await connection.query(\"SELECT name FROM sqlite_master WHERE type = 'trigger' ORDER BY name\")) {\n const name = asString(r[0]);\n if (!isLibraryTrigger(store, name)) foreign.push(name);\n }\n return foreign;\n}\n\n/**\n * Rows changed after a sequence, table by table (`g9_rows_feed (tid, local_seq)` serves each part) — as ONE statement:\n * a query per table cost a bridge call per table on every apply (LES-0055).\n */\nexport async function readRowsChangedAfter(store: StoreInternals, connection: G9SqliteConnection, sequence: number, add: (tid: number, key: string) => void): Promise<void> {\n const tids = Array.from(store.byLocal.values()).map((table) => table.tid);\n // SQLite allows 500 terms in a compound SELECT: one statement per 400 tables, all in one driver call.\n const statements: G9DriverStatement[] = [];\n for (let i = 0; i < tids.length; i += 400) {\n const sql = tids\n .slice(i, i + 400)\n .map((tid) => `SELECT ${tid} AS tid, pk FROM g9_rows WHERE tid = ${tid} AND local_seq > $c`)\n .join(' UNION ALL ');\n for (const statement of statementsOf(sql, { $c: sequence })) statements.push(statement);\n }\n for (const result of await connection.runStatements(statements)) for (const r of result.rows) add(asNumber(r[0]), asString(r[1]));\n}\n\n/** Rows each table receives from snapshot parts of a plan, by server table id. */\nexport function snapshotRowsByTable(plan: G9DtPullPlan): Map<number, number> {\n const out = new Map<number, number>();\n for (const part of plan.parts) {\n if (part.kind === G9EPullPartKind.Snapshot) out.set(part.tableId, (out.get(part.tableId) ?? 0) + part.rows);\n }\n return out;\n}\n\n/** Drops the plain indexes of tables a large snapshot fills (`DeferIndexes`, ADR-0034/0058). */\nasync function deferIndexes(store: StoreInternals, context: ApplyContext, snapshotRows: Map<number, number>): Promise<void> {\n const connection = context.connection;\n for (const [serverTableId, rows] of Array.from(snapshotRows.entries())) {\n const table = store.byServerId.get(serverTableId);\n if (rows < store.options.rebuildIndexesAfterRows || !table) continue;\n if ((await connection.scalar(`SELECT 1 FROM ${table.quoted} LIMIT 1`)) !== null) {\n const growth = store.options.rebuildIndexesMinimumGrowth;\n const existing = growth > 0 ? asNumber(await connection.scalar(`SELECT count(*) FROM ${table.quoted}`)) : Number.MAX_SAFE_INTEGER;\n if (growth <= 0 || rows < existing * growth) {\n context.report.diagnostics.liveIndexReasons[table.model.localName] = REASON_TABLE_NOT_EMPTY;\n continue;\n }\n }\n const indexes = (\n await connection.query(\n \"SELECT m.name, m.sql FROM pragma_index_list($t) AS i JOIN sqlite_master AS m ON m.type = 'index' AND m.name = i.name \" +\n 'WHERE i.origin = \\'c\\' AND i.\"unique\" = 0 AND m.sql IS NOT NULL',\n { $t: table.model.localName },\n )\n ).map((r) => ({ name: asString(r[0]), sql: asString(r[1]) }));\n for (const index of indexes) {\n await connection.exec('DROP INDEX ' + quote(index.name));\n context.deferredIndexes.push(index);\n }\n if (indexes.length === 0) continue;\n context.report.diagnostics.deferredIndexes[table.model.localName] = indexes.length;\n store.log('debug', 20111, `G9SyncData loads ${rows} row(s) into ${table.model.localName}: ${indexes.length} index(es) rebuilt after the load`);\n }\n}\n\n/**\n * What `downloadDurability` reads of a connection, read ONCE per connection: the store's connections set their journal\n * mode when they open and nobody else touches their `synchronous`, so asking again for every staged chunk only cost two\n * bridge calls per chunk (LES-0056).\n */\nconst durabilityOf = new WeakMap<G9SqliteConnection, { wal: boolean; synchronous: number }>();\n\n/** `synchronous=NORMAL` while a transaction writes only server-derived data (WAL only); returns the restore action. */\nexport async function downloadDurability(store: StoreInternals, connection: G9SqliteConnection): Promise<(() => Promise<void>) | null> {\n if (!store.options.synchronousNormalForDownloads) return null;\n let known = durabilityOf.get(connection);\n if (!known) {\n const wal = asString(await connection.scalar('PRAGMA journal_mode')).toLowerCase() === 'wal';\n known = { wal, synchronous: wal ? asNumber(await connection.scalar('PRAGMA synchronous')) : 0 };\n durabilityOf.set(connection, known);\n }\n if (!known.wal) return null;\n const previous = known.synchronous;\n if (previous <= 1) return null;\n await connection.exec('PRAGMA synchronous = NORMAL');\n return async () => {\n await connection.exec('PRAGMA synchronous = ' + previous);\n };\n}\n\n/** Applies one frame (`ApplyFrame`). */\nexport async function applyFrame(store: StoreInternals, context: ApplyContext, frame: Uint8Array, subscriptionKey: string | null): Promise<void> {\n let slot = -1;\n let ephemeral = false;\n let policy: G9EMoveOutPolicy = G9EMoveOutPolicy.Delete;\n if (subscriptionKey !== null) {\n const subscription = context.subscriptions.get(subscriptionKey);\n if (subscription) {\n slot = subscription.slot;\n ephemeral = subscription.ephemeral;\n policy = context.policies.get(subscriptionKey) ?? G9EMoveOutPolicy.Delete;\n }\n }\n const reader = await openRowBatch(frame, { maxBodyBytes: store.options.maxDecodedFrameBytes, decompressor: store.options.frameDecompressor });\n while (reader.nextSection()) {\n const table = store.byServerId.get(reader.tableId);\n if (!table || !table.negotiated) continue;\n const started = Date.now();\n const rowsBefore = context.rows;\n switch (reader.op) {\n case G9ERowBatchOp.Upsert:\n await applyUpserts(store, context, reader, table, slot, ephemeral ? subscriptionKey : null);\n break;\n case G9ERowBatchOp.Backfill:\n await applyBackfill(store, context, reader, table);\n break;\n case G9ERowBatchOp.Tombstone:\n while (reader.readRow()) await applyTombstone(context, table, reader.key, reader.version);\n break;\n case G9ERowBatchOp.MoveOut: {\n const keys: string[] = [];\n while (reader.readRow()) keys.push(reader.key);\n if (slot >= 0) await moveOutMany(store, context, table, keys, subscriptionKey as string, slot, ephemeral, policy);\n break;\n }\n }\n context.addTableTime(table.model.localName, context.rows - rowsBefore, Date.now() - started);\n }\n}\n\n/** The download row path (`ApplyUpserts`): a guarded upsert and a metadata upsert per row, batched. */\nasync function applyUpserts(store: StoreInternals, context: ApplyContext, reader: G9RowBatchReader, table: LocalTable, slot: number, ephemeralKey: string | null): Promise<void> {\n const columns = (table.negotiated as G9DtNegotiatedTable).columns;\n if (reader.columnCount !== columns.length) {\n throw new G9RowBatchFormatError(`${table.model.localName}: the frame has ${reader.columnCount} columns, ${columns.length} were negotiated.`);\n }\n const targets: { name: string; type: number; frame: number }[] = [];\n columns.forEach((c, i) => {\n if (table.model.indexOf(c.name) >= 0) targets.push({ name: c.name, type: c.type, frame: i });\n });\n const membership = slot >= 0 ? bit(slot).toSqlValue() : 0;\n const names = targets.map((t) => quote(t.name));\n // The update half is guarded (ADR-0058): a row that already holds exactly these values is not rewritten. IS NOT, so\n // NULLs compare; excluded.* carries the column's affinity.\n const upsertSql =\n `INSERT INTO ${table.quoted} (${table.keyQuoted}${names.map((n) => ', ' + n).join('')}) VALUES (?1${names.map((_, i) => ', ?' + (i + 2)).join('')}) ` +\n (names.length === 0\n ? `ON CONFLICT(${table.keyQuoted}) DO NOTHING`\n : `ON CONFLICT(${table.keyQuoted}) DO UPDATE SET ${names.map((n) => n + ' = excluded.' + n).join(', ')} WHERE ${names.map((n) => n + ' IS NOT excluded.' + n).join(' OR ')}`);\n // One statement for both of the .NET store's metadata statements: when the row upsert just changed the row (changes() of\n // the statement before), the metadata is rewritten; otherwise only when the metadata itself differs.\n const metaSql =\n 'INSERT INTO g9_rows (tid, pk, server_ver, local_seq, subs, dirty, dirty_mask, rejected, deleted) VALUES (?1, ?2, ?3, ' +\n NEXT_SEQ +\n ', ?4, 0, 0, 0, 0) ' +\n 'ON CONFLICT(tid, pk) DO UPDATE SET server_ver = excluded.server_ver, local_seq = excluded.local_seq, subs = subs | excluded.subs, ' +\n 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0 ' +\n 'WHERE changes() > 0 OR server_ver IS NOT excluded.server_ver OR (subs | excluded.subs) <> subs OR dirty <> 0 OR dirty_mask <> 0 OR rejected <> 0 OR deleted <> 0';\n const dirtyTable = context.hasDirty(table.tid);\n const localName = table.model.localName;\n\n while (reader.readRow()) {\n const key = reader.key;\n if (dirtyTable && context.isDirty(table.tid, key)) {\n if (slot >= 0) await addMembership(context, table, key, slot, ephemeralKey);\n context.report.skippedDirty++;\n context.tick();\n continue;\n }\n const values: G9SqlValue[] = [keyValue(table, key)];\n for (const target of targets) values.push(frameValueToSql(reader, target.frame, target.type, store.options));\n const statements = [\n { sql: upsertSql, params: values },\n { sql: metaSql, params: [table.tid, key, reader.versionLong.toSqlValue(), membership] },\n { sql: BUMP_IF_CHANGED, params: [] },\n ];\n if (ephemeralKey !== null) statements.push({ sql: 'INSERT OR IGNORE INTO g9_ephemeral_rows (sub_key, tid, pk) VALUES (?1, ?2, ?3)', params: [ephemeralKey, table.tid, key] });\n if (context.hasRevoked && slot >= 0) {\n statements.push({ sql: 'DELETE FROM g9_revoked WHERE tid = ?1 AND pk = ?2', params: [table.tid, key] });\n statements.push({ sql: 'DELETE FROM g9_rejections WHERE tid = ?1 AND pk = ?2 AND code = ?3', params: [table.tid, key, REVOKED_REJECTION_CODE] });\n }\n const full = context.batch.addStatements(statements, (results) => {\n const changed = ((results[0] as G9SqlResult).changes ?? 0) > 0;\n if (!changed) context.report.unchangedRows++;\n context.report.upserts++;\n if (changed && context.wantsChangedKey(localName)) context.addChanged(localName, key);\n });\n context.tick();\n if (full) await context.flush();\n }\n}\n\n/** `ApplyBackfill`: only the backfilled columns of rows the client already holds. */\nasync function applyBackfill(store: StoreInternals, context: ApplyContext, reader: G9RowBatchReader, table: LocalTable): Promise<void> {\n const names = context.backfillColumns.get((table.negotiated as G9DtNegotiatedTable).tableId);\n if (!names || names.length !== reader.columnCount) {\n while (reader.readRow()) {\n // skip\n }\n return;\n }\n const targets: { name: string; index: number; local: number }[] = [];\n names.forEach((name, i) => {\n const local = table.model.indexOf(name);\n if (local >= 0) targets.push({ name, index: i, local });\n });\n if (targets.length === 0) return;\n const sql = `UPDATE ${table.quoted} SET ${targets.map((t, i) => quote(t.name) + ' = ?' + (i + 1)).join(', ')} WHERE ${table.keyQuoted} = ?${targets.length + 1}`;\n while (reader.readRow()) {\n const key = reader.key;\n if (context.isDirty(table.tid, key)) {\n context.report.skippedDirty++;\n continue;\n }\n const params: G9SqlValue[] = targets.map((t) => frameValueToSql(reader, t.index, (table.model.columns[t.local] as { type: number }).type, store.options));\n params.push(keyValue(table, key));\n if (context.batch.addStatements([{ sql, params }])) await context.flush();\n context.tick();\n }\n}\n\n/** `ApplyTombstone`. */\nasync function applyTombstone(context: ApplyContext, table: LocalTable, key: string, version: number): Promise<void> {\n if (context.isDirty(table.tid, key)) {\n context.report.skippedDirty++;\n return;\n }\n const localName = table.model.localName;\n const full = context.batch.addStatements(\n [\n { sql: `DELETE FROM ${table.quoted} WHERE ${table.keyQuoted} = ?1`, params: [keyValue(table, key)] },\n {\n sql: 'UPDATE g9_rows SET deleted = 1, subs = 0, server_ver = ?1, local_seq = ' + NEXT_SEQ + ', dirty = 0, dirty_mask = 0 WHERE tid = ?2 AND pk = ?3 AND deleted = 0',\n params: [version, table.tid, key],\n },\n { sql: 'DELETE FROM g9_ephemeral_rows WHERE tid = ?1 AND pk = ?2', params: [table.tid, key] },\n { sql: BUMP, params: [] },\n ],\n (results) => {\n if (((results[0] as G9SqlResult).changes ?? 0) > 0) {\n context.report.deletes++;\n context.addChanged(localName, key);\n }\n },\n );\n context.tick();\n if (full) await context.flush();\n}\n\n/** `MoveOut`: drops the membership; with a Delete policy a row nobody holds goes through the revocation policy. */\nexport async function moveOut(\n store: StoreInternals,\n context: ApplyContext,\n table: LocalTable,\n key: string,\n subscriptionKey: string,\n slot: number,\n ephemeral: boolean,\n policy: G9EMoveOutPolicy,\n): Promise<void> {\n if (ephemeral) {\n context.batch.add('DELETE FROM g9_ephemeral_rows WHERE sub_key = $k AND tid = $t AND pk = $pk', { $k: subscriptionKey, $t: table.tid, $pk: key });\n context.batch.add('UPDATE g9_rows SET subs = subs & $n WHERE tid = $t AND pk = $pk AND NOT EXISTS (SELECT 1 FROM g9_ephemeral_rows WHERE tid = $t AND pk = $pk)', {\n $n: bit(EPHEMERAL_SLOT).not(),\n $t: table.tid,\n $pk: key,\n });\n } else {\n context.batch.add('UPDATE g9_rows SET subs = subs & $n WHERE tid = $t AND pk = $pk', { $n: bit(slot).not(), $t: table.tid, $pk: key });\n }\n context.report.moveOuts++;\n if (policy !== G9EMoveOutPolicy.Delete) {\n if (context.batch.count >= store.options.statementsPerBatch) await context.flush();\n return;\n }\n // No subscription holds it any more? The revocation policy decides (ADR-0026). It reads the row: run what is queued first.\n await context.flush();\n const removed = await disposeReleasedRow(store, context.connection, table, key, G9ERevocationReason.LeftScope, subscriptionKey, context.report);\n await context.connection.exec(BUMP);\n if (removed) context.addChanged(table.model.localName, key);\n}\n\n/**\n * A run of move-outs of one table (a MoveOut section of a frame, or a reconciliation's move-out keys), with the database\n * state the row-by-row {@link moveOut} leaves. Row by row a released row costs ~8 driver calls (flush, read metadata,\n * commands, the app row, the writes, the clock): ~34 ms per row on the Android emulator, minutes for a large office\n * change. Here every membership update is queued and flushed once, then the released rows are disposed in bulk by\n * disposeReleasedRows — read in three queries, decided in the same order, written in batches with each row's explicit\n * local_seq (the clock's value the row-by-row path gives it), the clock moved once by the number of rows. Exact for the\n * same reasons as an unsubscribe (ADR-0071 addendum) plus one: the keys of a run are distinct, so no row's membership\n * update can change another row's decision. Ephemeral subscriptions, a Keep policy, duplicate keys or a foreign trigger\n * take the row-by-row path.\n */\nexport async function moveOutMany(\n store: StoreInternals,\n context: ApplyContext,\n table: LocalTable,\n keys: readonly string[],\n subscriptionKey: string,\n slot: number,\n ephemeral: boolean,\n policy: G9EMoveOutPolicy,\n): Promise<void> {\n if (keys.length === 0) return;\n const distinct = new Set(keys).size === keys.length;\n if (keys.length === 1 || ephemeral || policy !== G9EMoveOutPolicy.Delete || !distinct || context.hasForeignTriggers) {\n for (const key of keys) await moveOut(store, context, table, key, subscriptionKey, slot, ephemeral, policy);\n return;\n }\n const notBit = bit(slot).not();\n for (const key of keys) await context.queue('UPDATE g9_rows SET subs = subs & $n WHERE tid = $t AND pk = $pk', { $n: notBit, $t: table.tid, $pk: key });\n context.report.moveOuts += keys.length;\n // The disposal reads the rows: run what is queued (this run's membership updates and everything the pull queued before).\n await context.flush();\n await disposeReleasedRows(\n store,\n context.connection,\n 'SELECT $tid AS tid, j.value AS pk FROM json_each($keys) AS j ORDER BY j.key',\n { $tid: table.tid, $keys: JSON.stringify(keys) },\n G9ERevocationReason.LeftScope,\n subscriptionKey,\n context.report,\n (_tid, key) => context.addChanged(table.model.localName, key),\n );\n}\n\n/** `AddMembership`. */\nexport async function addMembership(context: ApplyContext, table: LocalTable, key: string, slot: number, ephemeralKey: string | null): Promise<void> {\n context.batch.add('UPDATE g9_rows SET subs = subs | $b WHERE tid = $t AND pk = $pk AND deleted = 0', { $b: bit(slot), $t: table.tid, $pk: key });\n if (ephemeralKey !== null) context.batch.add('INSERT OR IGNORE INTO g9_ephemeral_rows (sub_key, tid, pk) VALUES ($k, $t, $pk)', { $k: ephemeralKey, $t: table.tid, $pk: key });\n}\n\n/** The rows an apply must not touch, read before the first slice commits (`ReadProtectedRows`). */\nasync function readProtectedRows(store: StoreInternals, connection: G9SqliteConnection, changedAfterSequence: number): Promise<{ tid: number; key: string }[]> {\n const rows: { tid: number; key: string }[] = [];\n for (const r of await connection.query('SELECT tid, pk FROM g9_rows WHERE dirty <> 0')) rows.push({ tid: asNumber(r[0]), key: asString(r[1]) });\n await readRowsChangedAfter(store, connection, changedAfterSequence, (tid, key) => rows.push({ tid, key }));\n for (const r of await connection.query('SELECT r.tid, r.pk FROM g9_command_rows r JOIN g9_commands c ON c.command_id = r.command_id WHERE c.state = 0')) {\n rows.push({ tid: asNumber(r[0]), key: asString(r[1]) });\n }\n return rows;\n}\n\n/** `ApplyStagedPullAsync`: atomic, or in committed slices (ADR-0053); cursors move only with the last slice. */\nexport async function applyStagedPull(\n store: StoreInternals,\n runId: string,\n rowsApplied: ((rows: number) => void) | null,\n slices: ((slice: G9ApplySlice) => void) | null,\n readStagedRun: (connection: G9SqliteConnection, runId: string) => Promise<import('../client/storeTypes.js').G9StagedPull | null>,\n signal?: AbortSignal,\n): Promise<G9ApplyReport> {\n store.ensureInitialized();\n return store.writeLock.run(async () => {\n const connection = store.writer();\n const restore = await downloadDurability(store, connection);\n try {\n const staged = await readStagedRun(connection, runId);\n if (!staged) throw new G9SyncException(G9SyncErrorCodes.LocalStoreError, 'The staged pull no longer exists.');\n const sequences = (await connection.query('SELECT seq FROM g9_stage WHERE run_id = $r AND payload IS NOT NULL ORDER BY seq', { $r: runId })).map((r) => asNumber(r[0]));\n\n // Snapshot files (ADR-0072) apply where their part sits in the plan: at the sequence of their first segment. Checked and\n // ATTACHed before the transaction (SQLite cannot attach inside one), detached whatever happens.\n const files = await readStagedFiles(connection, runId);\n for (const file of files) await verifyStagedFile(store, file);\n const units: { sequence: number; file: number }[] = sequences.map((sequence) => ({ sequence, file: -1 }));\n files.forEach((file, i) => units.push({ sequence: file.firstSequence, file: i }));\n units.sort((a, b) => a.sequence - b.sequence || a.file - b.file);\n const detach = await attachFiles(connection, files);\n try {\n\n // Slicing only pays for itself when someone is listening for the slices (ADR-0053); a LARGE snapshot stays in one\n // transaction with its indexes deferred (ADR-0056/0058).\n const sliceRows = slices === null ? 0 : store.options.applySliceRows;\n const snapshotRows = snapshotRowsByTable(staged.plan);\n let largeSnapshot = files.length > 0;\n if (store.options.rebuildIndexesAfterRows > 0) snapshotRows.forEach((rows) => (largeSnapshot = largeSnapshot || rows >= store.options.rebuildIndexesAfterRows));\n const progressive = sliceRows > 0 && units.length > 1 && !largeSnapshot;\n // Read ONCE, before any slice commits (ADR-0046 + ADR-0053).\n const protectedRows = progressive ? await readProtectedRows(store, connection, staged.stageSequence) : null;\n const skipTriggers = staged.plan.totalRows >= store.options.skipTriggersMinRows && !progressive;\n\n const total = new G9ApplyReport();\n let appliedTotal = 0;\n let index = 0;\n const started = Date.now();\n let sliceBudget = sliceRows;\n\n // do/while: a pull with no payload chunks still writes its cursors and clears its stage, exactly once.\n do {\n if (signal && signal.aborted) throw cancellation();\n const slice: { sequence: number; file: number }[] = [];\n let final = true;\n for (; index < units.length; index++) {\n slice.push(units[index] as { sequence: number; file: number });\n if (!progressive) continue;\n if ((await stagedRowCount(connection, runId, slice.map((unit) => unit.sequence))) >= sliceBudget && index + 1 < units.length) {\n index++;\n final = false;\n break;\n }\n }\n if (store.options.applySliceRowsMax > sliceBudget) sliceBudget = Math.min(store.options.applySliceRowsMax, sliceBudget * 2);\n\n let context: ApplyContext | null = null;\n let doneFiles: string[] = [];\n const syncedUpdates: { table: LocalTable; synced: string[] }[] = [];\n await connection.transaction('immediate', async () => {\n context = await beginApply(store, connection, {\n progress: rowsApplied,\n backfills: staged.backfills,\n snapshotRows: progressive ? null : snapshotRows,\n changedAfterSequence: staged.stageSequence,\n protectedRows,\n skipTriggers,\n signal,\n });\n for (const unit of slice) {\n if (signal && signal.aborted) throw cancellation();\n if (unit.file >= 0) {\n await applySnapshotFile(store, context, attachedSchema(unit.file), files[unit.file] as (typeof files)[number]);\n continue;\n }\n const sequence = unit.sequence;\n const rows = await connection.query('SELECT payload, subscription_key FROM g9_stage WHERE run_id = $r AND seq = $s', { $r: runId, $s: sequence });\n const row = rows[0];\n if (!row) continue;\n const payload = row[0];\n if (!(payload instanceof ArrayBuffer)) continue;\n await applyFrame(store, context, new Uint8Array(payload), row[1] === null ? null : asString(row[1]));\n }\n\n if (final) {\n // Cursors move only here, and only when still the one the plan started from (ADR-0060; IS, a first pull plans from NULL).\n // A subscription that came as a file counts its next safety reconciliation from the file's snapshot (ADR-0072).\n const reconciledAt = fileSnapshotTimes(staged.plan);\n for (const cursor of staged.plan.cursors) {\n const at = reconciledAt[cursor.key];\n const update =\n 'UPDATE g9_subscriptions SET cursor = $c, definition_hash = $d, auth_hash = $a, state = 0, error_code = NULL, last_success_utc = $now' +\n (at === undefined ? '' : ', last_reconcile_utc = $rec') +\n ' WHERE key = $k';\n const params: { [name: string]: G9SqlValue } = { $c: cursor.cursor, $d: cursor.definitionHash, $a: cursor.authHash, $now: nowMs(), $k: cursor.key };\n if (at !== undefined) params['$rec'] = at;\n if (Object.prototype.hasOwnProperty.call(staged.plannedFromCursors, cursor.key)) {\n await context.flush();\n await connection.exec(update + ' AND cursor IS $from', { ...params, $from: staged.plannedFromCursors[cursor.key] ?? null });\n } else {\n await context.flush();\n await connection.exec(update, params);\n }\n }\n for (const backfill of staged.backfills) {\n const table = store.byServerId.get(backfill.tableId);\n if (!table) continue;\n const synced = table.syncedColumns.slice();\n for (const column of backfill.columns) if (!synced.some((s) => s.toLowerCase() === column.toLowerCase())) synced.push(column);\n await connection.exec('UPDATE g9_tables SET synced_columns = $c WHERE tid = $t', { $c: persistedJson(synced), $t: table.tid });\n syncedUpdates.push({ table, synced });\n }\n }\n\n await endApply(context);\n const consumed = slice.filter((unit) => unit.file < 0).map((unit) => unit.sequence);\n if (consumed.length > 0) await connection.exec('DELETE FROM g9_stage WHERE run_id = $r AND seq IN (' + consumed.join(',') + ')', { $r: runId });\n if (final) {\n // Everything left of the stage - markers, file checkpoints, file records - goes with the last slice.\n doneFiles = await takeStagedFiles(connection, '$r', { $r: runId });\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r; DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n }\n });\n if (doneFiles.length > 0) {\n await detach();\n await deleteFiles(store, doneFiles);\n }\n\n const applied = context as unknown as ApplyContext;\n for (const { table, synced } of syncedUpdates) table.syncedColumns = synced;\n appliedTotal += applied.rows;\n total.merge(applied.report);\n rowsApplied?.(appliedTotal);\n slices?.({ report: applied.report, rowsApplied: applied.rows, rowsAppliedTotal: appliedTotal, rowsPlanned: staged.plan.totalRows, isFinal: final });\n } while (index < units.length);\n\n total.diagnostics.elapsedMs = Date.now() - started;\n if (total.diagnostics.transactions > 0 && appliedTotal > 0) store.log('information', 20112, `G9SyncData applied ${appliedTotal} row(s): ${total.diagnostics.toString()}`);\n await maintainAfterApply(store, connection, appliedTotal);\n return total;\n } finally {\n await detach();\n }\n } finally {\n if (restore) await restore();\n }\n });\n}\n\nfunction cancellation(): Error {\n const error = new Error('The operation was canceled.');\n error.name = 'AbortError';\n return error;\n}\n\nasync function stagedRowCount(connection: G9SqliteConnection, runId: string, slice: number[]): Promise<number> {\n return asNumber(await connection.scalar('SELECT coalesce(sum(row_count), 0) FROM g9_stage WHERE run_id = $r AND seq IN (' + slice.join(',') + ')', { $r: runId }));\n}\n\n/** Best-effort housekeeping after a large apply (`MaintainAfterApply`): planner statistics and one WAL checkpoint attempt. */\nasync function maintainAfterApply(store: StoreInternals, connection: G9SqliteConnection, appliedRows: number): Promise<void> {\n if (store.options.maintenanceAfterRows <= 0 || appliedRows < store.options.maintenanceAfterRows) return;\n try {\n await connection.exec('PRAGMA analysis_limit = 1000; PRAGMA optimize;');\n if (asString(await connection.scalar('PRAGMA journal_mode')).toLowerCase() !== 'wal') return;\n await connection.exec('PRAGMA busy_timeout = 250');\n try {\n const rows = await connection.query('PRAGMA wal_checkpoint(TRUNCATE)');\n if (rows[0] && asNumber(rows[0][0]) !== 0) {\n store.log('debug', 20113, `The WAL checkpoint after applying ${appliedRows} row(s) was blocked by a reader; the next one retries`);\n }\n } finally {\n await connection.exec('PRAGMA busy_timeout = ' + store.options.busyTimeoutMs);\n }\n } catch (error) {\n store.log('warning', 20114, `Maintenance after an apply failed and was skipped: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/** `ApplyReconcileAsync`. */\nexport async function applyReconcile(\n store: StoreInternals,\n subscriptionKey: string,\n table: G9DtNegotiatedTable,\n fetchedFrames: readonly Uint8Array[],\n addMembershipKeys: readonly string[],\n moveOutKeys: readonly string[],\n policy: G9EMoveOutPolicy,\n signal?: AbortSignal,\n): Promise<G9ApplyReport> {\n store.ensureInitialized();\n const local = findByServerName(store, table.name);\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\n return store.writeLock.run(async () => {\n const connection = store.writer();\n const restore = await downloadDurability(store, connection);\n try {\n return await connection.transaction('immediate', async () => {\n const context = await beginApply(store, connection, { backfills: [], signal });\n context.policies.set(subscriptionKey, policy);\n for (const frame of fetchedFrames) await applyFrame(store, context, frame, subscriptionKey);\n const subscription = context.subscriptions.get(subscriptionKey);\n if (subscription) {\n for (const key of addMembershipKeys) {\n await addMembership(context, local, key, subscription.slot, subscription.ephemeral ? subscriptionKey : null);\n context.report.membershipAdded++;\n }\n await moveOutMany(store, context, local, moveOutKeys, subscriptionKey, subscription.slot, subscription.ephemeral, policy);\n }\n await endApply(context);\n return context.report;\n });\n } finally {\n if (restore) await restore();\n }\n });\n}\n\n/** For callers that need a G9Long bit as a bind value. */\nexport function bitValue(slot: number): G9Long {\n return bit(slot);\n}\n"]}
@@ -41,6 +41,11 @@ export declare class G9SqliteConnection {
41
41
  constructor(driver: G9SqliteDriver, session: G9SessionToken);
42
42
  /** Runs prepared driver statements in one bridge call. */
43
43
  runStatements(statements: readonly G9DriverStatement[], signal?: AbortSignal): Promise<G9SqlResult[]>;
44
+ /**
45
+ * Runs statements in ONE transaction and ONE bridge call (`atomic` batch) when no transaction is open on this
46
+ * connection; inside an open one, they simply join it. Equivalent to begin + statements + commit, two calls fewer.
47
+ */
48
+ runAtomic(statements: readonly G9DriverStatement[], signal?: AbortSignal): Promise<G9SqlResult[]>;
44
49
  /** `ExecuteNonQuery`: the summed changes of every statement. */
45
50
  exec(script: string, params?: G9Params): Promise<number>;
46
51
  /** Rows of the first row-producing statement (statements before it run first, like ExecuteReader). */
@@ -165,6 +165,23 @@ export class G9SqliteConnection {
165
165
  throw wrap(error, statements.length === 1 ? (_a = statements[0]) === null || _a === void 0 ? void 0 : _a.sql : undefined);
166
166
  }
167
167
  }
168
+ /**
169
+ * Runs statements in ONE transaction and ONE bridge call (`atomic` batch) when no transaction is open on this
170
+ * connection; inside an open one, they simply join it. Equivalent to begin + statements + commit, two calls fewer.
171
+ */
172
+ async runAtomic(statements, signal) {
173
+ var _a;
174
+ if (statements.length === 0)
175
+ return [];
176
+ if (this.tx)
177
+ return this.runStatements(statements, signal);
178
+ try {
179
+ return await this.driver.run(this.session, statements, signal ? { atomic: true, signal } : { atomic: true });
180
+ }
181
+ catch (error) {
182
+ throw wrap(error, statements.length === 1 ? (_a = statements[0]) === null || _a === void 0 ? void 0 : _a.sql : undefined);
183
+ }
184
+ }
168
185
  /** `ExecuteNonQuery`: the summed changes of every statement. */
169
186
  async exec(script, params) {
170
187
  const results = await this.runStatements(statementsOf(script, params));
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/sqlite/connection.ts"],"names":[],"mappings":"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","sourcesContent":["// The store's data access over a G9SqliteDriver: the TypeScript twin of the C# helpers Exec / Scalar / Command and the\n// native layer's multi-statement commands. SQL keeps the .NET store's `$name` parameters; they are rewritten to numbered\n// `?N` placeholders (one number per name, so a name used twice binds once), and scripts are split into statements.\nimport { G9Long } from '../abstractions/long.js';\nimport { G9ELocalStoreFailure, type G9SyncLocalStoreFailure } from '../client/storeTypes.js';\nimport type { G9DriverStatement, G9SessionToken, G9SqlResult, G9SqlValue, G9SqliteDriver, G9TxToken } from './driver.js';\nimport { splitSql } from './sql.js';\n\n/** A parameter value the store binds. */\nexport type G9BindValue = G9SqlValue | boolean | G9Long | Uint8Array | undefined;\n\nexport type G9Params = { [name: string]: G9BindValue };\n\n/** A SQLite failure raised by the store, classified for the engine (twin of `G9CSqliteException`). */\nexport class G9SqliteStoreError extends Error implements G9SyncLocalStoreFailure {\n /** The driver's error code (`busy`, `corrupt`, `full`, `constraint`, …). */\n readonly driverCode: string;\n /** SQLite's primary result code when the driver reported one. */\n readonly sqliteCode: number | null;\n\n constructor(message: string, driverCode: string, sqliteCode: number | null, cause?: unknown) {\n super(message);\n this.name = 'G9SqliteStoreError';\n this.driverCode = driverCode;\n this.sqliteCode = sqliteCode;\n if (cause !== undefined) Object.defineProperty(this, 'cause', { value: cause, enumerable: false, writable: true, configurable: true });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /** ADR-0068: corrupt (11/26), full (13), busy/locked (5/6). */\n get localStoreFailure(): G9ELocalStoreFailure {\n const code = this.sqliteCode !== null ? this.sqliteCode & 0xff : -1;\n if (code === 11 || code === 26 || this.driverCode === 'corrupt') return G9ELocalStoreFailure.Corrupt;\n if (code === 13 || this.driverCode === 'full') return G9ELocalStoreFailure.DiskFull;\n if (code === 5 || code === 6 || this.driverCode === 'busy' || this.driverCode === 'locked') return G9ELocalStoreFailure.Busy;\n return G9ELocalStoreFailure.Other;\n }\n}\n\nfunction wrap(error: unknown, sql?: string): unknown {\n if (error instanceof G9SqliteStoreError) return error;\n const e = error as { code?: unknown; sqliteCode?: unknown; message?: unknown; name?: unknown };\n if (e && typeof e === 'object' && (typeof e.code === 'string' || typeof e.sqliteCode === 'number')) {\n const message = (typeof e.message === 'string' ? e.message : String(error)) + (sql ? ` [${sql.length > 160 ? sql.slice(0, 160) + '…' : sql}]` : '');\n return new G9SqliteStoreError(message, typeof e.code === 'string' ? e.code : 'other', typeof e.sqliteCode === 'number' ? e.sqliteCode : null, error);\n }\n return error;\n}\n\n/** Converts a bind value to the driver's form. */\nexport function toSqlValue(value: G9BindValue): G9SqlValue {\n if (value === undefined || value === null) return null;\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (value instanceof G9Long) return value.toSqlValue();\n if (value instanceof Uint8Array) {\n const copy = new Uint8Array(value.length);\n copy.set(value);\n return copy.buffer;\n }\n return value;\n}\n\ninterface Compiled {\n statements: { sql: string; names: string[] }[];\n}\n\nconst compiled = new Map<string, Compiled>();\n\n/** Splits a script and rewrites `$name` parameters (outside strings, identifiers and comments) to `?N`. */\nexport function compile(script: string): Compiled {\n let entry = compiled.get(script);\n if (entry) return entry;\n entry = { statements: splitSql(script).map(rewriteParameters) };\n if (compiled.size > 2000) compiled.clear();\n compiled.set(script, entry);\n return entry;\n}\n\nfunction rewriteParameters(sql: string): { sql: string; names: string[] } {\n const names: string[] = [];\n let out = '';\n let i = 0;\n const n = sql.length;\n while (i < n) {\n const c = sql.charAt(i);\n if (c === \"'\" || c === '\"') {\n let j = i + 1;\n while (j < n) {\n if (sql.charAt(j) === c) {\n if (sql.charAt(j + 1) === c) j += 2;\n else break;\n } else j++;\n }\n out += sql.slice(i, j + 1);\n i = j + 1;\n continue;\n }\n if (c === '[') {\n const close = sql.indexOf(']', i + 1);\n const end = close < 0 ? n : close + 1;\n out += sql.slice(i, end);\n i = end;\n continue;\n }\n if (c === '$' && i + 1 < n && /[A-Za-z0-9_]/.test(sql.charAt(i + 1))) {\n let j = i + 1;\n while (j < n && /[A-Za-z0-9_]/.test(sql.charAt(j))) j++;\n const name = sql.slice(i, j);\n let index = names.indexOf(name);\n if (index < 0) {\n names.push(name);\n index = names.length - 1;\n }\n out += '?' + (index + 1);\n i = j;\n continue;\n }\n out += c;\n i++;\n }\n return { sql: out, names };\n}\n\n/** Statements of a script with their parameters bound by name. */\nexport function statementsOf(script: string, params?: G9Params): G9DriverStatement[] {\n const entry = compile(script);\n return entry.statements.map((s) => ({\n sql: s.sql,\n params: s.names.map((name) => {\n if (!params || !Object.prototype.hasOwnProperty.call(params, name)) throw new Error(`Must add a value for parameter '${name}'.`);\n return toSqlValue(params[name]);\n }),\n }));\n}\n\n/** An async mutex (the SemaphoreSlim(1, 1) twin). */\nexport class G9AsyncLock {\n private _tail: Promise<void> = Promise.resolve();\n\n async run<T>(action: () => Promise<T>): Promise<T> {\n let release!: () => void;\n const next = new Promise<void>((resolve) => {\n release = resolve;\n });\n const previous = this._tail;\n this._tail = previous.then(() => next);\n await previous;\n try {\n return await action();\n } finally {\n release();\n }\n }\n}\n\n/** One driver session (a \"connection\") with the store's helpers. `tx` is the open transaction, if any. */\nexport class G9SqliteConnection {\n readonly driver: G9SqliteDriver;\n readonly session: G9SessionToken;\n tx: G9TxToken | null = null;\n\n constructor(driver: G9SqliteDriver, session: G9SessionToken) {\n this.driver = driver;\n this.session = session;\n }\n\n /** Runs prepared driver statements in one bridge call. */\n async runStatements(statements: readonly G9DriverStatement[], signal?: AbortSignal): Promise<G9SqlResult[]> {\n if (statements.length === 0) return [];\n try {\n return await this.driver.run(this.session, statements, this.tx ? { tx: this.tx, signal } : { signal });\n } catch (error) {\n throw wrap(error, statements.length === 1 ? statements[0]?.sql : undefined);\n }\n }\n\n /** `ExecuteNonQuery`: the summed changes of every statement. */\n async exec(script: string, params?: G9Params): Promise<number> {\n const results = await this.runStatements(statementsOf(script, params));\n let changes = 0;\n for (const result of results) changes += result.columns.length > 0 ? 0 : result.changes;\n return changes;\n }\n\n /** Rows of the first row-producing statement (statements before it run first, like ExecuteReader). */\n async query(script: string, params?: G9Params): Promise<(readonly G9SqlValue[])[]> {\n const results = await this.runStatements(statementsOf(script, params));\n for (const result of results) if (result.columns.length > 0) return result.rows as (readonly G9SqlValue[])[];\n return [];\n }\n\n /** First column of the first row, or null. */\n async scalar(script: string, params?: G9Params): Promise<G9SqlValue> {\n const rows = await this.query(script, params);\n const row = rows[0];\n return row && row.length > 0 ? (row[0] as G9SqlValue) : null;\n }\n\n /** `BEGIN IMMEDIATE` (or deferred) on this session. */\n async begin(mode: 'deferred' | 'immediate' = 'immediate'): Promise<void> {\n if (this.tx) throw new Error('A transaction is already open on this connection.');\n try {\n this.tx = await this.driver.begin(this.session, mode);\n } catch (error) {\n throw wrap(error);\n }\n }\n\n async commit(): Promise<void> {\n const tx = this.tx;\n if (!tx) throw new Error('No transaction is open.');\n try {\n await this.driver.commit(tx);\n this.tx = null;\n } catch (error) {\n throw wrap(error);\n }\n }\n\n async rollback(): Promise<void> {\n const tx = this.tx;\n if (!tx) return;\n this.tx = null;\n try {\n await this.driver.rollback(tx);\n } catch {\n // SQLite may already have rolled back; the transaction is over either way.\n }\n }\n\n /** Runs `action` in a transaction: committed when it returns, rolled back when it throws (the `using var transaction` pattern). */\n async transaction<T>(mode: 'deferred' | 'immediate', action: () => Promise<T>): Promise<T> {\n await this.begin(mode);\n try {\n const result = await action();\n if (this.tx) await this.commit();\n return result;\n } catch (error) {\n await this.rollback();\n throw error;\n }\n }\n}\n\n/** Collects statements and runs them in one driver call, handing each its result (the apply's batching). */\nexport class G9StatementBatch {\n private readonly _connection: G9SqliteConnection;\n private readonly _statements: G9DriverStatement[] = [];\n private readonly _callbacks: ({ index: number; callback: (results: G9SqlResult[]) => void } | null)[] = [];\n private readonly _limit: number;\n\n constructor(connection: G9SqliteConnection, limit = 1500) {\n this._connection = connection;\n this._limit = limit;\n }\n\n get count(): number {\n return this._statements.length;\n }\n\n /**\n * Queues a script's statements; `callback` receives their results (in order) once the batch has run. Returns true when\n * the batch is full and should be flushed.\n */\n add(script: string, params?: G9Params, callback?: (results: G9SqlResult[]) => void): boolean {\n const statements = statementsOf(script, params);\n const index = this._statements.length;\n for (const statement of statements) this._statements.push(statement);\n this._callbacks.push(callback ? { index, callback: (all) => callback(all.slice(index, index + statements.length)) } : null);\n return this._statements.length >= this._limit;\n }\n\n /** Queues prepared statements. */\n addStatements(statements: readonly G9DriverStatement[], callback?: (results: G9SqlResult[]) => void): boolean {\n const index = this._statements.length;\n for (const statement of statements) this._statements.push(statement);\n this._callbacks.push(callback ? { index, callback: (all) => callback(all.slice(index, index + statements.length)) } : null);\n return this._statements.length >= this._limit;\n }\n\n async flush(signal?: AbortSignal): Promise<void> {\n if (this._statements.length === 0) return;\n const statements = this._statements.splice(0, this._statements.length);\n const callbacks = this._callbacks.splice(0, this._callbacks.length);\n const results = await this._connection.runStatements(statements, signal);\n for (const entry of callbacks) if (entry) entry.callback(results);\n }\n}\n\n/** Reads an INTEGER cell as a number (an int64 tag rounds; the store's counters are far below 2^53). */\nexport function asNumber(value: G9SqlValue | undefined): number {\n if (value === null || value === undefined) return 0;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return Number(value);\n if (value instanceof ArrayBuffer) return 0;\n return Number(value.int64);\n}\n\n/** Reads an INTEGER cell exactly. */\nexport function asLong(value: G9SqlValue | undefined): G9Long {\n if (value === null || value === undefined) return G9Long.ZERO;\n if (typeof value === 'number') return G9Long.fromNumber(Math.trunc(value));\n if (typeof value === 'string') return G9Long.tryParse(value) ?? G9Long.ZERO;\n if (value instanceof ArrayBuffer) return G9Long.ZERO;\n return G9Long.parse(value.int64);\n}\n\n/** Reads a TEXT cell (`GetString`: SQLite's text form of a number, as JavaScript prints it). */\nexport function asString(value: G9SqlValue | undefined): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n if (value instanceof ArrayBuffer) return '';\n return value.int64;\n}\n\nexport function asOptionalString(value: G9SqlValue | undefined): string | null {\n return value === null || value === undefined ? null : asString(value);\n}\n"]}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/sqlite/connection.ts"],"names":[],"mappings":"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","sourcesContent":["// The store's data access over a G9SqliteDriver: the TypeScript twin of the C# helpers Exec / Scalar / Command and the\n// native layer's multi-statement commands. SQL keeps the .NET store's `$name` parameters; they are rewritten to numbered\n// `?N` placeholders (one number per name, so a name used twice binds once), and scripts are split into statements.\nimport { G9Long } from '../abstractions/long.js';\nimport { G9ELocalStoreFailure, type G9SyncLocalStoreFailure } from '../client/storeTypes.js';\nimport type { G9DriverStatement, G9SessionToken, G9SqlResult, G9SqlValue, G9SqliteDriver, G9TxToken } from './driver.js';\nimport { splitSql } from './sql.js';\n\n/** A parameter value the store binds. */\nexport type G9BindValue = G9SqlValue | boolean | G9Long | Uint8Array | undefined;\n\nexport type G9Params = { [name: string]: G9BindValue };\n\n/** A SQLite failure raised by the store, classified for the engine (twin of `G9CSqliteException`). */\nexport class G9SqliteStoreError extends Error implements G9SyncLocalStoreFailure {\n /** The driver's error code (`busy`, `corrupt`, `full`, `constraint`, …). */\n readonly driverCode: string;\n /** SQLite's primary result code when the driver reported one. */\n readonly sqliteCode: number | null;\n\n constructor(message: string, driverCode: string, sqliteCode: number | null, cause?: unknown) {\n super(message);\n this.name = 'G9SqliteStoreError';\n this.driverCode = driverCode;\n this.sqliteCode = sqliteCode;\n if (cause !== undefined) Object.defineProperty(this, 'cause', { value: cause, enumerable: false, writable: true, configurable: true });\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /** ADR-0068: corrupt (11/26), full (13), busy/locked (5/6). */\n get localStoreFailure(): G9ELocalStoreFailure {\n const code = this.sqliteCode !== null ? this.sqliteCode & 0xff : -1;\n if (code === 11 || code === 26 || this.driverCode === 'corrupt') return G9ELocalStoreFailure.Corrupt;\n if (code === 13 || this.driverCode === 'full') return G9ELocalStoreFailure.DiskFull;\n if (code === 5 || code === 6 || this.driverCode === 'busy' || this.driverCode === 'locked') return G9ELocalStoreFailure.Busy;\n return G9ELocalStoreFailure.Other;\n }\n}\n\nfunction wrap(error: unknown, sql?: string): unknown {\n if (error instanceof G9SqliteStoreError) return error;\n const e = error as { code?: unknown; sqliteCode?: unknown; message?: unknown; name?: unknown };\n if (e && typeof e === 'object' && (typeof e.code === 'string' || typeof e.sqliteCode === 'number')) {\n const message = (typeof e.message === 'string' ? e.message : String(error)) + (sql ? ` [${sql.length > 160 ? sql.slice(0, 160) + '…' : sql}]` : '');\n return new G9SqliteStoreError(message, typeof e.code === 'string' ? e.code : 'other', typeof e.sqliteCode === 'number' ? e.sqliteCode : null, error);\n }\n return error;\n}\n\n/** Converts a bind value to the driver's form. */\nexport function toSqlValue(value: G9BindValue): G9SqlValue {\n if (value === undefined || value === null) return null;\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (value instanceof G9Long) return value.toSqlValue();\n if (value instanceof Uint8Array) {\n const copy = new Uint8Array(value.length);\n copy.set(value);\n return copy.buffer;\n }\n return value;\n}\n\ninterface Compiled {\n statements: { sql: string; names: string[] }[];\n}\n\nconst compiled = new Map<string, Compiled>();\n\n/** Splits a script and rewrites `$name` parameters (outside strings, identifiers and comments) to `?N`. */\nexport function compile(script: string): Compiled {\n let entry = compiled.get(script);\n if (entry) return entry;\n entry = { statements: splitSql(script).map(rewriteParameters) };\n if (compiled.size > 2000) compiled.clear();\n compiled.set(script, entry);\n return entry;\n}\n\nfunction rewriteParameters(sql: string): { sql: string; names: string[] } {\n const names: string[] = [];\n let out = '';\n let i = 0;\n const n = sql.length;\n while (i < n) {\n const c = sql.charAt(i);\n if (c === \"'\" || c === '\"') {\n let j = i + 1;\n while (j < n) {\n if (sql.charAt(j) === c) {\n if (sql.charAt(j + 1) === c) j += 2;\n else break;\n } else j++;\n }\n out += sql.slice(i, j + 1);\n i = j + 1;\n continue;\n }\n if (c === '[') {\n const close = sql.indexOf(']', i + 1);\n const end = close < 0 ? n : close + 1;\n out += sql.slice(i, end);\n i = end;\n continue;\n }\n if (c === '$' && i + 1 < n && /[A-Za-z0-9_]/.test(sql.charAt(i + 1))) {\n let j = i + 1;\n while (j < n && /[A-Za-z0-9_]/.test(sql.charAt(j))) j++;\n const name = sql.slice(i, j);\n let index = names.indexOf(name);\n if (index < 0) {\n names.push(name);\n index = names.length - 1;\n }\n out += '?' + (index + 1);\n i = j;\n continue;\n }\n out += c;\n i++;\n }\n return { sql: out, names };\n}\n\n/** Statements of a script with their parameters bound by name. */\nexport function statementsOf(script: string, params?: G9Params): G9DriverStatement[] {\n const entry = compile(script);\n return entry.statements.map((s) => ({\n sql: s.sql,\n params: s.names.map((name) => {\n if (!params || !Object.prototype.hasOwnProperty.call(params, name)) throw new Error(`Must add a value for parameter '${name}'.`);\n return toSqlValue(params[name]);\n }),\n }));\n}\n\n/** An async mutex (the SemaphoreSlim(1, 1) twin). */\nexport class G9AsyncLock {\n private _tail: Promise<void> = Promise.resolve();\n\n async run<T>(action: () => Promise<T>): Promise<T> {\n let release!: () => void;\n const next = new Promise<void>((resolve) => {\n release = resolve;\n });\n const previous = this._tail;\n this._tail = previous.then(() => next);\n await previous;\n try {\n return await action();\n } finally {\n release();\n }\n }\n}\n\n/** One driver session (a \"connection\") with the store's helpers. `tx` is the open transaction, if any. */\nexport class G9SqliteConnection {\n readonly driver: G9SqliteDriver;\n readonly session: G9SessionToken;\n tx: G9TxToken | null = null;\n\n constructor(driver: G9SqliteDriver, session: G9SessionToken) {\n this.driver = driver;\n this.session = session;\n }\n\n /** Runs prepared driver statements in one bridge call. */\n async runStatements(statements: readonly G9DriverStatement[], signal?: AbortSignal): Promise<G9SqlResult[]> {\n if (statements.length === 0) return [];\n try {\n return await this.driver.run(this.session, statements, this.tx ? { tx: this.tx, signal } : { signal });\n } catch (error) {\n throw wrap(error, statements.length === 1 ? statements[0]?.sql : undefined);\n }\n }\n\n /**\n * Runs statements in ONE transaction and ONE bridge call (`atomic` batch) when no transaction is open on this\n * connection; inside an open one, they simply join it. Equivalent to begin + statements + commit, two calls fewer.\n */\n async runAtomic(statements: readonly G9DriverStatement[], signal?: AbortSignal): Promise<G9SqlResult[]> {\n if (statements.length === 0) return [];\n if (this.tx) return this.runStatements(statements, signal);\n try {\n return await this.driver.run(this.session, statements, signal ? { atomic: true, signal } : { atomic: true });\n } catch (error) {\n throw wrap(error, statements.length === 1 ? statements[0]?.sql : undefined);\n }\n }\n\n /** `ExecuteNonQuery`: the summed changes of every statement. */\n async exec(script: string, params?: G9Params): Promise<number> {\n const results = await this.runStatements(statementsOf(script, params));\n let changes = 0;\n for (const result of results) changes += result.columns.length > 0 ? 0 : result.changes;\n return changes;\n }\n\n /** Rows of the first row-producing statement (statements before it run first, like ExecuteReader). */\n async query(script: string, params?: G9Params): Promise<(readonly G9SqlValue[])[]> {\n const results = await this.runStatements(statementsOf(script, params));\n for (const result of results) if (result.columns.length > 0) return result.rows as (readonly G9SqlValue[])[];\n return [];\n }\n\n /** First column of the first row, or null. */\n async scalar(script: string, params?: G9Params): Promise<G9SqlValue> {\n const rows = await this.query(script, params);\n const row = rows[0];\n return row && row.length > 0 ? (row[0] as G9SqlValue) : null;\n }\n\n /** `BEGIN IMMEDIATE` (or deferred) on this session. */\n async begin(mode: 'deferred' | 'immediate' = 'immediate'): Promise<void> {\n if (this.tx) throw new Error('A transaction is already open on this connection.');\n try {\n this.tx = await this.driver.begin(this.session, mode);\n } catch (error) {\n throw wrap(error);\n }\n }\n\n async commit(): Promise<void> {\n const tx = this.tx;\n if (!tx) throw new Error('No transaction is open.');\n try {\n await this.driver.commit(tx);\n this.tx = null;\n } catch (error) {\n throw wrap(error);\n }\n }\n\n async rollback(): Promise<void> {\n const tx = this.tx;\n if (!tx) return;\n this.tx = null;\n try {\n await this.driver.rollback(tx);\n } catch {\n // SQLite may already have rolled back; the transaction is over either way.\n }\n }\n\n /** Runs `action` in a transaction: committed when it returns, rolled back when it throws (the `using var transaction` pattern). */\n async transaction<T>(mode: 'deferred' | 'immediate', action: () => Promise<T>): Promise<T> {\n await this.begin(mode);\n try {\n const result = await action();\n if (this.tx) await this.commit();\n return result;\n } catch (error) {\n await this.rollback();\n throw error;\n }\n }\n}\n\n/** Collects statements and runs them in one driver call, handing each its result (the apply's batching). */\nexport class G9StatementBatch {\n private readonly _connection: G9SqliteConnection;\n private readonly _statements: G9DriverStatement[] = [];\n private readonly _callbacks: ({ index: number; callback: (results: G9SqlResult[]) => void } | null)[] = [];\n private readonly _limit: number;\n\n constructor(connection: G9SqliteConnection, limit = 1500) {\n this._connection = connection;\n this._limit = limit;\n }\n\n get count(): number {\n return this._statements.length;\n }\n\n /**\n * Queues a script's statements; `callback` receives their results (in order) once the batch has run. Returns true when\n * the batch is full and should be flushed.\n */\n add(script: string, params?: G9Params, callback?: (results: G9SqlResult[]) => void): boolean {\n const statements = statementsOf(script, params);\n const index = this._statements.length;\n for (const statement of statements) this._statements.push(statement);\n this._callbacks.push(callback ? { index, callback: (all) => callback(all.slice(index, index + statements.length)) } : null);\n return this._statements.length >= this._limit;\n }\n\n /** Queues prepared statements. */\n addStatements(statements: readonly G9DriverStatement[], callback?: (results: G9SqlResult[]) => void): boolean {\n const index = this._statements.length;\n for (const statement of statements) this._statements.push(statement);\n this._callbacks.push(callback ? { index, callback: (all) => callback(all.slice(index, index + statements.length)) } : null);\n return this._statements.length >= this._limit;\n }\n\n async flush(signal?: AbortSignal): Promise<void> {\n if (this._statements.length === 0) return;\n const statements = this._statements.splice(0, this._statements.length);\n const callbacks = this._callbacks.splice(0, this._callbacks.length);\n const results = await this._connection.runStatements(statements, signal);\n for (const entry of callbacks) if (entry) entry.callback(results);\n }\n}\n\n/** Reads an INTEGER cell as a number (an int64 tag rounds; the store's counters are far below 2^53). */\nexport function asNumber(value: G9SqlValue | undefined): number {\n if (value === null || value === undefined) return 0;\n if (typeof value === 'number') return value;\n if (typeof value === 'string') return Number(value);\n if (value instanceof ArrayBuffer) return 0;\n return Number(value.int64);\n}\n\n/** Reads an INTEGER cell exactly. */\nexport function asLong(value: G9SqlValue | undefined): G9Long {\n if (value === null || value === undefined) return G9Long.ZERO;\n if (typeof value === 'number') return G9Long.fromNumber(Math.trunc(value));\n if (typeof value === 'string') return G9Long.tryParse(value) ?? G9Long.ZERO;\n if (value instanceof ArrayBuffer) return G9Long.ZERO;\n return G9Long.parse(value.int64);\n}\n\n/** Reads a TEXT cell (`GetString`: SQLite's text form of a number, as JavaScript prints it). */\nexport function asString(value: G9SqlValue | undefined): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n if (value instanceof ArrayBuffer) return '';\n return value.int64;\n}\n\nexport function asOptionalString(value: G9SqlValue | undefined): string | null {\n return value === null || value === undefined ? null : asString(value);\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  export { G9SqliteSyncStore, type G9PendingExport } from './store.js';
2
- export { fileIncarnationMarker, type G9IncarnationMarker, type G9MarkerFileSystem, type G9SqliteSyncStoreOptions, type G9ResolvedSqliteStoreOptions, } from './options.js';
2
+ export { fileIncarnationMarker, type G9IncarnationMarker, type G9MarkerFileSystem, type G9SnapshotFileSink, type G9SqliteSyncStoreOptions, type G9ResolvedSqliteStoreOptions, } from './options.js';
3
3
  export { G9ESqliteDateTimeStorage, G9ESqliteDecimalStorage, splitSql } from './sql.js';
4
4
  export { G9SqliteStoreError } from './connection.js';
5
+ export { SNAPSHOT_FILE_APPLICATION_ID, SNAPSHOT_FILE_FORMAT_VERSION } from './snapshotFiles.js';
5
6
  export { formatTicks, formatDateTimeOffset, parseDateTime, parseDateTimeOffset, ticksOf, ticksToUnixMs } from './values.js';
6
7
  export type { G9ConnectionPragmas, G9DriverCapabilities, G9DriverStatement, G9Int64Tag, G9OpenOptions, G9RunOptions, G9SessionToken, G9SqlResult, G9SqlValue, G9SqliteDriver, G9TxToken, } from './driver.js';
@@ -3,5 +3,6 @@ export { G9SqliteSyncStore } from './store.js';
3
3
  export { fileIncarnationMarker, } from './options.js';
4
4
  export { G9ESqliteDateTimeStorage, G9ESqliteDecimalStorage, splitSql } from './sql.js';
5
5
  export { G9SqliteStoreError } from './connection.js';
6
+ export { SNAPSHOT_FILE_APPLICATION_ID, SNAPSHOT_FILE_FORMAT_VERSION } from './snapshotFiles.js';
6
7
  export { formatTicks, formatDateTimeOffset, parseDateTime, parseDateTimeOffset, ticksOf, ticksToUnixMs } from './values.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,OAAO,EAAE,iBAAiB,EAAwB,MAAM,YAAY,CAAC;AACrE,OAAO,EACL,qBAAqB,GAKtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC","sourcesContent":["// @g9tm/syncdata/sqlite — the SQLite client store (twin of G9SyncData.Client.Sqlite) over the G9SqliteDriver contract.\nexport { G9SqliteSyncStore, type G9PendingExport } from './store.js';\nexport {\n fileIncarnationMarker,\n type G9IncarnationMarker,\n type G9MarkerFileSystem,\n type G9SqliteSyncStoreOptions,\n type G9ResolvedSqliteStoreOptions,\n} from './options.js';\nexport { G9ESqliteDateTimeStorage, G9ESqliteDecimalStorage, splitSql } from './sql.js';\nexport { G9SqliteStoreError } from './connection.js';\nexport { formatTicks, formatDateTimeOffset, parseDateTime, parseDateTimeOffset, ticksOf, ticksToUnixMs } from './values.js';\nexport type {\n G9ConnectionPragmas,\n G9DriverCapabilities,\n G9DriverStatement,\n G9Int64Tag,\n G9OpenOptions,\n G9RunOptions,\n G9SessionToken,\n G9SqlResult,\n G9SqlValue,\n G9SqliteDriver,\n G9TxToken,\n} from './driver.js';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sqlite/index.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,OAAO,EAAE,iBAAiB,EAAwB,MAAM,YAAY,CAAC;AACrE,OAAO,EACL,qBAAqB,GAMtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC","sourcesContent":["// @g9tm/syncdata/sqlite — the SQLite client store (twin of G9SyncData.Client.Sqlite) over the G9SqliteDriver contract.\nexport { G9SqliteSyncStore, type G9PendingExport } from './store.js';\nexport {\n fileIncarnationMarker,\n type G9IncarnationMarker,\n type G9MarkerFileSystem,\n type G9SnapshotFileSink,\n type G9SqliteSyncStoreOptions,\n type G9ResolvedSqliteStoreOptions,\n} from './options.js';\nexport { G9ESqliteDateTimeStorage, G9ESqliteDecimalStorage, splitSql } from './sql.js';\nexport { G9SqliteStoreError } from './connection.js';\nexport { SNAPSHOT_FILE_APPLICATION_ID, SNAPSHOT_FILE_FORMAT_VERSION } from './snapshotFiles.js';\nexport { formatTicks, formatDateTimeOffset, parseDateTime, parseDateTimeOffset, ticksOf, ticksToUnixMs } from './values.js';\nexport type {\n G9ConnectionPragmas,\n G9DriverCapabilities,\n G9DriverStatement,\n G9Int64Tag,\n G9OpenOptions,\n G9RunOptions,\n G9SessionToken,\n G9SqlResult,\n G9SqlValue,\n G9SqliteDriver,\n G9TxToken,\n} from './driver.js';\n"]}
@@ -21,6 +21,32 @@ export interface G9MarkerFileSystem {
21
21
  move(from: string, to: string): Promise<void>;
22
22
  remove(path: string): Promise<void>;
23
23
  }
24
+ /**
25
+ * Where a device writes downloaded snapshot files (ADR-0072). The bytes of a file never pass through the store's own code:
26
+ * each segment goes straight from the transport to `writeSegment`, which a platform implements natively (Lynx: the
27
+ * `G9SyncDataLynxModule` of @g9tm/syncdata-lynx; Node: `nodeSnapshotFileSink` of @g9tm/syncdata/node). The store reads the
28
+ * finished file through SQLite's ATTACH, so the sink never needs to read a file back except its 100-byte header.
29
+ */
30
+ export interface G9SnapshotFileSink {
31
+ /** The directory staged files go to (created when missing). Use a cache directory, outside the backup set. */
32
+ readonly directory: string;
33
+ /** Creates `path` (or truncates it) as `size` zero bytes. */
34
+ create(path: string, size: number): Promise<void>;
35
+ /**
36
+ * Decompresses one Brotli segment (each segment is compressed on its own), checks that it is `length` bytes whose SHA-256 is
37
+ * `sha256` (lower-case hex), and writes it at `offset` in `path`. With `sync`, the file is flushed to disk before the promise
38
+ * settles. Rejects - writing nothing - when the segment does not decompress to `length` bytes or fails its hash.
39
+ */
40
+ writeSegment(path: string, offset: number, compressed: Uint8Array, length: number, sha256: string, sync: boolean): Promise<void>;
41
+ /** The file's size, or null when it does not exist. */
42
+ size(path: string): Promise<number | null>;
43
+ /** The first `length` bytes of the file (the SQLite header check). */
44
+ head(path: string, length: number): Promise<Uint8Array>;
45
+ /** Deletes the file; a missing file is not an error. */
46
+ remove(path: string): Promise<void>;
47
+ /** The full paths of the files in `directory` (for the sweep of files no stage refers to). */
48
+ list(directory: string): Promise<string[]>;
49
+ }
24
50
  export interface G9SqliteSyncStoreOptions {
25
51
  /** The SQLite driver (Lynx native, Lynxtron, or `nodeSqliteDriver()` from `@g9tm/syncdata/node`). */
26
52
  driver: G9SqliteDriver;
@@ -65,12 +91,24 @@ export interface G9SqliteSyncStoreOptions {
65
91
  /** Brotli encoder for push frames; uncompressed frames when omitted (every server accepts them). */
66
92
  frameCompressor?: G9FrameCompressor | null;
67
93
  logger?: G9SyncLogger | null;
94
+ /**
95
+ * Where snapshot files are written (ADR-0072). Null (default): the store does not offer to receive them and every pull is
96
+ * rows. With a sink, large first downloads can arrive as a SQLite file the apply copies instead of inserting row by row.
97
+ */
98
+ snapshotFiles?: G9SnapshotFileSink | null;
99
+ /** A subscription is sent as a file only when its snapshot is at least this many rows; 0 leaves it to the server. */
100
+ snapshotFileMinRows?: number;
101
+ /** The largest snapshot file accepted, uncompressed (default 2 GiB). */
102
+ snapshotFileMaxBytes?: number;
103
+ /** Bytes between two durable resume points of a file download (flush, then the stage row). Default 8 MiB. */
104
+ snapshotFileCheckpointBytes?: number;
68
105
  }
69
- export type G9ResolvedSqliteStoreOptions = Required<Omit<G9SqliteSyncStoreOptions, 'incarnationMarker' | 'frameDecompressor' | 'frameCompressor' | 'logger'>> & {
106
+ export type G9ResolvedSqliteStoreOptions = Required<Omit<G9SqliteSyncStoreOptions, 'incarnationMarker' | 'frameDecompressor' | 'frameCompressor' | 'logger' | 'snapshotFiles'>> & {
70
107
  incarnationMarker: G9IncarnationMarker | null;
71
108
  frameDecompressor: G9FrameDecompressor | null;
72
109
  frameCompressor: G9FrameCompressor | null;
73
110
  logger: G9SyncLogger | null;
111
+ snapshotFiles: G9SnapshotFileSink | null;
74
112
  };
75
113
  export declare const DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.fffffff";
76
114
  export declare function resolveStoreOptions(options: G9SqliteSyncStoreOptions): G9ResolvedSqliteStoreOptions;