@g9tm/syncdata 1.5.1 → 1.5.3

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 (64) hide show
  1. package/LICENSE.md +21 -21
  2. package/PARITY.md +96 -96
  3. package/README.md +71 -71
  4. package/THIRD-PARTY-NOTICES.md +31 -31
  5. package/dist/abstractions/digest.js.map +1 -1
  6. package/dist/abstractions/enums.js.map +1 -1
  7. package/dist/abstractions/errors.js.map +1 -1
  8. package/dist/abstractions/guid.js.map +1 -1
  9. package/dist/abstractions/key.js.map +1 -1
  10. package/dist/abstractions/long.js.map +1 -1
  11. package/dist/abstractions/parameters.js.map +1 -1
  12. package/dist/brotli-js/decode.js.map +1 -1
  13. package/dist/brotli-js/index.js.map +1 -1
  14. package/dist/client/engine.d.ts +6 -0
  15. package/dist/client/engine.js +9 -0
  16. package/dist/client/engine.js.map +1 -1
  17. package/dist/client/model.js.map +1 -1
  18. package/dist/client/progress.js.map +1 -1
  19. package/dist/client/runs.js.map +1 -1
  20. package/dist/client/storeTypes.d.ts +2 -0
  21. package/dist/client/storeTypes.js.map +1 -1
  22. package/dist/client/transport.js.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +1 -1
  25. package/dist/index.js.map +1 -1
  26. package/dist/internal/abort.js.map +1 -1
  27. package/dist/internal/base64.js.map +1 -1
  28. package/dist/internal/dotnetFormat.js.map +1 -1
  29. package/dist/internal/md5.js.map +1 -1
  30. package/dist/internal/sha256.js.map +1 -1
  31. package/dist/internal/utf8.js.map +1 -1
  32. package/dist/node/index.js.map +1 -1
  33. package/dist/node/snapshotFileSink.js.map +1 -1
  34. package/dist/node/sqliteDriver.js.map +1 -1
  35. package/dist/protocol/dtos.js.map +1 -1
  36. package/dist/protocol/protocol.js.map +1 -1
  37. package/dist/protocol/rowBatch/columnLayout.js.map +1 -1
  38. package/dist/protocol/rowBatch/format.js.map +1 -1
  39. package/dist/protocol/rowBatch/reader.js.map +1 -1
  40. package/dist/protocol/rowBatch/writer.js.map +1 -1
  41. package/dist/protocol/wire.js.map +1 -1
  42. package/dist/signalr/index.js.map +1 -1
  43. package/dist/signalr/protocols.js.map +1 -1
  44. package/dist/signalr/transport.js.map +1 -1
  45. package/dist/sqlite/apply.js.map +1 -1
  46. package/dist/sqlite/commands.js.map +1 -1
  47. package/dist/sqlite/connection.js.map +1 -1
  48. package/dist/sqlite/driver.js.map +1 -1
  49. package/dist/sqlite/index.js.map +1 -1
  50. package/dist/sqlite/internals.js.map +1 -1
  51. package/dist/sqlite/options.js.map +1 -1
  52. package/dist/sqlite/push.js.map +1 -1
  53. package/dist/sqlite/query.js.map +1 -1
  54. package/dist/sqlite/revocation.d.ts +6 -0
  55. package/dist/sqlite/revocation.js +41 -0
  56. package/dist/sqlite/revocation.js.map +1 -1
  57. package/dist/sqlite/sql.js +113 -113
  58. package/dist/sqlite/sql.js.map +1 -1
  59. package/dist/sqlite/store.d.ts +1 -0
  60. package/dist/sqlite/store.js +3 -0
  61. package/dist/sqlite/store.js.map +1 -1
  62. package/dist/sqlite/values.js.map +1 -1
  63. package/dist/testing/index.js.map +1 -1
  64. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/sqlite/query.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Query.cs: staging, reconciliation reads, pending counts, change\n// feed, rejections, run reports and statistics.\nimport { G9SyncDigest } from '../abstractions/digest.js';\nimport { G9SyncKey } from '../abstractions/key.js';\nimport { G9Long, parseJson } from '../abstractions/long.js';\nimport { guidToN, tryNormalizeGuid } from '../abstractions/guid.js';\nimport type {\n G9ChangeFeedEntry,\n G9ChangeFeedKeyFilter,\n G9LocalRowEntry,\n G9PendingSummary,\n G9PendingTable,\n G9ResumePoint,\n G9StagedPull,\n G9SyncRejection,\n G9SyncRunReport,\n} from '../client/storeTypes.js';\nimport { validateChangeFeedKeyFilter } from '../client/storeTypes.js';\nimport type { G9DtNegotiatedTable, G9DtSyncChunk, G9DtTableDigest } from '../protocol/dtos.js';\nimport { readContinuation, readPullPlan } from '../protocol/wire.js';\nimport { asLong, asNumber, asOptionalString, asString, statementsOf, type G9SqliteConnection } from './connection.js';\nimport type { G9SqlValue } from './driver.js';\nimport { findByServerName, getLocal, persistedJson, readSubscriptions, type LocalTable, type StoreInternals } from './internals.js';\nimport { allColumnsMask, bit, keyExpression, literal, NOW_MS, quote } from './sql.js';\nimport { deleteFiles, forgetPendingSegments, persistedPlan, stageFileSegment, takeStagedFiles } from './snapshotFiles.js';\nimport { formatTicks, ticksOf, ticksToUnixMs } from './values.js';\n\n// ================================================================ staging\n\nexport async function readStagedRun(connection: G9SqliteConnection, runId: string): Promise<G9StagedPull | null> {\n const rows = await connection.query('SELECT plan_json, backfills_json, created_utc, generation, stage_seq, from_cursors_json FROM g9_stage_runs WHERE run_id = $r', {\n $r: runId,\n });\n const r = rows[0];\n if (!r) return null;\n const backfills = r[1] === null ? [] : (parseJson(asString(r[1])) as { tableId?: number; columns?: string[] }[]);\n const fromCursors = r[5] === null ? {} : (JSON.parse(asString(r[5])) as { [key: string]: string | null });\n return {\n runId,\n plan: readPullPlan(parseJson(asString(r[0]))),\n backfills: (Array.isArray(backfills) ? backfills : []).map((b) => ({ tableId: Number(b.tableId ?? 0), columns: Array.isArray(b.columns) ? b.columns.map(String) : [] })),\n createdUtcMs: asNumber(r[2]),\n generation: asOptionalString(r[3]),\n stageSequence: asNumber(r[4]),\n plannedFromCursors: fromCursors ?? {},\n };\n}\n\nexport async function getStagedPull(store: StoreInternals, generation: string | null): Promise<G9StagedPull | null> {\n const connection = store.reader();\n const runId =\n generation === null\n ? await connection.scalar('SELECT run_id FROM g9_stage_runs ORDER BY created_utc DESC LIMIT 1')\n : await connection.scalar('SELECT run_id FROM g9_stage_runs WHERE generation = $g ORDER BY created_utc DESC LIMIT 1', { $g: generation });\n return runId === null ? null : readStagedRun(connection, asString(runId));\n}\n\nexport async function pruneStagedPulls(store: StoreInternals, olderThanUtcMs: number, maxBytes: number, keepGeneration: string | null): Promise<number> {\n let files: string[] = [];\n const pruned = await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const doomed = (await connection.query('SELECT run_id FROM g9_stage_runs WHERE created_utc < $c', { $c: olderThanUtcMs })).map((r) => asString(r[0]));\n // The byte cap is for the stages nobody is about to resume: newest first, past the cap they go (ADR-0060).\n let kept = 0;\n for (const r of await connection.query(\n 'SELECT r.run_id, (SELECT coalesce(sum(length(payload)), 0) FROM g9_stage s WHERE s.run_id = r.run_id) ' +\n '+ (SELECT coalesce(sum(bytes_received), 0) FROM g9_stage_files f WHERE f.run_id = r.run_id) FROM g9_stage_runs r ' +\n 'WHERE r.created_utc >= $c AND (r.generation IS NULL OR r.generation <> $g) ORDER BY r.created_utc DESC',\n { $c: olderThanUtcMs, $g: keepGeneration ?? '' },\n )) {\n kept += asNumber(r[1]);\n if (kept > Math.max(0, maxBytes)) doomed.push(asString(r[0]));\n }\n for (const runId of doomed) {\n files = files.concat(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 return doomed.length;\n }),\n );\n await deleteFiles(store, files);\n return pruned;\n}\n\nexport async function discardAllStagedPulls(store: StoreInternals): Promise<number> {\n let files: string[] = [];\n const count = await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const count = asNumber(await connection.scalar('SELECT count(*) FROM g9_stage_runs'));\n files = await takeStagedFiles(connection, 'SELECT run_id FROM g9_stage_files');\n await connection.exec('DELETE FROM g9_stage; DELETE FROM g9_stage_runs;');\n return count;\n }),\n );\n await deleteFiles(store, files);\n return count;\n}\n\nexport async function beginStagedPull(store: StoreInternals, pull: G9StagedPull): Promise<void> {\n let replaced: string[] = [];\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n // Only the stage this one replaces goes: the same generation (ADR-0060).\n replaced = await takeStagedFiles(connection, 'SELECT run_id FROM g9_stage_runs WHERE generation IS $g', { $g: pull.generation });\n await connection.exec(\n 'DELETE FROM g9_stage WHERE run_id IN (SELECT run_id FROM g9_stage_runs WHERE generation IS $g); DELETE FROM g9_stage_runs WHERE generation IS $g',\n { $g: pull.generation },\n );\n // Read inside the transaction that inserts the run: rows written after it are newer than the stage (ADR-0046).\n const stageSequence = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n const fromCursors: { [key: string]: string | null } = {};\n for (const key of Object.keys(pull.plannedFromCursors)) fromCursors[key] = pull.plannedFromCursors[key] ?? null;\n await connection.exec(\n 'INSERT INTO g9_stage_runs (run_id, plan_json, backfills_json, created_utc, complete, generation, stage_seq, from_cursors_json) VALUES ($r, $p, $b, $c, 0, $g, $s, $f)',\n {\n $r: pull.runId,\n $p: persistedPlan(pull.plan),\n $b: persistedJson(pull.backfills),\n $c: pull.createdUtcMs,\n $g: pull.generation,\n $s: stageSequence,\n // Dictionary<string, string?>: a null value stays (DefaultIgnoreCondition only drops null PROPERTIES).\n $f: JSON.stringify(fromCursors),\n },\n );\n }),\n );\n await deleteFiles(store, replaced);\n}\n\nexport async function stageChunk(store: StoreInternals, runId: string, chunk: G9DtSyncChunk, durability: (connection: G9SqliteConnection) => Promise<(() => Promise<void>) | null>): Promise<void> {\n await store.writeLock.run(async () => {\n const connection = store.writer();\n if (chunk.file) {\n // A snapshot-file segment goes to its place in the staged file, not into g9_stage (ADR-0072).\n await stageFileSegment(store, runId, chunk);\n return;\n }\n const restore = await durability(connection);\n try {\n // One transaction, one bridge call (a chunk used to cost ~7: PRAGMA reads, begin, insert, commit — LES-0056).\n await connection.runAtomic([\n ...statementsOf('INSERT OR REPLACE INTO g9_stage (run_id, seq, subscription_key, row_count, continuation_json, payload) VALUES ($r, $s, $k, $n, $c, $p)', {\n $r: runId,\n $s: chunk.sequence,\n $k: chunk.subscriptionKey ?? null,\n $n: chunk.rowCount,\n $c: chunk.continuation ? persistedJson(chunk.continuation) : null,\n $p: chunk.payload ?? null,\n }),\n ...(chunk.isFinal ? statementsOf('UPDATE g9_stage_runs SET complete = 1 WHERE run_id = $r', { $r: runId }) : []),\n ]);\n } finally {\n if (restore) await restore();\n }\n });\n}\n\nexport async function getResumePoint(store: StoreInternals, runId: string): Promise<G9ResumePoint> {\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const flag = await connection.scalar('SELECT complete FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n const complete = typeof flag === 'number' && flag !== 0;\n // A resumed stream starts at the last durable checkpoint of a snapshot file.\n forgetPendingSegments(store, runId);\n let continuation = null;\n let lastSequence = -1;\n if (!complete) {\n const rows = await connection.query('SELECT seq, continuation_json FROM g9_stage WHERE run_id = $r AND continuation_json IS NOT NULL ORDER BY seq DESC LIMIT 1', { $r: runId });\n const r = rows[0];\n if (r) {\n lastSequence = asNumber(r[0]);\n continuation = readContinuation(parseJson(asString(r[1])));\n }\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r AND seq > $s', { $r: runId, $s: lastSequence });\n }\n const totals = (\n await connection.query(\n 'SELECT coalesce(sum(row_count), 0), coalesce(sum(length(payload)), 0) + (SELECT coalesce(sum(bytes_received), 0) FROM g9_stage_files WHERE run_id = $r) ' +\n 'FROM g9_stage WHERE run_id = $r',\n { $r: runId },\n )\n )[0];\n return { continuation, stagedRows: totals ? asNumber(totals[0]) : 0, stagedBytes: totals ? asNumber(totals[1]) : 0, complete };\n }),\n );\n}\n\nexport async function discardStagedPull(store: StoreInternals, runId: string): Promise<void> {\n let files: string[] = [];\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n files = 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 forgetPendingSegments(store, runId);\n await deleteFiles(store, files);\n}\n\n// ================================================================ reconciliation reads\n\nfunction computedColumns(local: LocalTable, table: G9DtNegotiatedTable): string[] {\n return table.computedColumns.filter((c) => local.model.indexOf(c) >= 0);\n}\n\nasync function memberRows(connection: G9SqliteConnection, local: LocalTable, subscriptionKey: string): Promise<(readonly G9SqlValue[])[] | null> {\n const records = await readSubscriptions(connection, subscriptionKey);\n const record = records[0];\n if (!record) return null;\n return record.ephemeral\n ? connection.query(\n 'SELECT r.pk, r.server_ver, r.dirty FROM g9_rows r WHERE r.tid = $t AND r.deleted = 0 AND r.dirty <> 2 ' +\n 'AND EXISTS (SELECT 1 FROM g9_ephemeral_rows e WHERE e.sub_key = $k AND e.tid = r.tid AND e.pk = r.pk)',\n { $t: local.tid, $k: subscriptionKey },\n )\n : connection.query('SELECT r.pk, r.server_ver, r.dirty FROM g9_rows r WHERE r.tid = $t AND r.deleted = 0 AND r.dirty <> 2 AND (r.subs & $b) <> 0', {\n $t: local.tid,\n $b: bit(record.slot),\n });\n}\n\nexport async function computeDigest(store: StoreInternals, subscriptionKey: string, table: G9DtNegotiatedTable): Promise<G9DtTableDigest> {\n store.ensureInitialized();\n const local = findByServerName(store, table.name);\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\n const computed = computedColumns(local, table);\n const digests: G9Long[] = [];\n const counts: number[] = [];\n for (let i = 0; i < 256; i++) {\n digests.push(G9Long.ZERO);\n counts.push(0);\n }\n const connection = store.reader();\n if (computed.length === 0) {\n for (const r of (await memberRows(connection, local, subscriptionKey)) ?? []) {\n const key = asString(r[0]);\n const bucket = G9SyncDigest.getBucket(key);\n counts[bucket] = (counts[bucket] as number) + 1;\n digests[bucket] = (digests[bucket] as G9Long).xor(G9SyncDigest.getRowHash(key, asLong(r[1])));\n }\n } else {\n for (const entry of await readMemberEntries(connection, local, subscriptionKey, computed)) {\n counts[entry.bucket] = (counts[entry.bucket] as number) + 1;\n digests[entry.bucket] = (digests[entry.bucket] as G9Long).xor(entry.hash);\n }\n }\n return { tableId: table.tableId, computedColumns: computed, digests, counts };\n}\n\nexport async function readLocalEntries(\n store: StoreInternals,\n subscriptionKey: string,\n table: G9DtNegotiatedTable,\n buckets: ReadonlySet<number>,\n serverKeys: ReadonlySet<string>,\n): Promise<G9LocalRowEntry[]> {\n store.ensureInitialized();\n const local = findByServerName(store, table.name);\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\n const computed = computedColumns(local, table);\n const entries = new Map<string, G9LocalRowEntry>();\n const connection = store.reader();\n if (computed.length === 0) {\n for (const r of (await memberRows(connection, local, subscriptionKey)) ?? []) {\n const key = asString(r[0]);\n const bucket = G9SyncDigest.getBucket(key);\n if (!buckets.has(bucket)) continue;\n const version = asLong(r[1]);\n entries.set(key, { key, bucket, version: version.toNumber(), hash: G9SyncDigest.getRowHash(key, version), member: true, dirty: asNumber(r[2]) !== 0 });\n }\n } else {\n for (const entry of await readMemberEntries(connection, local, subscriptionKey, computed)) {\n if (buckets.has(entry.bucket)) entries.set(entry.key, entry);\n }\n }\n const missing: string[] = [];\n serverKeys.forEach((key) => {\n if (!entries.has(key)) missing.push(key);\n });\n for (let i = 0; i < missing.length; i += 5000) {\n const json = JSON.stringify(missing.slice(i, i + 5000));\n for (const entry of await readEntries(connection, local, computed, 'r.deleted = 0 AND r.pk IN (SELECT value FROM json_each($keys))', false, { $keys: json })) {\n entries.set(entry.key, entry);\n }\n }\n return Array.from(entries.values());\n}\n\nasync function readMemberEntries(connection: G9SqliteConnection, local: LocalTable, subscriptionKey: string, computed: string[]): Promise<G9LocalRowEntry[]> {\n const record = (await readSubscriptions(connection, subscriptionKey))[0];\n if (!record) return [];\n return record.ephemeral\n ? readEntries(\n connection,\n local,\n computed,\n 'r.deleted = 0 AND r.dirty <> 2 AND EXISTS (SELECT 1 FROM g9_ephemeral_rows e WHERE e.sub_key = $sub AND e.tid = r.tid AND e.pk = r.pk)',\n true,\n { $sub: subscriptionKey },\n )\n : readEntries(connection, local, computed, 'r.deleted = 0 AND r.dirty <> 2 AND (r.subs & $bit) <> 0', true, { $bit: bit(record.slot) });\n}\n\nasync function readEntries(\n connection: G9SqliteConnection,\n local: LocalTable,\n computed: string[],\n where: string,\n member: boolean,\n params: { [name: string]: G9SqlValue | G9Long },\n): Promise<G9LocalRowEntry[]> {\n const computedTypes = computed.map((name) => (local.model.columns[local.model.indexOf(name)] as { type: number }).type);\n // typeof() next to each computed value: JavaScript cannot tell an INTEGER 5 from a REAL 5.0, and their canonical texts\n // can differ (1E+15 vs 1000000000000000).\n const select =\n 'SELECT r.pk, r.server_ver, r.dirty' +\n computed.map((c) => ', b.' + quote(c) + ', typeof(b.' + quote(c) + ')').join('') +\n ' FROM g9_rows r' +\n (computed.length === 0 ? '' : ` LEFT JOIN ${local.quoted} b ON b.${local.keyQuoted} = r.pk`) +\n ' WHERE r.tid = $tid AND ' +\n where;\n const rows = await connection.query(select, { $tid: local.tid, ...params });\n return rows.map((r) => {\n const key = asString(r[0]);\n const version = asLong(r[1]);\n const values: (string | null)[] = [];\n for (let i = 0; i < computed.length; i++) {\n const value = r[3 + i * 2] as G9SqlValue;\n const storage = asString(r[4 + i * 2]);\n values.push(value === null ? null : G9SyncDigest.canonicalText(computedTypes[i] as number, value, storage === 'real' ? 'real' : storage === 'integer' ? 'integer' : undefined));\n }\n return { key, bucket: G9SyncDigest.getBucket(key), version: version.toNumber(), hash: G9SyncDigest.getRowHash(key, version, values), member, dirty: asNumber(r[2]) !== 0 };\n });\n}\n\n// ================================================================ queries\n\nexport async function getPendingSummary(store: StoreInternals): Promise<G9PendingSummary> {\n const connection = store.reader();\n const tables: G9PendingTable[] = (\n await connection.query(\n 'SELECT t.local_name, ' +\n 'sum(CASE WHEN r.dirty = 1 AND r.rejected = 0 THEN 1 ELSE 0 END), ' +\n 'sum(CASE WHEN r.dirty = 2 AND r.rejected = 0 THEN 1 ELSE 0 END), ' +\n 'sum(CASE WHEN r.rejected = 1 THEN 1 ELSE 0 END) ' +\n 'FROM g9_rows r JOIN g9_tables t ON t.tid = r.tid WHERE r.dirty <> 0 GROUP BY t.local_name ORDER BY t.local_name',\n )\n ).map((r) => ({ localTable: asString(r[0]), upserts: asNumber(r[1]), deletes: asNumber(r[2]), rejected: asNumber(r[3]) }));\n const pendingCommands = asNumber(await connection.scalar('SELECT count(*) FROM g9_commands WHERE state = 0'));\n let totalRows = 0;\n let rejectedRows = 0;\n for (const t of tables) {\n totalRows += t.upserts + t.deletes;\n rejectedRows += t.rejected;\n }\n return { tables, totalRows, rejectedRows, pendingCommands };\n}\n\nexport async function readChangeFeed(store: StoreInternals, localTable: string, afterSequence: number, limit: number): Promise<G9ChangeFeedEntry[]> {\n store.ensureInitialized();\n const table = getLocal(store, localTable);\n const rows = await store\n .reader()\n .query('SELECT local_seq, pk, (deleted = 1 OR dirty = 2), dirty <> 0 FROM g9_rows WHERE tid = $t AND local_seq > $a ORDER BY local_seq LIMIT $l', {\n $t: table.tid,\n $a: afterSequence,\n $l: Math.max(1, limit),\n });\n return rows.map((r) => ({ sequence: asNumber(r[0]), key: asString(r[1]), deleted: asNumber(r[2]) !== 0, localPending: asNumber(r[3]) !== 0 }));\n}\n\n/** `ReadChangeFeedAsync(..., G9CChangeFeedKeyFilter, ...)`: the same read, narrowed in SQL to the selected keys plus every deletion. */\nexport async function readChangeFeedFiltered(\n store: StoreInternals,\n localTable: string,\n afterSequence: number,\n limit: number,\n keyFilter: G9ChangeFeedKeyFilter,\n): Promise<G9ChangeFeedEntry[]> {\n validateChangeFeedKeyFilter(keyFilter);\n store.ensureInitialized();\n const table = getLocal(store, localTable);\n const parameters: { [name: string]: G9SqlValue } = { $g9t: table.tid, $g9a: afterSequence, $g9l: Math.max(1, limit) };\n for (const [name, value] of Object.entries(keyFilter.parameters ?? {})) parameters[name] = value;\n const rows = await store\n .reader()\n .query(\n 'SELECT local_seq, pk, (deleted = 1 OR dirty = 2), dirty <> 0 FROM g9_rows ' +\n `WHERE tid = $g9t AND local_seq > $g9a AND (deleted = 1 OR dirty = 2 OR pk IN (${keyFilter.keySql.trim()})) ORDER BY local_seq LIMIT $g9l`,\n parameters,\n );\n return rows.map((r) => ({ sequence: asNumber(r[0]), key: asString(r[1]), deleted: asNumber(r[2]) !== 0, localPending: asNumber(r[3]) !== 0 }));\n}\n\nexport async function getChangeSequence(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n return asNumber(await store.reader().scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n}\n\nexport async function getRejections(store: StoreInternals): Promise<G9SyncRejection[]> {\n const rows = await store\n .reader()\n .query(\n 'SELECT t.local_name, j.pk, j.code, j.message, j.sql_state, j.constraint_name, j.column_name, j.details, j.at_utc ' +\n 'FROM g9_rejections j JOIN g9_tables t ON t.tid = j.tid JOIN g9_rows r ON r.tid = j.tid AND r.pk = j.pk WHERE r.rejected = 1 ORDER BY j.at_utc',\n );\n return rows.map((r) => ({\n localTable: asString(r[0]),\n key: asString(r[1]),\n code: asString(r[2]),\n message: asOptionalString(r[3]),\n sqlState: asOptionalString(r[4]),\n constraint: asOptionalString(r[5]),\n column: asOptionalString(r[6]),\n details: asOptionalString(r[7]),\n atUtcMs: asNumber(r[8]),\n }));\n}\n\nexport async function retryRejected(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\n store.ensureInitialized();\n let where = 'rejected = 1';\n const params: { [name: string]: G9SqlValue } = {};\n if (localTable !== null) {\n where += ' AND tid = $t';\n params.$t = getLocal(store, localTable).tid;\n }\n if (key !== null) {\n where += ' AND pk = $pk';\n params.$pk = key;\n }\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n await connection.exec('DELETE FROM g9_rejections WHERE (tid, pk) IN (SELECT tid, pk FROM g9_rows WHERE ' + where + ')', params);\n return connection.exec('UPDATE g9_rows SET rejected = 0 WHERE ' + where, params);\n }),\n );\n}\n\nexport async function markDirty(store: StoreInternals, localTable: string, keys: readonly string[]): Promise<number> {\n store.ensureInitialized();\n const table = getLocal(store, localTable);\n const normalized = keys.map((k) => G9SyncKey.tryNormalize(table.model.keyType, k) ?? k);\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n let marked = 0;\n for (let i = 0; i < normalized.length; i += 5000) {\n const json = JSON.stringify(normalized.slice(i, i + 5000));\n marked += await markPending(store.writer(), table, 'SELECT value AS pk FROM json_each($keys)', { $keys: json }, 'dirty = 1, dirty_mask = ' + literal(allColumnsMask(table.model.columns.length)));\n }\n return marked;\n }),\n );\n}\n\n/** Marks the rows `keysSql` selects as pending, giving EACH its own local sequence (LES-0039). */\nexport async function markPending(connection: G9SqliteConnection, table: LocalTable, keysSql: string, params: { [name: string]: G9SqlValue }, set: string): Promise<number> {\n await connection.exec('CREATE TEMP TABLE IF NOT EXISTS g9_mark (pk TEXT NOT NULL PRIMARY KEY, n INTEGER NOT NULL); DELETE FROM temp.g9_mark;');\n const count = await connection.exec(`INSERT INTO temp.g9_mark (pk, n) SELECT pk, row_number() OVER (ORDER BY pk) FROM (SELECT DISTINCT pk FROM (${keysSql}) WHERE pk IS NOT NULL)`, params);\n if (count === 0) return 0;\n const first = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n await connection.exec('INSERT OR IGNORE INTO g9_rows (tid, pk) SELECT $t, pk FROM temp.g9_mark', { $t: table.tid });\n const marked = await connection.exec(\n `UPDATE g9_rows SET ${set}, local_seq = $first + m.n, hlc_ms = ${NOW_MS}, rejected = 0, deleted = 0 FROM temp.g9_mark AS m WHERE g9_rows.tid = $t AND g9_rows.pk = m.pk`,\n { $first: first, $t: table.tid },\n );\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1; DELETE FROM temp.g9_mark;', { $n: count });\n return marked;\n}\n\nexport async function adoptExistingRows(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n let adopted = 0;\n for (const table of store.byLocal.values()) {\n adopted += await store.writer().exec(`INSERT OR IGNORE INTO g9_rows (tid, pk) SELECT $t, ${keyExpression(table.model, 'b')} FROM ${table.quoted} AS b`, { $t: table.tid });\n }\n return adopted;\n }),\n );\n}\n\n// ================================================================ reports and statistics\n\n/** The run report as .NET's G9SyncClientJsonContext writes it (camelCase, nulls omitted, DateTime/Guid in .NET text). */\nfunction reportToJson(report: G9SyncRunReport): string {\n const startedTicks = ticksOf(1970, 1, 1, 0, 0, 0, 0).add(G9Long.fromNumber(Math.floor(report.startedUtcMs)).multiplySmall(10000));\n return persistedJson({\n runId: report.runId,\n startedUtc: formatTicks(startedTicks) + 'Z',\n durationMs: report.durationMs,\n outcome: report.outcome,\n priority: report.priority,\n errorCode: report.errorCode,\n errorMessage: report.errorMessage,\n pushed: report.pushed,\n rejected: report.rejected,\n conflicts: report.conflicts,\n downloaded: report.downloaded,\n applied: report.applied,\n downloadedBytes: report.downloadedBytes,\n subscriptions: report.subscriptions,\n phaseMs: report.phaseMs,\n triggersSkipped: report.triggersSkipped,\n foreignTriggers: report.foreignTriggers,\n applyTransactions: report.applyTransactions,\n indexesDeferred: report.indexesDeferred,\n indexRebuildMs: report.indexRebuildMs,\n liveIndexReasons: report.liveIndexReasons,\n unchangedRows: report.unchangedRows,\n });\n}\n\nfunction reportFromJson(json: string): G9SyncRunReport | null {\n const v = parseJson(json) as { [key: string]: unknown } | null;\n if (!v || typeof v !== 'object') return null;\n const num = (x: unknown) => (typeof x === 'number' ? x : x instanceof G9Long ? x.toNumber() : 0);\n const started = typeof v.startedUtc === 'string' ? Date.parse(v.startedUtc.replace(/(\\.\\d{3})\\d+/, '$1')) : NaN;\n return {\n runId: typeof v.runId === 'string' ? v.runId : '',\n startedUtcMs: isNaN(started) ? 0 : started,\n durationMs: num(v.durationMs),\n outcome: typeof v.outcome === 'string' ? v.outcome : '',\n priority: typeof v.priority === 'string' ? v.priority : '',\n errorCode: typeof v.errorCode === 'string' ? v.errorCode : null,\n errorMessage: typeof v.errorMessage === 'string' ? v.errorMessage : null,\n pushed: num(v.pushed),\n rejected: num(v.rejected),\n conflicts: num(v.conflicts),\n downloaded: num(v.downloaded),\n applied: num(v.applied),\n downloadedBytes: num(v.downloadedBytes),\n subscriptions: Array.isArray(v.subscriptions) ? v.subscriptions.map(String) : [],\n phaseMs: (v.phaseMs as { [phase: string]: number }) ?? {},\n triggersSkipped: typeof v.triggersSkipped === 'boolean' ? v.triggersSkipped : null,\n foreignTriggers: Array.isArray(v.foreignTriggers) ? v.foreignTriggers.map(String) : [],\n applyTransactions: num(v.applyTransactions),\n indexesDeferred: num(v.indexesDeferred),\n indexRebuildMs: num(v.indexRebuildMs),\n liveIndexReasons: (v.liveIndexReasons as { [table: string]: string }) ?? {},\n unchangedRows: num(v.unchangedRows),\n };\n}\n\nexport async function saveRunReport(store: StoreInternals, report: G9SyncRunReport, keep: number): Promise<void> {\n const runId = tryNormalizeGuid(report.runId) ? guidToN(report.runId) : report.runId;\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n await connection.exec('INSERT OR REPLACE INTO g9_runs (run_id, started_utc, report_json) VALUES ($r, $s, $j)', { $r: runId, $s: report.startedUtcMs, $j: reportToJson(report) });\n await connection.exec('DELETE FROM g9_runs WHERE run_id NOT IN (SELECT run_id FROM g9_runs ORDER BY started_utc DESC LIMIT $k)', { $k: Math.max(1, keep) });\n }),\n );\n}\n\nexport async function getRecentRunReports(store: StoreInternals, count: number): Promise<G9SyncRunReport[]> {\n const rows = await store.reader().query('SELECT report_json FROM g9_runs ORDER BY started_utc DESC LIMIT $c', { $c: Math.max(1, count) });\n const reports: G9SyncRunReport[] = [];\n for (const r of rows) {\n const report = reportFromJson(asString(r[0]));\n if (report) reports.push(report);\n }\n return reports;\n}\n\nexport async function getPhaseStatistics(store: StoreInternals): Promise<{ [key: string]: number }> {\n const statistics: { [key: string]: number } = {};\n for (const r of await store.reader().query('SELECT key, value FROM g9_stats')) statistics[asString(r[0])] = asNumber(r[1]);\n return statistics;\n}\n\nexport async function recordPhaseStatistics(store: StoreInternals, samples: { [key: string]: number }): Promise<void> {\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n for (const key of Object.keys(samples)) {\n const value = samples[key] as number;\n if (!isFinite(value) || value < 0) continue;\n await store\n .writer()\n .exec(\n 'INSERT INTO g9_stats (key, value, samples) VALUES ($k, $v, 1) ON CONFLICT(key) DO UPDATE SET value = value * 0.7 + excluded.value * 0.3, samples = samples + 1',\n { $k: key, $v: value },\n );\n }\n }),\n );\n}\n\nexport async function purgeDeletedFeed(store: StoreInternals, keep: number): Promise<number> {\n return store.writeLock.run(async () => {\n const connection = store.writer();\n const threshold = await connection.scalar('SELECT local_seq FROM g9_rows WHERE deleted = 1 ORDER BY local_seq DESC LIMIT 1 OFFSET $k', { $k: Math.max(0, keep) });\n if (threshold === null) return 0;\n return connection.transaction('immediate', async () => {\n // The floor moves in the same transaction as the purge (ADR-0059).\n const purgedUpTo = await connection.scalar('SELECT max(local_seq) FROM g9_rows WHERE deleted = 1 AND dirty = 0 AND local_seq < $x', { $x: threshold });\n if (purgedUpTo === null) return 0;\n const purged = await connection.exec('DELETE FROM g9_rows WHERE deleted = 1 AND dirty = 0 AND local_seq < $x', { $x: threshold });\n await connection.exec(\n \"INSERT INTO g9_meta (key, value) VALUES ('feed_floor_seq', $f) ON CONFLICT(key) DO UPDATE SET value = excluded.value WHERE CAST(value AS INTEGER) < CAST(excluded.value AS INTEGER)\",\n { $f: asLong(purgedUpTo).toString() },\n );\n return purged;\n });\n });\n}\n\nexport async function getChangeFeedFloor(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n const text = await store.reader().scalar(\"SELECT value FROM g9_meta WHERE key = 'feed_floor_seq'\");\n if (typeof text !== 'string' || !/^[+-]?\\d+$/.test(text.trim())) return 0;\n return Number(text.trim());\n}\n\nexport { ticksToUnixMs };\n"]}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/sqlite/query.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Query.cs: staging, reconciliation reads, pending counts, change\r\n// feed, rejections, run reports and statistics.\r\nimport { G9SyncDigest } from '../abstractions/digest.js';\r\nimport { G9SyncKey } from '../abstractions/key.js';\r\nimport { G9Long, parseJson } from '../abstractions/long.js';\r\nimport { guidToN, tryNormalizeGuid } from '../abstractions/guid.js';\r\nimport type {\r\n G9ChangeFeedEntry,\r\n G9ChangeFeedKeyFilter,\r\n G9LocalRowEntry,\r\n G9PendingSummary,\r\n G9PendingTable,\r\n G9ResumePoint,\r\n G9StagedPull,\r\n G9SyncRejection,\r\n G9SyncRunReport,\r\n} from '../client/storeTypes.js';\r\nimport { validateChangeFeedKeyFilter } from '../client/storeTypes.js';\r\nimport type { G9DtNegotiatedTable, G9DtSyncChunk, G9DtTableDigest } from '../protocol/dtos.js';\r\nimport { readContinuation, readPullPlan } from '../protocol/wire.js';\r\nimport { asLong, asNumber, asOptionalString, asString, statementsOf, type G9SqliteConnection } from './connection.js';\r\nimport type { G9SqlValue } from './driver.js';\r\nimport { findByServerName, getLocal, persistedJson, readSubscriptions, type LocalTable, type StoreInternals } from './internals.js';\r\nimport { allColumnsMask, bit, keyExpression, literal, NOW_MS, quote } from './sql.js';\r\nimport { deleteFiles, forgetPendingSegments, persistedPlan, stageFileSegment, takeStagedFiles } from './snapshotFiles.js';\r\nimport { formatTicks, ticksOf, ticksToUnixMs } from './values.js';\r\n\r\n// ================================================================ staging\r\n\r\nexport async function readStagedRun(connection: G9SqliteConnection, runId: string): Promise<G9StagedPull | null> {\r\n const rows = await connection.query('SELECT plan_json, backfills_json, created_utc, generation, stage_seq, from_cursors_json FROM g9_stage_runs WHERE run_id = $r', {\r\n $r: runId,\r\n });\r\n const r = rows[0];\r\n if (!r) return null;\r\n const backfills = r[1] === null ? [] : (parseJson(asString(r[1])) as { tableId?: number; columns?: string[] }[]);\r\n const fromCursors = r[5] === null ? {} : (JSON.parse(asString(r[5])) as { [key: string]: string | null });\r\n return {\r\n runId,\r\n plan: readPullPlan(parseJson(asString(r[0]))),\r\n backfills: (Array.isArray(backfills) ? backfills : []).map((b) => ({ tableId: Number(b.tableId ?? 0), columns: Array.isArray(b.columns) ? b.columns.map(String) : [] })),\r\n createdUtcMs: asNumber(r[2]),\r\n generation: asOptionalString(r[3]),\r\n stageSequence: asNumber(r[4]),\r\n plannedFromCursors: fromCursors ?? {},\r\n };\r\n}\r\n\r\nexport async function getStagedPull(store: StoreInternals, generation: string | null): Promise<G9StagedPull | null> {\r\n const connection = store.reader();\r\n const runId =\r\n generation === null\r\n ? await connection.scalar('SELECT run_id FROM g9_stage_runs ORDER BY created_utc DESC LIMIT 1')\r\n : await connection.scalar('SELECT run_id FROM g9_stage_runs WHERE generation = $g ORDER BY created_utc DESC LIMIT 1', { $g: generation });\r\n return runId === null ? null : readStagedRun(connection, asString(runId));\r\n}\r\n\r\nexport async function pruneStagedPulls(store: StoreInternals, olderThanUtcMs: number, maxBytes: number, keepGeneration: string | null): Promise<number> {\r\n let files: string[] = [];\r\n const pruned = await store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const doomed = (await connection.query('SELECT run_id FROM g9_stage_runs WHERE created_utc < $c', { $c: olderThanUtcMs })).map((r) => asString(r[0]));\r\n // The byte cap is for the stages nobody is about to resume: newest first, past the cap they go (ADR-0060).\r\n let kept = 0;\r\n for (const r of await connection.query(\r\n 'SELECT r.run_id, (SELECT coalesce(sum(length(payload)), 0) FROM g9_stage s WHERE s.run_id = r.run_id) ' +\r\n '+ (SELECT coalesce(sum(bytes_received), 0) FROM g9_stage_files f WHERE f.run_id = r.run_id) FROM g9_stage_runs r ' +\r\n 'WHERE r.created_utc >= $c AND (r.generation IS NULL OR r.generation <> $g) ORDER BY r.created_utc DESC',\r\n { $c: olderThanUtcMs, $g: keepGeneration ?? '' },\r\n )) {\r\n kept += asNumber(r[1]);\r\n if (kept > Math.max(0, maxBytes)) doomed.push(asString(r[0]));\r\n }\r\n for (const runId of doomed) {\r\n files = files.concat(await takeStagedFiles(connection, '$r', { $r: runId }));\r\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r; DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\r\n }\r\n return doomed.length;\r\n }),\r\n );\r\n await deleteFiles(store, files);\r\n return pruned;\r\n}\r\n\r\nexport async function discardAllStagedPulls(store: StoreInternals): Promise<number> {\r\n let files: string[] = [];\r\n const count = await store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const count = asNumber(await connection.scalar('SELECT count(*) FROM g9_stage_runs'));\r\n files = await takeStagedFiles(connection, 'SELECT run_id FROM g9_stage_files');\r\n await connection.exec('DELETE FROM g9_stage; DELETE FROM g9_stage_runs;');\r\n return count;\r\n }),\r\n );\r\n await deleteFiles(store, files);\r\n return count;\r\n}\r\n\r\nexport async function beginStagedPull(store: StoreInternals, pull: G9StagedPull): Promise<void> {\r\n let replaced: string[] = [];\r\n await store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n // Only the stage this one replaces goes: the same generation (ADR-0060).\r\n replaced = await takeStagedFiles(connection, 'SELECT run_id FROM g9_stage_runs WHERE generation IS $g', { $g: pull.generation });\r\n await connection.exec(\r\n 'DELETE FROM g9_stage WHERE run_id IN (SELECT run_id FROM g9_stage_runs WHERE generation IS $g); DELETE FROM g9_stage_runs WHERE generation IS $g',\r\n { $g: pull.generation },\r\n );\r\n // Read inside the transaction that inserts the run: rows written after it are newer than the stage (ADR-0046).\r\n const stageSequence = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n const fromCursors: { [key: string]: string | null } = {};\r\n for (const key of Object.keys(pull.plannedFromCursors)) fromCursors[key] = pull.plannedFromCursors[key] ?? null;\r\n await connection.exec(\r\n 'INSERT INTO g9_stage_runs (run_id, plan_json, backfills_json, created_utc, complete, generation, stage_seq, from_cursors_json) VALUES ($r, $p, $b, $c, 0, $g, $s, $f)',\r\n {\r\n $r: pull.runId,\r\n $p: persistedPlan(pull.plan),\r\n $b: persistedJson(pull.backfills),\r\n $c: pull.createdUtcMs,\r\n $g: pull.generation,\r\n $s: stageSequence,\r\n // Dictionary<string, string?>: a null value stays (DefaultIgnoreCondition only drops null PROPERTIES).\r\n $f: JSON.stringify(fromCursors),\r\n },\r\n );\r\n }),\r\n );\r\n await deleteFiles(store, replaced);\r\n}\r\n\r\nexport async function stageChunk(store: StoreInternals, runId: string, chunk: G9DtSyncChunk, durability: (connection: G9SqliteConnection) => Promise<(() => Promise<void>) | null>): Promise<void> {\r\n await store.writeLock.run(async () => {\r\n const connection = store.writer();\r\n if (chunk.file) {\r\n // A snapshot-file segment goes to its place in the staged file, not into g9_stage (ADR-0072).\r\n await stageFileSegment(store, runId, chunk);\r\n return;\r\n }\r\n const restore = await durability(connection);\r\n try {\r\n // One transaction, one bridge call (a chunk used to cost ~7: PRAGMA reads, begin, insert, commit — LES-0056).\r\n await connection.runAtomic([\r\n ...statementsOf('INSERT OR REPLACE INTO g9_stage (run_id, seq, subscription_key, row_count, continuation_json, payload) VALUES ($r, $s, $k, $n, $c, $p)', {\r\n $r: runId,\r\n $s: chunk.sequence,\r\n $k: chunk.subscriptionKey ?? null,\r\n $n: chunk.rowCount,\r\n $c: chunk.continuation ? persistedJson(chunk.continuation) : null,\r\n $p: chunk.payload ?? null,\r\n }),\r\n ...(chunk.isFinal ? statementsOf('UPDATE g9_stage_runs SET complete = 1 WHERE run_id = $r', { $r: runId }) : []),\r\n ]);\r\n } finally {\r\n if (restore) await restore();\r\n }\r\n });\r\n}\r\n\r\nexport async function getResumePoint(store: StoreInternals, runId: string): Promise<G9ResumePoint> {\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const flag = await connection.scalar('SELECT complete FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\r\n const complete = typeof flag === 'number' && flag !== 0;\r\n // A resumed stream starts at the last durable checkpoint of a snapshot file.\r\n forgetPendingSegments(store, runId);\r\n let continuation = null;\r\n let lastSequence = -1;\r\n if (!complete) {\r\n const rows = await connection.query('SELECT seq, continuation_json FROM g9_stage WHERE run_id = $r AND continuation_json IS NOT NULL ORDER BY seq DESC LIMIT 1', { $r: runId });\r\n const r = rows[0];\r\n if (r) {\r\n lastSequence = asNumber(r[0]);\r\n continuation = readContinuation(parseJson(asString(r[1])));\r\n }\r\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r AND seq > $s', { $r: runId, $s: lastSequence });\r\n }\r\n const totals = (\r\n await connection.query(\r\n 'SELECT coalesce(sum(row_count), 0), coalesce(sum(length(payload)), 0) + (SELECT coalesce(sum(bytes_received), 0) FROM g9_stage_files WHERE run_id = $r) ' +\r\n 'FROM g9_stage WHERE run_id = $r',\r\n { $r: runId },\r\n )\r\n )[0];\r\n return { continuation, stagedRows: totals ? asNumber(totals[0]) : 0, stagedBytes: totals ? asNumber(totals[1]) : 0, complete };\r\n }),\r\n );\r\n}\r\n\r\nexport async function discardStagedPull(store: StoreInternals, runId: string): Promise<void> {\r\n let files: string[] = [];\r\n await store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n files = await takeStagedFiles(connection, '$r', { $r: runId });\r\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r; DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\r\n }),\r\n );\r\n forgetPendingSegments(store, runId);\r\n await deleteFiles(store, files);\r\n}\r\n\r\n// ================================================================ reconciliation reads\r\n\r\nfunction computedColumns(local: LocalTable, table: G9DtNegotiatedTable): string[] {\r\n return table.computedColumns.filter((c) => local.model.indexOf(c) >= 0);\r\n}\r\n\r\nasync function memberRows(connection: G9SqliteConnection, local: LocalTable, subscriptionKey: string): Promise<(readonly G9SqlValue[])[] | null> {\r\n const records = await readSubscriptions(connection, subscriptionKey);\r\n const record = records[0];\r\n if (!record) return null;\r\n return record.ephemeral\r\n ? connection.query(\r\n 'SELECT r.pk, r.server_ver, r.dirty FROM g9_rows r WHERE r.tid = $t AND r.deleted = 0 AND r.dirty <> 2 ' +\r\n 'AND EXISTS (SELECT 1 FROM g9_ephemeral_rows e WHERE e.sub_key = $k AND e.tid = r.tid AND e.pk = r.pk)',\r\n { $t: local.tid, $k: subscriptionKey },\r\n )\r\n : connection.query('SELECT r.pk, r.server_ver, r.dirty FROM g9_rows r WHERE r.tid = $t AND r.deleted = 0 AND r.dirty <> 2 AND (r.subs & $b) <> 0', {\r\n $t: local.tid,\r\n $b: bit(record.slot),\r\n });\r\n}\r\n\r\nexport async function computeDigest(store: StoreInternals, subscriptionKey: string, table: G9DtNegotiatedTable): Promise<G9DtTableDigest> {\r\n store.ensureInitialized();\r\n const local = findByServerName(store, table.name);\r\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\r\n const computed = computedColumns(local, table);\r\n const digests: G9Long[] = [];\r\n const counts: number[] = [];\r\n for (let i = 0; i < 256; i++) {\r\n digests.push(G9Long.ZERO);\r\n counts.push(0);\r\n }\r\n const connection = store.reader();\r\n if (computed.length === 0) {\r\n for (const r of (await memberRows(connection, local, subscriptionKey)) ?? []) {\r\n const key = asString(r[0]);\r\n const bucket = G9SyncDigest.getBucket(key);\r\n counts[bucket] = (counts[bucket] as number) + 1;\r\n digests[bucket] = (digests[bucket] as G9Long).xor(G9SyncDigest.getRowHash(key, asLong(r[1])));\r\n }\r\n } else {\r\n for (const entry of await readMemberEntries(connection, local, subscriptionKey, computed)) {\r\n counts[entry.bucket] = (counts[entry.bucket] as number) + 1;\r\n digests[entry.bucket] = (digests[entry.bucket] as G9Long).xor(entry.hash);\r\n }\r\n }\r\n return { tableId: table.tableId, computedColumns: computed, digests, counts };\r\n}\r\n\r\nexport async function readLocalEntries(\r\n store: StoreInternals,\r\n subscriptionKey: string,\r\n table: G9DtNegotiatedTable,\r\n buckets: ReadonlySet<number>,\r\n serverKeys: ReadonlySet<string>,\r\n): Promise<G9LocalRowEntry[]> {\r\n store.ensureInitialized();\r\n const local = findByServerName(store, table.name);\r\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\r\n const computed = computedColumns(local, table);\r\n const entries = new Map<string, G9LocalRowEntry>();\r\n const connection = store.reader();\r\n if (computed.length === 0) {\r\n for (const r of (await memberRows(connection, local, subscriptionKey)) ?? []) {\r\n const key = asString(r[0]);\r\n const bucket = G9SyncDigest.getBucket(key);\r\n if (!buckets.has(bucket)) continue;\r\n const version = asLong(r[1]);\r\n entries.set(key, { key, bucket, version: version.toNumber(), hash: G9SyncDigest.getRowHash(key, version), member: true, dirty: asNumber(r[2]) !== 0 });\r\n }\r\n } else {\r\n for (const entry of await readMemberEntries(connection, local, subscriptionKey, computed)) {\r\n if (buckets.has(entry.bucket)) entries.set(entry.key, entry);\r\n }\r\n }\r\n const missing: string[] = [];\r\n serverKeys.forEach((key) => {\r\n if (!entries.has(key)) missing.push(key);\r\n });\r\n for (let i = 0; i < missing.length; i += 5000) {\r\n const json = JSON.stringify(missing.slice(i, i + 5000));\r\n for (const entry of await readEntries(connection, local, computed, 'r.deleted = 0 AND r.pk IN (SELECT value FROM json_each($keys))', false, { $keys: json })) {\r\n entries.set(entry.key, entry);\r\n }\r\n }\r\n return Array.from(entries.values());\r\n}\r\n\r\nasync function readMemberEntries(connection: G9SqliteConnection, local: LocalTable, subscriptionKey: string, computed: string[]): Promise<G9LocalRowEntry[]> {\r\n const record = (await readSubscriptions(connection, subscriptionKey))[0];\r\n if (!record) return [];\r\n return record.ephemeral\r\n ? readEntries(\r\n connection,\r\n local,\r\n computed,\r\n 'r.deleted = 0 AND r.dirty <> 2 AND EXISTS (SELECT 1 FROM g9_ephemeral_rows e WHERE e.sub_key = $sub AND e.tid = r.tid AND e.pk = r.pk)',\r\n true,\r\n { $sub: subscriptionKey },\r\n )\r\n : readEntries(connection, local, computed, 'r.deleted = 0 AND r.dirty <> 2 AND (r.subs & $bit) <> 0', true, { $bit: bit(record.slot) });\r\n}\r\n\r\nasync function readEntries(\r\n connection: G9SqliteConnection,\r\n local: LocalTable,\r\n computed: string[],\r\n where: string,\r\n member: boolean,\r\n params: { [name: string]: G9SqlValue | G9Long },\r\n): Promise<G9LocalRowEntry[]> {\r\n const computedTypes = computed.map((name) => (local.model.columns[local.model.indexOf(name)] as { type: number }).type);\r\n // typeof() next to each computed value: JavaScript cannot tell an INTEGER 5 from a REAL 5.0, and their canonical texts\r\n // can differ (1E+15 vs 1000000000000000).\r\n const select =\r\n 'SELECT r.pk, r.server_ver, r.dirty' +\r\n computed.map((c) => ', b.' + quote(c) + ', typeof(b.' + quote(c) + ')').join('') +\r\n ' FROM g9_rows r' +\r\n (computed.length === 0 ? '' : ` LEFT JOIN ${local.quoted} b ON b.${local.keyQuoted} = r.pk`) +\r\n ' WHERE r.tid = $tid AND ' +\r\n where;\r\n const rows = await connection.query(select, { $tid: local.tid, ...params });\r\n return rows.map((r) => {\r\n const key = asString(r[0]);\r\n const version = asLong(r[1]);\r\n const values: (string | null)[] = [];\r\n for (let i = 0; i < computed.length; i++) {\r\n const value = r[3 + i * 2] as G9SqlValue;\r\n const storage = asString(r[4 + i * 2]);\r\n values.push(value === null ? null : G9SyncDigest.canonicalText(computedTypes[i] as number, value, storage === 'real' ? 'real' : storage === 'integer' ? 'integer' : undefined));\r\n }\r\n return { key, bucket: G9SyncDigest.getBucket(key), version: version.toNumber(), hash: G9SyncDigest.getRowHash(key, version, values), member, dirty: asNumber(r[2]) !== 0 };\r\n });\r\n}\r\n\r\n// ================================================================ queries\r\n\r\nexport async function getPendingSummary(store: StoreInternals): Promise<G9PendingSummary> {\r\n const connection = store.reader();\r\n const tables: G9PendingTable[] = (\r\n await connection.query(\r\n 'SELECT t.local_name, ' +\r\n 'sum(CASE WHEN r.dirty = 1 AND r.rejected = 0 THEN 1 ELSE 0 END), ' +\r\n 'sum(CASE WHEN r.dirty = 2 AND r.rejected = 0 THEN 1 ELSE 0 END), ' +\r\n 'sum(CASE WHEN r.rejected = 1 THEN 1 ELSE 0 END) ' +\r\n 'FROM g9_rows r JOIN g9_tables t ON t.tid = r.tid WHERE r.dirty <> 0 GROUP BY t.local_name ORDER BY t.local_name',\r\n )\r\n ).map((r) => ({ localTable: asString(r[0]), upserts: asNumber(r[1]), deletes: asNumber(r[2]), rejected: asNumber(r[3]) }));\r\n const pendingCommands = asNumber(await connection.scalar('SELECT count(*) FROM g9_commands WHERE state = 0'));\r\n let totalRows = 0;\r\n let rejectedRows = 0;\r\n for (const t of tables) {\r\n totalRows += t.upserts + t.deletes;\r\n rejectedRows += t.rejected;\r\n }\r\n return { tables, totalRows, rejectedRows, pendingCommands };\r\n}\r\n\r\nexport async function readChangeFeed(store: StoreInternals, localTable: string, afterSequence: number, limit: number): Promise<G9ChangeFeedEntry[]> {\r\n store.ensureInitialized();\r\n const table = getLocal(store, localTable);\r\n const rows = await store\r\n .reader()\r\n .query('SELECT local_seq, pk, (deleted = 1 OR dirty = 2), dirty <> 0 FROM g9_rows WHERE tid = $t AND local_seq > $a ORDER BY local_seq LIMIT $l', {\r\n $t: table.tid,\r\n $a: afterSequence,\r\n $l: Math.max(1, limit),\r\n });\r\n return rows.map((r) => ({ sequence: asNumber(r[0]), key: asString(r[1]), deleted: asNumber(r[2]) !== 0, localPending: asNumber(r[3]) !== 0 }));\r\n}\r\n\r\n/** `ReadChangeFeedAsync(..., G9CChangeFeedKeyFilter, ...)`: the same read, narrowed in SQL to the selected keys plus every deletion. */\r\nexport async function readChangeFeedFiltered(\r\n store: StoreInternals,\r\n localTable: string,\r\n afterSequence: number,\r\n limit: number,\r\n keyFilter: G9ChangeFeedKeyFilter,\r\n): Promise<G9ChangeFeedEntry[]> {\r\n validateChangeFeedKeyFilter(keyFilter);\r\n store.ensureInitialized();\r\n const table = getLocal(store, localTable);\r\n const parameters: { [name: string]: G9SqlValue } = { $g9t: table.tid, $g9a: afterSequence, $g9l: Math.max(1, limit) };\r\n for (const [name, value] of Object.entries(keyFilter.parameters ?? {})) parameters[name] = value;\r\n const rows = await store\r\n .reader()\r\n .query(\r\n 'SELECT local_seq, pk, (deleted = 1 OR dirty = 2), dirty <> 0 FROM g9_rows ' +\r\n `WHERE tid = $g9t AND local_seq > $g9a AND (deleted = 1 OR dirty = 2 OR pk IN (${keyFilter.keySql.trim()})) ORDER BY local_seq LIMIT $g9l`,\r\n parameters,\r\n );\r\n return rows.map((r) => ({ sequence: asNumber(r[0]), key: asString(r[1]), deleted: asNumber(r[2]) !== 0, localPending: asNumber(r[3]) !== 0 }));\r\n}\r\n\r\nexport async function getChangeSequence(store: StoreInternals): Promise<number> {\r\n store.ensureInitialized();\r\n return asNumber(await store.reader().scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n}\r\n\r\nexport async function getRejections(store: StoreInternals): Promise<G9SyncRejection[]> {\r\n const rows = await store\r\n .reader()\r\n .query(\r\n 'SELECT t.local_name, j.pk, j.code, j.message, j.sql_state, j.constraint_name, j.column_name, j.details, j.at_utc ' +\r\n 'FROM g9_rejections j JOIN g9_tables t ON t.tid = j.tid JOIN g9_rows r ON r.tid = j.tid AND r.pk = j.pk WHERE r.rejected = 1 ORDER BY j.at_utc',\r\n );\r\n return rows.map((r) => ({\r\n localTable: asString(r[0]),\r\n key: asString(r[1]),\r\n code: asString(r[2]),\r\n message: asOptionalString(r[3]),\r\n sqlState: asOptionalString(r[4]),\r\n constraint: asOptionalString(r[5]),\r\n column: asOptionalString(r[6]),\r\n details: asOptionalString(r[7]),\r\n atUtcMs: asNumber(r[8]),\r\n }));\r\n}\r\n\r\nexport async function retryRejected(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\r\n store.ensureInitialized();\r\n let where = 'rejected = 1';\r\n const params: { [name: string]: G9SqlValue } = {};\r\n if (localTable !== null) {\r\n where += ' AND tid = $t';\r\n params.$t = getLocal(store, localTable).tid;\r\n }\r\n if (key !== null) {\r\n where += ' AND pk = $pk';\r\n params.$pk = key;\r\n }\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n await connection.exec('DELETE FROM g9_rejections WHERE (tid, pk) IN (SELECT tid, pk FROM g9_rows WHERE ' + where + ')', params);\r\n return connection.exec('UPDATE g9_rows SET rejected = 0 WHERE ' + where, params);\r\n }),\r\n );\r\n}\r\n\r\nexport async function markDirty(store: StoreInternals, localTable: string, keys: readonly string[]): Promise<number> {\r\n store.ensureInitialized();\r\n const table = getLocal(store, localTable);\r\n const normalized = keys.map((k) => G9SyncKey.tryNormalize(table.model.keyType, k) ?? k);\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n let marked = 0;\r\n for (let i = 0; i < normalized.length; i += 5000) {\r\n const json = JSON.stringify(normalized.slice(i, i + 5000));\r\n marked += await markPending(store.writer(), table, 'SELECT value AS pk FROM json_each($keys)', { $keys: json }, 'dirty = 1, dirty_mask = ' + literal(allColumnsMask(table.model.columns.length)));\r\n }\r\n return marked;\r\n }),\r\n );\r\n}\r\n\r\n/** Marks the rows `keysSql` selects as pending, giving EACH its own local sequence (LES-0039). */\r\nexport async function markPending(connection: G9SqliteConnection, table: LocalTable, keysSql: string, params: { [name: string]: G9SqlValue }, set: string): Promise<number> {\r\n await connection.exec('CREATE TEMP TABLE IF NOT EXISTS g9_mark (pk TEXT NOT NULL PRIMARY KEY, n INTEGER NOT NULL); DELETE FROM temp.g9_mark;');\r\n const count = await connection.exec(`INSERT INTO temp.g9_mark (pk, n) SELECT pk, row_number() OVER (ORDER BY pk) FROM (SELECT DISTINCT pk FROM (${keysSql}) WHERE pk IS NOT NULL)`, params);\r\n if (count === 0) return 0;\r\n const first = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n await connection.exec('INSERT OR IGNORE INTO g9_rows (tid, pk) SELECT $t, pk FROM temp.g9_mark', { $t: table.tid });\r\n const marked = await connection.exec(\r\n `UPDATE g9_rows SET ${set}, local_seq = $first + m.n, hlc_ms = ${NOW_MS}, rejected = 0, deleted = 0 FROM temp.g9_mark AS m WHERE g9_rows.tid = $t AND g9_rows.pk = m.pk`,\r\n { $first: first, $t: table.tid },\r\n );\r\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1; DELETE FROM temp.g9_mark;', { $n: count });\r\n return marked;\r\n}\r\n\r\nexport async function adoptExistingRows(store: StoreInternals): Promise<number> {\r\n store.ensureInitialized();\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n let adopted = 0;\r\n for (const table of store.byLocal.values()) {\r\n adopted += await store.writer().exec(`INSERT OR IGNORE INTO g9_rows (tid, pk) SELECT $t, ${keyExpression(table.model, 'b')} FROM ${table.quoted} AS b`, { $t: table.tid });\r\n }\r\n return adopted;\r\n }),\r\n );\r\n}\r\n\r\n// ================================================================ reports and statistics\r\n\r\n/** The run report as .NET's G9SyncClientJsonContext writes it (camelCase, nulls omitted, DateTime/Guid in .NET text). */\r\nfunction reportToJson(report: G9SyncRunReport): string {\r\n const startedTicks = ticksOf(1970, 1, 1, 0, 0, 0, 0).add(G9Long.fromNumber(Math.floor(report.startedUtcMs)).multiplySmall(10000));\r\n return persistedJson({\r\n runId: report.runId,\r\n startedUtc: formatTicks(startedTicks) + 'Z',\r\n durationMs: report.durationMs,\r\n outcome: report.outcome,\r\n priority: report.priority,\r\n errorCode: report.errorCode,\r\n errorMessage: report.errorMessage,\r\n pushed: report.pushed,\r\n rejected: report.rejected,\r\n conflicts: report.conflicts,\r\n downloaded: report.downloaded,\r\n applied: report.applied,\r\n downloadedBytes: report.downloadedBytes,\r\n subscriptions: report.subscriptions,\r\n phaseMs: report.phaseMs,\r\n triggersSkipped: report.triggersSkipped,\r\n foreignTriggers: report.foreignTriggers,\r\n applyTransactions: report.applyTransactions,\r\n indexesDeferred: report.indexesDeferred,\r\n indexRebuildMs: report.indexRebuildMs,\r\n liveIndexReasons: report.liveIndexReasons,\r\n unchangedRows: report.unchangedRows,\r\n });\r\n}\r\n\r\nfunction reportFromJson(json: string): G9SyncRunReport | null {\r\n const v = parseJson(json) as { [key: string]: unknown } | null;\r\n if (!v || typeof v !== 'object') return null;\r\n const num = (x: unknown) => (typeof x === 'number' ? x : x instanceof G9Long ? x.toNumber() : 0);\r\n const started = typeof v.startedUtc === 'string' ? Date.parse(v.startedUtc.replace(/(\\.\\d{3})\\d+/, '$1')) : NaN;\r\n return {\r\n runId: typeof v.runId === 'string' ? v.runId : '',\r\n startedUtcMs: isNaN(started) ? 0 : started,\r\n durationMs: num(v.durationMs),\r\n outcome: typeof v.outcome === 'string' ? v.outcome : '',\r\n priority: typeof v.priority === 'string' ? v.priority : '',\r\n errorCode: typeof v.errorCode === 'string' ? v.errorCode : null,\r\n errorMessage: typeof v.errorMessage === 'string' ? v.errorMessage : null,\r\n pushed: num(v.pushed),\r\n rejected: num(v.rejected),\r\n conflicts: num(v.conflicts),\r\n downloaded: num(v.downloaded),\r\n applied: num(v.applied),\r\n downloadedBytes: num(v.downloadedBytes),\r\n subscriptions: Array.isArray(v.subscriptions) ? v.subscriptions.map(String) : [],\r\n phaseMs: (v.phaseMs as { [phase: string]: number }) ?? {},\r\n triggersSkipped: typeof v.triggersSkipped === 'boolean' ? v.triggersSkipped : null,\r\n foreignTriggers: Array.isArray(v.foreignTriggers) ? v.foreignTriggers.map(String) : [],\r\n applyTransactions: num(v.applyTransactions),\r\n indexesDeferred: num(v.indexesDeferred),\r\n indexRebuildMs: num(v.indexRebuildMs),\r\n liveIndexReasons: (v.liveIndexReasons as { [table: string]: string }) ?? {},\r\n unchangedRows: num(v.unchangedRows),\r\n };\r\n}\r\n\r\nexport async function saveRunReport(store: StoreInternals, report: G9SyncRunReport, keep: number): Promise<void> {\r\n const runId = tryNormalizeGuid(report.runId) ? guidToN(report.runId) : report.runId;\r\n await store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n await connection.exec('INSERT OR REPLACE INTO g9_runs (run_id, started_utc, report_json) VALUES ($r, $s, $j)', { $r: runId, $s: report.startedUtcMs, $j: reportToJson(report) });\r\n await connection.exec('DELETE FROM g9_runs WHERE run_id NOT IN (SELECT run_id FROM g9_runs ORDER BY started_utc DESC LIMIT $k)', { $k: Math.max(1, keep) });\r\n }),\r\n );\r\n}\r\n\r\nexport async function getRecentRunReports(store: StoreInternals, count: number): Promise<G9SyncRunReport[]> {\r\n const rows = await store.reader().query('SELECT report_json FROM g9_runs ORDER BY started_utc DESC LIMIT $c', { $c: Math.max(1, count) });\r\n const reports: G9SyncRunReport[] = [];\r\n for (const r of rows) {\r\n const report = reportFromJson(asString(r[0]));\r\n if (report) reports.push(report);\r\n }\r\n return reports;\r\n}\r\n\r\nexport async function getPhaseStatistics(store: StoreInternals): Promise<{ [key: string]: number }> {\r\n const statistics: { [key: string]: number } = {};\r\n for (const r of await store.reader().query('SELECT key, value FROM g9_stats')) statistics[asString(r[0])] = asNumber(r[1]);\r\n return statistics;\r\n}\r\n\r\nexport async function recordPhaseStatistics(store: StoreInternals, samples: { [key: string]: number }): Promise<void> {\r\n await store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n for (const key of Object.keys(samples)) {\r\n const value = samples[key] as number;\r\n if (!isFinite(value) || value < 0) continue;\r\n await store\r\n .writer()\r\n .exec(\r\n 'INSERT INTO g9_stats (key, value, samples) VALUES ($k, $v, 1) ON CONFLICT(key) DO UPDATE SET value = value * 0.7 + excluded.value * 0.3, samples = samples + 1',\r\n { $k: key, $v: value },\r\n );\r\n }\r\n }),\r\n );\r\n}\r\n\r\nexport async function purgeDeletedFeed(store: StoreInternals, keep: number): Promise<number> {\r\n return store.writeLock.run(async () => {\r\n const connection = store.writer();\r\n const threshold = await connection.scalar('SELECT local_seq FROM g9_rows WHERE deleted = 1 ORDER BY local_seq DESC LIMIT 1 OFFSET $k', { $k: Math.max(0, keep) });\r\n if (threshold === null) return 0;\r\n return connection.transaction('immediate', async () => {\r\n // The floor moves in the same transaction as the purge (ADR-0059).\r\n const purgedUpTo = await connection.scalar('SELECT max(local_seq) FROM g9_rows WHERE deleted = 1 AND dirty = 0 AND local_seq < $x', { $x: threshold });\r\n if (purgedUpTo === null) return 0;\r\n const purged = await connection.exec('DELETE FROM g9_rows WHERE deleted = 1 AND dirty = 0 AND local_seq < $x', { $x: threshold });\r\n await connection.exec(\r\n \"INSERT INTO g9_meta (key, value) VALUES ('feed_floor_seq', $f) ON CONFLICT(key) DO UPDATE SET value = excluded.value WHERE CAST(value AS INTEGER) < CAST(excluded.value AS INTEGER)\",\r\n { $f: asLong(purgedUpTo).toString() },\r\n );\r\n return purged;\r\n });\r\n });\r\n}\r\n\r\nexport async function getChangeFeedFloor(store: StoreInternals): Promise<number> {\r\n store.ensureInitialized();\r\n const text = await store.reader().scalar(\"SELECT value FROM g9_meta WHERE key = 'feed_floor_seq'\");\r\n if (typeof text !== 'string' || !/^[+-]?\\d+$/.test(text.trim())) return 0;\r\n return Number(text.trim());\r\n}\r\n\r\nexport { ticksToUnixMs };\r\n"]}
@@ -17,6 +17,12 @@ export declare function disposeReleasedRow(store: StoreInternals, connection: G9
17
17
  * row-by-row path when the database holds a foreign trigger. Returns how many rows left the app's tables.
18
18
  */
19
19
  export declare function disposeReleasedRows(store: StoreInternals, connection: G9SqliteConnection, releasedSql: string, releasedParams: G9Params, reason: G9ERevocationReason, subscriptionKey: string | null, report: G9ApplyReport | null, onRemoved?: (tid: number, key: string) => void): Promise<number>;
20
+ /**
21
+ * `RevertRejectedAsync` (LES-0070): gives up the local change of rejected rows and takes the server's copy. A row the server never had
22
+ * (`server_ver = 0`) is removed locally; any other drops its pending change and its version, so the next forced reconciliation
23
+ * fetches the server's copy (the digest hashes key + server_ver, not the values). A library write: capture is silent, nothing uploads.
24
+ */
25
+ export declare function revertRejected(store: StoreInternals, localTable: string | null, key: string | null): Promise<number>;
20
26
  /** `RemoveLocalRow`: the row leaves the app's table; its metadata becomes a tombstone at the clock's next value. */
21
27
  export declare function removeLocalRow(connection: G9SqliteConnection, table: LocalTable, key: string): Promise<void>;
22
28
  export declare function getQuarantined(store: StoreInternals): Promise<G9QuarantinedRow[]>;
@@ -210,6 +210,47 @@ function removeLocalRowStatements(table, key, seq, seqParams) {
210
210
  },
211
211
  ];
212
212
  }
213
+ /**
214
+ * `RevertRejectedAsync` (LES-0070): gives up the local change of rejected rows and takes the server's copy. A row the server never had
215
+ * (`server_ver = 0`) is removed locally; any other drops its pending change and its version, so the next forced reconciliation
216
+ * fetches the server's copy (the digest hashes key + server_ver, not the values). A library write: capture is silent, nothing uploads.
217
+ */
218
+ export async function revertRejected(store, localTable, key) {
219
+ store.ensureInitialized();
220
+ let where = 'rejected = 1';
221
+ const params = {};
222
+ if (localTable !== null) {
223
+ where += ' AND tid = $t';
224
+ params.$t = getLocal(store, localTable).tid;
225
+ }
226
+ if (key !== null) {
227
+ where += ' AND pk = $pk';
228
+ params.$pk = key;
229
+ }
230
+ return store.writeLock.run(() => store.writer().transaction('immediate', async () => {
231
+ const connection = store.writer();
232
+ const rows = await connection.query('SELECT tid, pk, server_ver FROM g9_rows WHERE ' + where, params);
233
+ if (rows.length === 0)
234
+ return 0;
235
+ await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');
236
+ for (const r of rows) {
237
+ const tid = asNumber(r[0]);
238
+ const pk = asString(r[1]);
239
+ const table = byTid(store, tid);
240
+ if (!table)
241
+ continue;
242
+ if (asNumber(r[2]) === 0) {
243
+ for (const statement of removeLocalRowStatements(table, pk, NEXT_SEQ, {}))
244
+ await connection.exec(statement.script, statement.params);
245
+ await connection.exec('UPDATE g9_clock SET seq = seq + 1 WHERE id = 1');
246
+ continue;
247
+ }
248
+ await connection.exec('DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk; UPDATE g9_rows SET dirty = 0, dirty_mask = 0, rejected = 0, server_ver = 0 WHERE tid = $t AND pk = $pk', { $t: tid, $pk: pk });
249
+ }
250
+ await connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');
251
+ return rows.length;
252
+ }));
253
+ }
213
254
  /** `RemoveLocalRow`: the row leaves the app's table; its metadata becomes a tombstone at the clock's next value. */
214
255
  export async function removeLocalRow(connection, table, key) {
215
256
  for (const statement of removeLocalRowStatements(table, key, NEXT_SEQ, {}))
@@ -1 +1 @@
1
- {"version":3,"file":"revocation.js","sourceRoot":"","sources":["../../src/sqlite/revocation.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Revocation.cs: revocation dispositions (ADR-0026). Every path that\n// releases a row — a move-out in a pull or a reconciliation, an unsubscribe, an expired ephemeral subscription — ends in\n// disposeReleasedRow, which asks the revocation policy what to do with a row NO subscription holds any more.\n//\n// The local sequence such a row gets is the clock's next value, (SELECT seq FROM g9_clock) + 1; the CALLER moves the\n// clock afterwards (unconditionally, like the .NET store's `++sequence`).\nimport { G9ESyncColumnType } from '../abstractions/enums.js';\nimport { G9Long } from '../abstractions/long.js';\nimport {\n G9ApplyReport,\n G9ERevocationDisposition,\n G9ERevocationReason,\n type G9QuarantinedRow,\n type G9RetainedRow,\n type G9RevokedRow,\n type G9RevokedRowEditor,\n} from '../client/storeTypes.js';\nimport { asLong, asNumber, asOptionalString, asString, G9StatementBatch, statementsOf, type G9Params, type G9SqliteConnection } from './connection.js';\nimport type { G9SqlValue } from './driver.js';\nimport { byTid, deserializeValues, getLocal, keyValue, nowMs, readLocalValues, serializeValues, type LocalTable, type StoreInternals } from './internals.js';\nimport { quote } from './sql.js';\n\nexport const REVOKED_REJECTION_CODE = 'G9S-REJ-REVOKED';\nconst NEXT_SEQ = '(SELECT seq FROM g9_clock WHERE id = 1) + 1';\n\nclass RowEditor implements G9RevokedRowEditor {\n readonly changed = new Map<string, string>();\n private readonly _values: { [column: string]: G9SqlValue };\n\n constructor(values: { [column: string]: G9SqlValue }) {\n this._values = values;\n }\n\n set(column: string, value: unknown): void {\n if (typeof column !== 'string' || column.trim() === '') throw new TypeError('A column is required.');\n const actual = Object.keys(this._values).find((c) => c.toLowerCase() === column.toLowerCase());\n if (actual === undefined) throw new RangeError(`'${column}' is not a column of the row.`);\n this._values[actual] = value as G9SqlValue;\n this.changed.set(actual.toLowerCase(), actual);\n }\n}\n\n/** What disposing a released row reads about it before anything is written. */\ninterface ReleasedRowState {\n /** Another subscription still holds the row. */\n held: boolean;\n dirty: number;\n dirtyMask: G9SqlValue;\n rejected: number;\n /** A pending command touches the row (only looked at when the row has no pending change). */\n pendingCommand: boolean;\n /** The app row; empty when it is gone. */\n values: { [column: string]: G9SqlValue };\n}\n\n/** A row with no metadata row: what the per-row path assumes when its first read finds nothing. */\nfunction emptyState(): ReleasedRowState {\n return { held: false, dirty: 0, dirtyMask: 0, rejected: 0, pendingCommand: false, values: {} };\n}\n\ninterface Statement {\n script: string;\n params: G9Params;\n}\n\n/**\n * The revocation decision for one released row, as the statements that carry it out, in the order the .NET store runs\n * them. `seq` is the SQL of the local sequence the row gets when it moves: NEXT_SEQ, or `$seq` with its value in `seqParams`.\n */\nfunction planDisposal(\n store: StoreInternals,\n table: LocalTable,\n key: string,\n state: ReleasedRowState,\n reason: G9ERevocationReason,\n subscriptionKey: string | null,\n report: G9ApplyReport | null,\n seq: string,\n seqParams: G9Params,\n): { removed: boolean; statements: Statement[] } {\n if (state.held) return { removed: false, statements: [] };\n // A row touched by a pending command is settled by that command's result, never disposed underneath it.\n if (state.dirty === 0 && state.pendingCommand) return { removed: false, statements: [] };\n\n const values = state.values;\n if (Object.keys(values).length === 0) {\n const script = 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, local_seq = ' + seq + ' WHERE tid = $t AND pk = $pk';\n return { removed: false, statements: [{ script, params: { ...seqParams, $t: table.tid, $pk: key } }] };\n }\n\n const editor = new RowEditor(values);\n const row: G9RevokedRow = {\n localTable: table.model.localName,\n key,\n reason,\n subscriptionKey,\n hasPendingChanges: state.dirty !== 0,\n isRejected: state.rejected !== 0,\n values,\n };\n const { rule, disposition } = store.options.revocation.decide(row, editor);\n const now = nowMs();\n const statements: Statement[] = [];\n\n switch (disposition) {\n case G9ERevocationDisposition.MarkRevoked:\n case G9ERevocationDisposition.Retain: {\n if (editor.changed.size > 0) {\n const columns = Array.from(editor.changed.values());\n const params: G9Params = { $k: keyValue(table, key) };\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\n statements.push({ script: `UPDATE ${table.quoted} SET ${columns.map((c, i) => quote(c) + ' = $v' + i).join(', ')} WHERE ${table.keyQuoted} = $k`, params });\n }\n statements.push({\n script: 'INSERT OR REPLACE INTO g9_revoked (tid, pk, disposition, reason, rule, at_utc) VALUES ($t, $pk, $d, $r, $rule, $now)',\n params: { $t: table.tid, $pk: key, $d: disposition, $r: reason, $rule: rule ? rule.name : null, $now: now },\n });\n if (state.dirty !== 0) {\n // Its pending change can no longer be accepted: park it as rejected instead of uploading it on every push.\n statements.push({\n script:\n 'UPDATE g9_rows SET rejected = 1 WHERE tid = $t AND pk = $pk; ' +\n 'INSERT OR REPLACE INTO g9_rejections (tid, pk, code, message, at_utc) VALUES ($t, $pk, $code, $message, $now)',\n params: { $t: table.tid, $pk: key, $code: REVOKED_REJECTION_CODE, $message: 'The row is no longer visible to this device; its pending change was not uploaded.', $now: now },\n });\n }\n if (report) report.revokedRetained++;\n return { removed: false, statements };\n }\n case G9ERevocationDisposition.Quarantine:\n statements.push({\n script: 'INSERT OR REPLACE INTO g9_quarantine (tid, pk, reason, rule, row_json, had_pending, dirty_mask, at_utc) VALUES ($t, $pk, $r, $rule, $json, $p, $m, $now)',\n params: { $t: table.tid, $pk: key, $r: reason, $rule: rule ? rule.name : null, $json: serializeValues(values), $p: state.dirty !== 0 ? 1 : 0, $m: state.dirtyMask, $now: now },\n });\n statements.push(...removeLocalRowStatements(table, key, seq, seqParams));\n if (report) report.revokedQuarantined++;\n return { removed: true, statements };\n default:\n statements.push(...removeLocalRowStatements(table, key, seq, seqParams));\n if (report) report.revokedDeleted++;\n return { removed: true, statements };\n }\n}\n\n/**\n * Applies the revocation policy to a released row (`DisposeReleasedRow`). Rows still held by another subscription are\n * untouched. Returns true when the row left the app's table (deleted or quarantined). Reads the row first, so it sees\n * whatever the caller ran before it; a release of many rows goes through disposeReleasedRows.\n */\nexport async function disposeReleasedRow(\n store: StoreInternals,\n connection: G9SqliteConnection,\n table: LocalTable,\n key: string,\n reason: G9ERevocationReason,\n subscriptionKey: string | null,\n report: G9ApplyReport | null,\n): Promise<boolean> {\n const state = emptyState();\n const first = (await connection.query('SELECT subs, dirty, dirty_mask, rejected FROM g9_rows WHERE tid = $t AND pk = $pk AND deleted = 0', { $t: table.tid, $pk: key }))[0];\n if (first) {\n state.held = !asLong(first[0]).isZero();\n state.dirty = asNumber(first[1]);\n state.dirtyMask = first[2] as G9SqlValue;\n state.rejected = asNumber(first[3]);\n }\n if (state.held) return false;\n if (state.dirty === 0) {\n const commands = await connection.scalar(\n 'SELECT count(*) FROM g9_command_rows r JOIN g9_commands c ON c.command_id = r.command_id WHERE c.state = 0 AND r.tid = $t AND r.pk = $pk',\n { $t: table.tid, $pk: key },\n );\n state.pendingCommand = asNumber(commands) > 0;\n if (state.pendingCommand) return false;\n }\n state.values = await readLocalValues(connection, table, key);\n const plan = planDisposal(store, table, key, state, reason, subscriptionKey, report, NEXT_SEQ, {});\n for (const statement of plan.statements) await connection.exec(statement.script, statement.params);\n return plan.removed;\n}\n\n/**\n * `DisposeReleasedRow` for every row `releasedSql` selects (`SELECT tid, pk …`, in the order the .NET store walks them),\n * then the clock moves once per row of a known table — the database state the row-by-row path leaves, in a handful of\n * driver calls instead of ~6 per row (on Lynx every call crosses the bridge: 25,000 rows took 850 s row by row,\n * LES-0051). Everything is read before anything is written, which is exact because disposing a row writes nothing\n * another released row's decision reads: the store's connections run with foreign keys OFF, and the CALLER must take the\n * row-by-row path when the database holds a foreign trigger. Returns how many rows left the app's tables.\n */\nexport async function disposeReleasedRows(\n store: StoreInternals,\n connection: G9SqliteConnection,\n releasedSql: string,\n releasedParams: G9Params,\n reason: G9ERevocationReason,\n subscriptionKey: string | null,\n report: G9ApplyReport | null,\n onRemoved?: (tid: number, key: string) => void,\n): Promise<number> {\n const released = (await connection.query(releasedSql, releasedParams)).map((r) => ({ tid: asNumber(r[0]), key: asString(r[1]) }));\n if (released.length === 0) return 0;\n const id = (tid: number, key: string): string => tid + '\\u001f' + key;\n\n const states = new Map<string, ReleasedRowState>();\n const stateRows = await connection.query(\n 'SELECT r.tid, r.pk, r.subs, r.dirty, r.dirty_mask, r.rejected, ' +\n 'EXISTS (SELECT 1 FROM g9_command_rows cr JOIN g9_commands c ON c.command_id = cr.command_id WHERE c.state = 0 AND cr.tid = r.tid AND cr.pk = r.pk) ' +\n `FROM (${releasedSql}) g JOIN g9_rows r ON r.tid = g.tid AND r.pk = g.pk WHERE r.deleted = 0`,\n releasedParams,\n );\n for (const r of stateRows) {\n states.set(id(asNumber(r[0]), asString(r[1])), {\n held: !asLong(r[2]).isZero(),\n dirty: asNumber(r[3]),\n dirtyMask: r[4] as G9SqlValue,\n rejected: asNumber(r[5]),\n pendingCommand: asNumber(r[6]) !== 0,\n values: {},\n });\n }\n\n // The app rows, one query per table: `SELECT *` of exactly the rows the per-row path reads by key.\n for (const tid of new Set(released.map((r) => r.tid))) {\n const table = byTid(store, tid);\n if (!table) continue;\n const integerKey = table.model.keyType === G9ESyncColumnType.Int32 || table.model.keyType === G9ESyncColumnType.Int64;\n const sql = `SELECT g.pk, t.* FROM (${releasedSql}) g JOIN ${table.quoted} t ON t.${table.keyQuoted} = ${integerKey ? 'CAST(g.pk AS INTEGER)' : 'g.pk'} WHERE g.tid = ${tid}`;\n const result = (await connection.runStatements(statementsOf(sql, releasedParams)))[0];\n if (!result) continue;\n const columns = result.columns.slice(1);\n for (const row of result.rows) {\n const rowId = id(tid, asString(row[0] as G9SqlValue));\n const state = states.get(rowId) ?? emptyState();\n states.set(rowId, state);\n columns.forEach((name, i) => (state.values[name] = row[i + 1] as G9SqlValue));\n }\n }\n\n const batch = new G9StatementBatch(connection, store.options.statementsPerBatch);\n const base = asLong(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n let advanced = 0;\n let removed = 0;\n for (const row of released) {\n const table = byTid(store, row.tid);\n // The .NET store advances its sequence for every released row of a known table, whether or not it moved.\n if (!table) continue;\n const state = states.get(id(row.tid, row.key)) ?? emptyState();\n const plan = planDisposal(store, table, row.key, state, reason, subscriptionKey, report, '$seq', { $seq: base.add(G9Long.fromNumber(++advanced)) });\n if (plan.removed) {\n removed++;\n onRemoved?.(row.tid, row.key);\n }\n for (const statement of plan.statements) if (batch.add(statement.script, statement.params)) await batch.flush();\n }\n await batch.flush();\n if (advanced > 0) await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: advanced });\n return removed;\n}\n\nfunction removeLocalRowStatements(table: LocalTable, key: string, seq: string, seqParams: G9Params): Statement[] {\n return [\n { script: `DELETE FROM ${table.quoted} WHERE ${table.keyQuoted} = $k`, params: { $k: keyValue(table, key) } },\n {\n script:\n 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, local_seq = ' +\n seq +\n ' WHERE tid = $t AND pk = $pk; ' +\n 'DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk; DELETE FROM g9_revoked WHERE tid = $t AND pk = $pk',\n params: { ...seqParams, $t: table.tid, $pk: key },\n },\n ];\n}\n\n/** `RemoveLocalRow`: the row leaves the app's table; its metadata becomes a tombstone at the clock's next value. */\nexport async function removeLocalRow(connection: G9SqliteConnection, table: LocalTable, key: string): Promise<void> {\n for (const statement of removeLocalRowStatements(table, key, NEXT_SEQ, {})) await connection.exec(statement.script, statement.params);\n}\n\n// ================================================================ holding area and retained rows\n\nexport async function getQuarantined(store: StoreInternals): Promise<G9QuarantinedRow[]> {\n store.ensureInitialized();\n const rows = await store\n .reader()\n .query('SELECT t.local_name, q.pk, q.reason, q.rule, q.had_pending, q.row_json, q.at_utc FROM g9_quarantine q JOIN g9_tables t ON t.tid = q.tid ORDER BY q.at_utc');\n return rows.map((r) => ({\n localTable: asString(r[0]),\n key: asString(r[1]),\n reason: asNumber(r[2]) as G9ERevocationReason,\n rule: asOptionalString(r[3]),\n hadPendingChanges: asNumber(r[4]) !== 0,\n values: deserializeValues(asString(r[5])),\n atUtcMs: asNumber(r[6]),\n }));\n}\n\n/** Puts a quarantined row back as a pending local change (capture is ON: the restored values upload on the next push). */\nexport async function restoreQuarantined(store: StoreInternals, localTable: string, key: string): Promise<number> {\n store.ensureInitialized();\n const table = getLocal(store, localTable);\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const rows = await connection.query('SELECT row_json, dirty_mask, had_pending FROM g9_quarantine WHERE tid = $t AND pk = $pk', { $t: table.tid, $pk: key });\n const first = rows[0];\n if (!first) return 0;\n const values = deserializeValues(asString(first[0]));\n const mask = asNumber(first[2]) !== 0 ? asLong(first[1]) : null;\n const exists = Object.keys(await readLocalValues(connection, table, key)).length > 0;\n const lookup = (name: string): string | undefined => Object.keys(values).find((c) => c.toLowerCase() === name.toLowerCase());\n if (exists) {\n // Only the columns the user had changed are written back, so newer server values of the others survive.\n const columns: string[] = [];\n table.model.columns.forEach((c, i) => {\n const actual = lookup(c.name);\n if (actual !== undefined && (mask === null || mask.isZero() || mask.testBit(i))) columns.push(actual);\n });\n if (columns.length > 0) {\n const params: { [name: string]: G9SqlValue } = { $k: keyValue(table, key) };\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\n await connection.exec(`UPDATE ${table.quoted} SET ${columns.map((c, i) => quote(c) + ' = $v' + i).join(', ')} WHERE ${table.keyQuoted} = $k`, params);\n }\n } else {\n const columns = Object.keys(values);\n const params: { [name: string]: G9SqlValue } = {};\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\n await connection.exec(`INSERT INTO ${table.quoted} (${columns.map(quote).join(', ')}) VALUES (${columns.map((_, i) => '$v' + i).join(', ')})`, params);\n }\n await connection.exec('DELETE FROM g9_quarantine WHERE tid = $t AND pk = $pk', { $t: table.tid, $pk: key });\n return 1;\n }),\n );\n}\n\nexport async function discardQuarantined(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\n store.ensureInitialized();\n const tid = localTable === null ? null : getLocal(store, localTable).tid;\n return store.writeLock.run(() =>\n store.writer().exec('DELETE FROM g9_quarantine WHERE ($t IS NULL OR tid = $t) AND ($pk IS NULL OR pk = $pk)', { $t: tid, $pk: key }),\n );\n}\n\nexport async function getRetained(store: StoreInternals): Promise<G9RetainedRow[]> {\n store.ensureInitialized();\n const rows = await store.reader().query('SELECT t.local_name, r.pk, r.disposition, r.reason, r.rule, r.at_utc FROM g9_revoked r JOIN g9_tables t ON t.tid = r.tid ORDER BY r.at_utc');\n return rows.map((r) => ({\n localTable: asString(r[0]),\n key: asString(r[1]),\n disposition: asNumber(r[2]) as G9ERevocationDisposition,\n reason: asNumber(r[3]) as G9ERevocationReason,\n rule: asOptionalString(r[4]),\n atUtcMs: asNumber(r[5]),\n }));\n}\n\n/** Re-checks rows retained by a RetainWhile rule; deletes those no longer retained (`ReevaluateRetainedAsync`). */\nexport async function reevaluateRetained(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const retained = (await connection.query('SELECT tid, pk, reason, rule, disposition FROM g9_revoked')).map((r) => ({\n tid: asNumber(r[0]),\n key: asString(r[1]),\n reason: asNumber(r[2]),\n rule: asOptionalString(r[3]),\n disposition: asNumber(r[4]),\n }));\n if (retained.length === 0) return 0;\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\n let deleted = 0;\n for (const entry of retained) {\n const table = byTid(store, entry.tid);\n if (!table) continue;\n const subs = asLong(\n await connection.scalar('SELECT coalesce(max(subs), 0) FROM g9_rows WHERE tid = $t AND pk = $pk AND deleted = 0', { $t: entry.tid, $pk: entry.key }),\n );\n if (!subs.isZero()) {\n // Visible again: no longer revoked, and a pending change parked by the revocation may upload again.\n await connection.exec(\n 'DELETE FROM g9_revoked WHERE tid = $t AND pk = $pk; DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk AND code = $code; ' +\n 'UPDATE g9_rows SET rejected = 0 WHERE tid = $t AND pk = $pk AND NOT EXISTS (SELECT 1 FROM g9_rejections WHERE tid = $t AND pk = $pk)',\n { $t: entry.tid, $pk: entry.key, $code: REVOKED_REJECTION_CODE },\n );\n continue;\n }\n if (entry.disposition !== G9ERevocationDisposition.Retain) continue;\n const values = await readLocalValues(connection, table, entry.key);\n const rule = entry.rule === null ? null : store.options.revocation.find(entry.rule);\n const row: G9RevokedRow = {\n localTable: table.model.localName,\n key: entry.key,\n reason: entry.reason as G9ERevocationReason,\n subscriptionKey: null,\n hasPendingChanges: false,\n isRejected: false,\n values,\n };\n if (rule && rule.retainWhile && Object.keys(values).length > 0 && rule.retainWhile(row)) continue;\n await removeLocalRow(connection, table, entry.key);\n await connection.exec('UPDATE g9_clock SET seq = seq + 1 WHERE id = 1');\n deleted++;\n }\n await connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\n return deleted;\n }),\n );\n}\n"]}
1
+ {"version":3,"file":"revocation.js","sourceRoot":"","sources":["../../src/sqlite/revocation.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Revocation.cs: revocation dispositions (ADR-0026). Every path that\r\n// releases a row — a move-out in a pull or a reconciliation, an unsubscribe, an expired ephemeral subscription — ends in\r\n// disposeReleasedRow, which asks the revocation policy what to do with a row NO subscription holds any more.\r\n//\r\n// The local sequence such a row gets is the clock's next value, (SELECT seq FROM g9_clock) + 1; the CALLER moves the\r\n// clock afterwards (unconditionally, like the .NET store's `++sequence`).\r\nimport { G9ESyncColumnType } from '../abstractions/enums.js';\r\nimport { G9Long } from '../abstractions/long.js';\r\nimport {\r\n G9ApplyReport,\r\n G9ERevocationDisposition,\r\n G9ERevocationReason,\r\n type G9QuarantinedRow,\r\n type G9RetainedRow,\r\n type G9RevokedRow,\r\n type G9RevokedRowEditor,\r\n} from '../client/storeTypes.js';\r\nimport { asLong, asNumber, asOptionalString, asString, G9StatementBatch, statementsOf, type G9Params, type G9SqliteConnection } from './connection.js';\r\nimport type { G9SqlValue } from './driver.js';\r\nimport { byTid, deserializeValues, getLocal, keyValue, nowMs, readLocalValues, serializeValues, type LocalTable, type StoreInternals } from './internals.js';\r\nimport { quote } from './sql.js';\r\n\r\nexport const REVOKED_REJECTION_CODE = 'G9S-REJ-REVOKED';\r\nconst NEXT_SEQ = '(SELECT seq FROM g9_clock WHERE id = 1) + 1';\r\n\r\nclass RowEditor implements G9RevokedRowEditor {\r\n readonly changed = new Map<string, string>();\r\n private readonly _values: { [column: string]: G9SqlValue };\r\n\r\n constructor(values: { [column: string]: G9SqlValue }) {\r\n this._values = values;\r\n }\r\n\r\n set(column: string, value: unknown): void {\r\n if (typeof column !== 'string' || column.trim() === '') throw new TypeError('A column is required.');\r\n const actual = Object.keys(this._values).find((c) => c.toLowerCase() === column.toLowerCase());\r\n if (actual === undefined) throw new RangeError(`'${column}' is not a column of the row.`);\r\n this._values[actual] = value as G9SqlValue;\r\n this.changed.set(actual.toLowerCase(), actual);\r\n }\r\n}\r\n\r\n/** What disposing a released row reads about it before anything is written. */\r\ninterface ReleasedRowState {\r\n /** Another subscription still holds the row. */\r\n held: boolean;\r\n dirty: number;\r\n dirtyMask: G9SqlValue;\r\n rejected: number;\r\n /** A pending command touches the row (only looked at when the row has no pending change). */\r\n pendingCommand: boolean;\r\n /** The app row; empty when it is gone. */\r\n values: { [column: string]: G9SqlValue };\r\n}\r\n\r\n/** A row with no metadata row: what the per-row path assumes when its first read finds nothing. */\r\nfunction emptyState(): ReleasedRowState {\r\n return { held: false, dirty: 0, dirtyMask: 0, rejected: 0, pendingCommand: false, values: {} };\r\n}\r\n\r\ninterface Statement {\r\n script: string;\r\n params: G9Params;\r\n}\r\n\r\n/**\r\n * The revocation decision for one released row, as the statements that carry it out, in the order the .NET store runs\r\n * them. `seq` is the SQL of the local sequence the row gets when it moves: NEXT_SEQ, or `$seq` with its value in `seqParams`.\r\n */\r\nfunction planDisposal(\r\n store: StoreInternals,\r\n table: LocalTable,\r\n key: string,\r\n state: ReleasedRowState,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n seq: string,\r\n seqParams: G9Params,\r\n): { removed: boolean; statements: Statement[] } {\r\n if (state.held) return { removed: false, statements: [] };\r\n // A row touched by a pending command is settled by that command's result, never disposed underneath it.\r\n if (state.dirty === 0 && state.pendingCommand) return { removed: false, statements: [] };\r\n\r\n const values = state.values;\r\n if (Object.keys(values).length === 0) {\r\n const script = 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, local_seq = ' + seq + ' WHERE tid = $t AND pk = $pk';\r\n return { removed: false, statements: [{ script, params: { ...seqParams, $t: table.tid, $pk: key } }] };\r\n }\r\n\r\n const editor = new RowEditor(values);\r\n const row: G9RevokedRow = {\r\n localTable: table.model.localName,\r\n key,\r\n reason,\r\n subscriptionKey,\r\n hasPendingChanges: state.dirty !== 0,\r\n isRejected: state.rejected !== 0,\r\n values,\r\n };\r\n const { rule, disposition } = store.options.revocation.decide(row, editor);\r\n const now = nowMs();\r\n const statements: Statement[] = [];\r\n\r\n switch (disposition) {\r\n case G9ERevocationDisposition.MarkRevoked:\r\n case G9ERevocationDisposition.Retain: {\r\n if (editor.changed.size > 0) {\r\n const columns = Array.from(editor.changed.values());\r\n const params: G9Params = { $k: keyValue(table, key) };\r\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\r\n statements.push({ script: `UPDATE ${table.quoted} SET ${columns.map((c, i) => quote(c) + ' = $v' + i).join(', ')} WHERE ${table.keyQuoted} = $k`, params });\r\n }\r\n statements.push({\r\n script: 'INSERT OR REPLACE INTO g9_revoked (tid, pk, disposition, reason, rule, at_utc) VALUES ($t, $pk, $d, $r, $rule, $now)',\r\n params: { $t: table.tid, $pk: key, $d: disposition, $r: reason, $rule: rule ? rule.name : null, $now: now },\r\n });\r\n if (state.dirty !== 0) {\r\n // Its pending change can no longer be accepted: park it as rejected instead of uploading it on every push.\r\n statements.push({\r\n script:\r\n 'UPDATE g9_rows SET rejected = 1 WHERE tid = $t AND pk = $pk; ' +\r\n 'INSERT OR REPLACE INTO g9_rejections (tid, pk, code, message, at_utc) VALUES ($t, $pk, $code, $message, $now)',\r\n params: { $t: table.tid, $pk: key, $code: REVOKED_REJECTION_CODE, $message: 'The row is no longer visible to this device; its pending change was not uploaded.', $now: now },\r\n });\r\n }\r\n if (report) report.revokedRetained++;\r\n return { removed: false, statements };\r\n }\r\n case G9ERevocationDisposition.Quarantine:\r\n statements.push({\r\n script: 'INSERT OR REPLACE INTO g9_quarantine (tid, pk, reason, rule, row_json, had_pending, dirty_mask, at_utc) VALUES ($t, $pk, $r, $rule, $json, $p, $m, $now)',\r\n params: { $t: table.tid, $pk: key, $r: reason, $rule: rule ? rule.name : null, $json: serializeValues(values), $p: state.dirty !== 0 ? 1 : 0, $m: state.dirtyMask, $now: now },\r\n });\r\n statements.push(...removeLocalRowStatements(table, key, seq, seqParams));\r\n if (report) report.revokedQuarantined++;\r\n return { removed: true, statements };\r\n default:\r\n statements.push(...removeLocalRowStatements(table, key, seq, seqParams));\r\n if (report) report.revokedDeleted++;\r\n return { removed: true, statements };\r\n }\r\n}\r\n\r\n/**\r\n * Applies the revocation policy to a released row (`DisposeReleasedRow`). Rows still held by another subscription are\r\n * untouched. Returns true when the row left the app's table (deleted or quarantined). Reads the row first, so it sees\r\n * whatever the caller ran before it; a release of many rows goes through disposeReleasedRows.\r\n */\r\nexport async function disposeReleasedRow(\r\n store: StoreInternals,\r\n connection: G9SqliteConnection,\r\n table: LocalTable,\r\n key: string,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n): Promise<boolean> {\r\n const state = emptyState();\r\n const first = (await connection.query('SELECT subs, dirty, dirty_mask, rejected FROM g9_rows WHERE tid = $t AND pk = $pk AND deleted = 0', { $t: table.tid, $pk: key }))[0];\r\n if (first) {\r\n state.held = !asLong(first[0]).isZero();\r\n state.dirty = asNumber(first[1]);\r\n state.dirtyMask = first[2] as G9SqlValue;\r\n state.rejected = asNumber(first[3]);\r\n }\r\n if (state.held) return false;\r\n if (state.dirty === 0) {\r\n const commands = await connection.scalar(\r\n 'SELECT count(*) FROM g9_command_rows r JOIN g9_commands c ON c.command_id = r.command_id WHERE c.state = 0 AND r.tid = $t AND r.pk = $pk',\r\n { $t: table.tid, $pk: key },\r\n );\r\n state.pendingCommand = asNumber(commands) > 0;\r\n if (state.pendingCommand) return false;\r\n }\r\n state.values = await readLocalValues(connection, table, key);\r\n const plan = planDisposal(store, table, key, state, reason, subscriptionKey, report, NEXT_SEQ, {});\r\n for (const statement of plan.statements) await connection.exec(statement.script, statement.params);\r\n return plan.removed;\r\n}\r\n\r\n/**\r\n * `DisposeReleasedRow` for every row `releasedSql` selects (`SELECT tid, pk …`, in the order the .NET store walks them),\r\n * then the clock moves once per row of a known table — the database state the row-by-row path leaves, in a handful of\r\n * driver calls instead of ~6 per row (on Lynx every call crosses the bridge: 25,000 rows took 850 s row by row,\r\n * LES-0051). Everything is read before anything is written, which is exact because disposing a row writes nothing\r\n * another released row's decision reads: the store's connections run with foreign keys OFF, and the CALLER must take the\r\n * row-by-row path when the database holds a foreign trigger. Returns how many rows left the app's tables.\r\n */\r\nexport async function disposeReleasedRows(\r\n store: StoreInternals,\r\n connection: G9SqliteConnection,\r\n releasedSql: string,\r\n releasedParams: G9Params,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n onRemoved?: (tid: number, key: string) => void,\r\n): Promise<number> {\r\n const released = (await connection.query(releasedSql, releasedParams)).map((r) => ({ tid: asNumber(r[0]), key: asString(r[1]) }));\r\n if (released.length === 0) return 0;\r\n const id = (tid: number, key: string): string => tid + '\\u001f' + key;\r\n\r\n const states = new Map<string, ReleasedRowState>();\r\n const stateRows = await connection.query(\r\n 'SELECT r.tid, r.pk, r.subs, r.dirty, r.dirty_mask, r.rejected, ' +\r\n 'EXISTS (SELECT 1 FROM g9_command_rows cr JOIN g9_commands c ON c.command_id = cr.command_id WHERE c.state = 0 AND cr.tid = r.tid AND cr.pk = r.pk) ' +\r\n `FROM (${releasedSql}) g JOIN g9_rows r ON r.tid = g.tid AND r.pk = g.pk WHERE r.deleted = 0`,\r\n releasedParams,\r\n );\r\n for (const r of stateRows) {\r\n states.set(id(asNumber(r[0]), asString(r[1])), {\r\n held: !asLong(r[2]).isZero(),\r\n dirty: asNumber(r[3]),\r\n dirtyMask: r[4] as G9SqlValue,\r\n rejected: asNumber(r[5]),\r\n pendingCommand: asNumber(r[6]) !== 0,\r\n values: {},\r\n });\r\n }\r\n\r\n // The app rows, one query per table: `SELECT *` of exactly the rows the per-row path reads by key.\r\n for (const tid of new Set(released.map((r) => r.tid))) {\r\n const table = byTid(store, tid);\r\n if (!table) continue;\r\n const integerKey = table.model.keyType === G9ESyncColumnType.Int32 || table.model.keyType === G9ESyncColumnType.Int64;\r\n const sql = `SELECT g.pk, t.* FROM (${releasedSql}) g JOIN ${table.quoted} t ON t.${table.keyQuoted} = ${integerKey ? 'CAST(g.pk AS INTEGER)' : 'g.pk'} WHERE g.tid = ${tid}`;\r\n const result = (await connection.runStatements(statementsOf(sql, releasedParams)))[0];\r\n if (!result) continue;\r\n const columns = result.columns.slice(1);\r\n for (const row of result.rows) {\r\n const rowId = id(tid, asString(row[0] as G9SqlValue));\r\n const state = states.get(rowId) ?? emptyState();\r\n states.set(rowId, state);\r\n columns.forEach((name, i) => (state.values[name] = row[i + 1] as G9SqlValue));\r\n }\r\n }\r\n\r\n const batch = new G9StatementBatch(connection, store.options.statementsPerBatch);\r\n const base = asLong(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n let advanced = 0;\r\n let removed = 0;\r\n for (const row of released) {\r\n const table = byTid(store, row.tid);\r\n // The .NET store advances its sequence for every released row of a known table, whether or not it moved.\r\n if (!table) continue;\r\n const state = states.get(id(row.tid, row.key)) ?? emptyState();\r\n const plan = planDisposal(store, table, row.key, state, reason, subscriptionKey, report, '$seq', { $seq: base.add(G9Long.fromNumber(++advanced)) });\r\n if (plan.removed) {\r\n removed++;\r\n onRemoved?.(row.tid, row.key);\r\n }\r\n for (const statement of plan.statements) if (batch.add(statement.script, statement.params)) await batch.flush();\r\n }\r\n await batch.flush();\r\n if (advanced > 0) await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: advanced });\r\n return removed;\r\n}\r\n\r\nfunction removeLocalRowStatements(table: LocalTable, key: string, seq: string, seqParams: G9Params): Statement[] {\r\n return [\r\n { script: `DELETE FROM ${table.quoted} WHERE ${table.keyQuoted} = $k`, params: { $k: keyValue(table, key) } },\r\n {\r\n script:\r\n 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, local_seq = ' +\r\n seq +\r\n ' WHERE tid = $t AND pk = $pk; ' +\r\n 'DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk; DELETE FROM g9_revoked WHERE tid = $t AND pk = $pk',\r\n params: { ...seqParams, $t: table.tid, $pk: key },\r\n },\r\n ];\r\n}\r\n\r\n/**\r\n * `RevertRejectedAsync` (LES-0070): gives up the local change of rejected rows and takes the server's copy. A row the server never had\r\n * (`server_ver = 0`) is removed locally; any other drops its pending change and its version, so the next forced reconciliation\r\n * fetches the server's copy (the digest hashes key + server_ver, not the values). A library write: capture is silent, nothing uploads.\r\n */\r\nexport async function revertRejected(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\r\n store.ensureInitialized();\r\n let where = 'rejected = 1';\r\n const params: G9Params = {};\r\n if (localTable !== null) {\r\n where += ' AND tid = $t';\r\n params.$t = getLocal(store, localTable).tid;\r\n }\r\n if (key !== null) {\r\n where += ' AND pk = $pk';\r\n params.$pk = key;\r\n }\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const rows = await connection.query('SELECT tid, pk, server_ver FROM g9_rows WHERE ' + where, params);\r\n if (rows.length === 0) return 0;\r\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\r\n for (const r of rows) {\r\n const tid = asNumber(r[0]);\r\n const pk = asString(r[1]);\r\n const table = byTid(store, tid);\r\n if (!table) continue;\r\n if (asNumber(r[2]) === 0) {\r\n for (const statement of removeLocalRowStatements(table, pk, NEXT_SEQ, {})) await connection.exec(statement.script, statement.params);\r\n await connection.exec('UPDATE g9_clock SET seq = seq + 1 WHERE id = 1');\r\n continue;\r\n }\r\n await connection.exec(\r\n 'DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk; UPDATE g9_rows SET dirty = 0, dirty_mask = 0, rejected = 0, server_ver = 0 WHERE tid = $t AND pk = $pk',\r\n { $t: tid, $pk: pk },\r\n );\r\n }\r\n await connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\r\n return rows.length;\r\n }),\r\n );\r\n}\r\n\r\n/** `RemoveLocalRow`: the row leaves the app's table; its metadata becomes a tombstone at the clock's next value. */\r\nexport async function removeLocalRow(connection: G9SqliteConnection, table: LocalTable, key: string): Promise<void> {\r\n for (const statement of removeLocalRowStatements(table, key, NEXT_SEQ, {})) await connection.exec(statement.script, statement.params);\r\n}\r\n\r\n// ================================================================ holding area and retained rows\r\n\r\nexport async function getQuarantined(store: StoreInternals): Promise<G9QuarantinedRow[]> {\r\n store.ensureInitialized();\r\n const rows = await store\r\n .reader()\r\n .query('SELECT t.local_name, q.pk, q.reason, q.rule, q.had_pending, q.row_json, q.at_utc FROM g9_quarantine q JOIN g9_tables t ON t.tid = q.tid ORDER BY q.at_utc');\r\n return rows.map((r) => ({\r\n localTable: asString(r[0]),\r\n key: asString(r[1]),\r\n reason: asNumber(r[2]) as G9ERevocationReason,\r\n rule: asOptionalString(r[3]),\r\n hadPendingChanges: asNumber(r[4]) !== 0,\r\n values: deserializeValues(asString(r[5])),\r\n atUtcMs: asNumber(r[6]),\r\n }));\r\n}\r\n\r\n/** Puts a quarantined row back as a pending local change (capture is ON: the restored values upload on the next push). */\r\nexport async function restoreQuarantined(store: StoreInternals, localTable: string, key: string): Promise<number> {\r\n store.ensureInitialized();\r\n const table = getLocal(store, localTable);\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const rows = await connection.query('SELECT row_json, dirty_mask, had_pending FROM g9_quarantine WHERE tid = $t AND pk = $pk', { $t: table.tid, $pk: key });\r\n const first = rows[0];\r\n if (!first) return 0;\r\n const values = deserializeValues(asString(first[0]));\r\n const mask = asNumber(first[2]) !== 0 ? asLong(first[1]) : null;\r\n const exists = Object.keys(await readLocalValues(connection, table, key)).length > 0;\r\n const lookup = (name: string): string | undefined => Object.keys(values).find((c) => c.toLowerCase() === name.toLowerCase());\r\n if (exists) {\r\n // Only the columns the user had changed are written back, so newer server values of the others survive.\r\n const columns: string[] = [];\r\n table.model.columns.forEach((c, i) => {\r\n const actual = lookup(c.name);\r\n if (actual !== undefined && (mask === null || mask.isZero() || mask.testBit(i))) columns.push(actual);\r\n });\r\n if (columns.length > 0) {\r\n const params: { [name: string]: G9SqlValue } = { $k: keyValue(table, key) };\r\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\r\n await connection.exec(`UPDATE ${table.quoted} SET ${columns.map((c, i) => quote(c) + ' = $v' + i).join(', ')} WHERE ${table.keyQuoted} = $k`, params);\r\n }\r\n } else {\r\n const columns = Object.keys(values);\r\n const params: { [name: string]: G9SqlValue } = {};\r\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\r\n await connection.exec(`INSERT INTO ${table.quoted} (${columns.map(quote).join(', ')}) VALUES (${columns.map((_, i) => '$v' + i).join(', ')})`, params);\r\n }\r\n await connection.exec('DELETE FROM g9_quarantine WHERE tid = $t AND pk = $pk', { $t: table.tid, $pk: key });\r\n return 1;\r\n }),\r\n );\r\n}\r\n\r\nexport async function discardQuarantined(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\r\n store.ensureInitialized();\r\n const tid = localTable === null ? null : getLocal(store, localTable).tid;\r\n return store.writeLock.run(() =>\r\n store.writer().exec('DELETE FROM g9_quarantine WHERE ($t IS NULL OR tid = $t) AND ($pk IS NULL OR pk = $pk)', { $t: tid, $pk: key }),\r\n );\r\n}\r\n\r\nexport async function getRetained(store: StoreInternals): Promise<G9RetainedRow[]> {\r\n store.ensureInitialized();\r\n const rows = await store.reader().query('SELECT t.local_name, r.pk, r.disposition, r.reason, r.rule, r.at_utc FROM g9_revoked r JOIN g9_tables t ON t.tid = r.tid ORDER BY r.at_utc');\r\n return rows.map((r) => ({\r\n localTable: asString(r[0]),\r\n key: asString(r[1]),\r\n disposition: asNumber(r[2]) as G9ERevocationDisposition,\r\n reason: asNumber(r[3]) as G9ERevocationReason,\r\n rule: asOptionalString(r[4]),\r\n atUtcMs: asNumber(r[5]),\r\n }));\r\n}\r\n\r\n/** Re-checks rows retained by a RetainWhile rule; deletes those no longer retained (`ReevaluateRetainedAsync`). */\r\nexport async function reevaluateRetained(store: StoreInternals): Promise<number> {\r\n store.ensureInitialized();\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const retained = (await connection.query('SELECT tid, pk, reason, rule, disposition FROM g9_revoked')).map((r) => ({\r\n tid: asNumber(r[0]),\r\n key: asString(r[1]),\r\n reason: asNumber(r[2]),\r\n rule: asOptionalString(r[3]),\r\n disposition: asNumber(r[4]),\r\n }));\r\n if (retained.length === 0) return 0;\r\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\r\n let deleted = 0;\r\n for (const entry of retained) {\r\n const table = byTid(store, entry.tid);\r\n if (!table) continue;\r\n const subs = asLong(\r\n await connection.scalar('SELECT coalesce(max(subs), 0) FROM g9_rows WHERE tid = $t AND pk = $pk AND deleted = 0', { $t: entry.tid, $pk: entry.key }),\r\n );\r\n if (!subs.isZero()) {\r\n // Visible again: no longer revoked, and a pending change parked by the revocation may upload again.\r\n await connection.exec(\r\n 'DELETE FROM g9_revoked WHERE tid = $t AND pk = $pk; DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk AND code = $code; ' +\r\n 'UPDATE g9_rows SET rejected = 0 WHERE tid = $t AND pk = $pk AND NOT EXISTS (SELECT 1 FROM g9_rejections WHERE tid = $t AND pk = $pk)',\r\n { $t: entry.tid, $pk: entry.key, $code: REVOKED_REJECTION_CODE },\r\n );\r\n continue;\r\n }\r\n if (entry.disposition !== G9ERevocationDisposition.Retain) continue;\r\n const values = await readLocalValues(connection, table, entry.key);\r\n const rule = entry.rule === null ? null : store.options.revocation.find(entry.rule);\r\n const row: G9RevokedRow = {\r\n localTable: table.model.localName,\r\n key: entry.key,\r\n reason: entry.reason as G9ERevocationReason,\r\n subscriptionKey: null,\r\n hasPendingChanges: false,\r\n isRejected: false,\r\n values,\r\n };\r\n if (rule && rule.retainWhile && Object.keys(values).length > 0 && rule.retainWhile(row)) continue;\r\n await removeLocalRow(connection, table, entry.key);\r\n await connection.exec('UPDATE g9_clock SET seq = seq + 1 WHERE id = 1');\r\n deleted++;\r\n }\r\n await connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\r\n return deleted;\r\n }),\r\n );\r\n}\r\n"]}