@g9tm/syncdata 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PARITY.md +26 -2
- package/README.md +1 -1
- package/dist/abstractions/errors.d.ts +4 -0
- package/dist/abstractions/errors.js +4 -0
- package/dist/abstractions/errors.js.map +1 -1
- package/dist/client/engine.js +93 -51
- package/dist/client/engine.js.map +1 -1
- package/dist/client/runs.d.ts +5 -0
- package/dist/client/runs.js +8 -7
- package/dist/client/runs.js.map +1 -1
- package/dist/client/storeTypes.d.ts +22 -1
- package/dist/client/storeTypes.js +27 -0
- package/dist/client/storeTypes.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.js +1 -0
- package/dist/node/index.js.map +1 -1
- package/dist/node/snapshotFileSink.d.ts +3 -0
- package/dist/node/snapshotFileSink.js +79 -0
- package/dist/node/snapshotFileSink.js.map +1 -0
- package/dist/protocol/dtos.d.ts +76 -0
- package/dist/protocol/dtos.js +2 -0
- package/dist/protocol/dtos.js.map +1 -1
- package/dist/protocol/wire.d.ts +3 -1
- package/dist/protocol/wire.js +49 -0
- package/dist/protocol/wire.js.map +1 -1
- package/dist/sqlite/apply.d.ts +21 -1
- package/dist/sqlite/apply.js +218 -114
- package/dist/sqlite/apply.js.map +1 -1
- package/dist/sqlite/connection.d.ts +5 -0
- package/dist/sqlite/connection.js +17 -0
- package/dist/sqlite/connection.js.map +1 -1
- package/dist/sqlite/index.d.ts +2 -1
- package/dist/sqlite/index.js +1 -0
- package/dist/sqlite/index.js.map +1 -1
- package/dist/sqlite/options.d.ts +39 -1
- package/dist/sqlite/options.js +5 -1
- package/dist/sqlite/options.js.map +1 -1
- package/dist/sqlite/push.js +4 -1
- package/dist/sqlite/push.js.map +1 -1
- package/dist/sqlite/query.js +44 -15
- package/dist/sqlite/query.js.map +1 -1
- package/dist/sqlite/revocation.d.ts +1 -1
- package/dist/sqlite/revocation.js +4 -2
- package/dist/sqlite/revocation.js.map +1 -1
- package/dist/sqlite/snapshotFiles.d.ts +51 -0
- package/dist/sqlite/snapshotFiles.js +516 -0
- package/dist/sqlite/snapshotFiles.js.map +1 -0
- package/dist/sqlite/sql.d.ts +1 -1
- package/dist/sqlite/sql.js +4 -0
- package/dist/sqlite/sql.js.map +1 -1
- package/dist/sqlite/store.d.ts +20 -2
- package/dist/sqlite/store.js +147 -78
- package/dist/sqlite/store.js.map +1 -1
- package/package.json +3 -3
package/dist/sqlite/query.js.map
CHANGED
|
@@ -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 G9LocalRowEntry,\n G9PendingSummary,\n G9PendingTable,\n G9ResumePoint,\n G9StagedPull,\n G9SyncRejection,\n G9SyncRunReport,\n} 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, 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 { 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 return 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) 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) await connection.exec('DELETE FROM g9_stage WHERE run_id = $r; DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n return doomed.length;\n }),\n );\n}\n\nexport async function discardAllStagedPulls(store: StoreInternals): Promise<number> {\n return 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 await connection.exec('DELETE FROM g9_stage; DELETE FROM g9_stage_runs;');\n return count;\n }),\n );\n}\n\nexport async function beginStagedPull(store: StoreInternals, pull: G9StagedPull): Promise<void> {\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 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: persistedJson(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}\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 const restore = await durability(connection);\n try {\n await connection.transaction('immediate', async () => {\n await connection.exec(\n 'INSERT OR REPLACE INTO g9_stage (run_id, seq, subscription_key, row_count, continuation_json, payload) VALUES ($r, $s, $k, $n, $c, $p)',\n {\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 );\n if (chunk.isFinal) await connection.exec('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 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 = (await connection.query('SELECT coalesce(sum(row_count), 0), coalesce(sum(length(payload)), 0) FROM g9_stage WHERE run_id = $r', { $r: runId }))[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 await store.writeLock.run(() => store.writer().exec('DELETE FROM g9_stage WHERE run_id = $r; DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId }));\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\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\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 G9LocalRowEntry,\n G9PendingSummary,\n G9PendingTable,\n G9ResumePoint,\n G9StagedPull,\n G9SyncRejection,\n G9SyncRunReport,\n} 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\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"]}
|
|
@@ -16,7 +16,7 @@ export declare function disposeReleasedRow(store: StoreInternals, connection: G9
|
|
|
16
16
|
* another released row's decision reads: the store's connections run with foreign keys OFF, and the CALLER must take the
|
|
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
|
-
export declare function disposeReleasedRows(store: StoreInternals, connection: G9SqliteConnection, releasedSql: string, releasedParams: G9Params, reason: G9ERevocationReason, subscriptionKey: string | null, report: G9ApplyReport | null): Promise<number>;
|
|
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
20
|
/** `RemoveLocalRow`: the row leaves the app's table; its metadata becomes a tombstone at the clock's next value. */
|
|
21
21
|
export declare function removeLocalRow(connection: G9SqliteConnection, table: LocalTable, key: string): Promise<void>;
|
|
22
22
|
export declare function getQuarantined(store: StoreInternals): Promise<G9QuarantinedRow[]>;
|
|
@@ -136,7 +136,7 @@ export async function disposeReleasedRow(store, connection, table, key, reason,
|
|
|
136
136
|
* another released row's decision reads: the store's connections run with foreign keys OFF, and the CALLER must take the
|
|
137
137
|
* row-by-row path when the database holds a foreign trigger. Returns how many rows left the app's tables.
|
|
138
138
|
*/
|
|
139
|
-
export async function disposeReleasedRows(store, connection, releasedSql, releasedParams, reason, subscriptionKey, report) {
|
|
139
|
+
export async function disposeReleasedRows(store, connection, releasedSql, releasedParams, reason, subscriptionKey, report, onRemoved) {
|
|
140
140
|
var _a, _b;
|
|
141
141
|
const released = (await connection.query(releasedSql, releasedParams)).map((r) => ({ tid: asNumber(r[0]), key: asString(r[1]) }));
|
|
142
142
|
if (released.length === 0)
|
|
@@ -185,8 +185,10 @@ export async function disposeReleasedRows(store, connection, releasedSql, releas
|
|
|
185
185
|
continue;
|
|
186
186
|
const state = (_b = states.get(id(row.tid, row.key))) !== null && _b !== void 0 ? _b : emptyState();
|
|
187
187
|
const plan = planDisposal(store, table, row.key, state, reason, subscriptionKey, report, '$seq', { $seq: base.add(G9Long.fromNumber(++advanced)) });
|
|
188
|
-
if (plan.removed)
|
|
188
|
+
if (plan.removed) {
|
|
189
189
|
removed++;
|
|
190
|
+
onRemoved === null || onRemoved === void 0 ? void 0 : onRemoved(row.tid, row.key);
|
|
191
|
+
}
|
|
190
192
|
for (const statement of plan.statements)
|
|
191
193
|
if (batch.add(statement.script, statement.params))
|
|
192
194
|
await batch.flush();
|
|
@@ -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): 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) removed++;\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\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"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type G9DtNegotiatedTable, type G9DtPullPlan, type G9DtSnapshotFileManifest, type G9DtSnapshotFileRequest, type G9DtSyncChunk } from '../protocol/dtos.js';
|
|
2
|
+
import { type G9SqliteConnection } from './connection.js';
|
|
3
|
+
import type { G9SqlValue } from './driver.js';
|
|
4
|
+
import { type StoreInternals } from './internals.js';
|
|
5
|
+
import type { ApplyContext } from './apply.js';
|
|
6
|
+
/** The protocol's snapshot-file format this build reads (`G9SyncProtocol.SnapshotFileFormatVersion`). */
|
|
7
|
+
export declare const SNAPSHOT_FILE_FORMAT_VERSION = 1;
|
|
8
|
+
/** "G9SF": `PRAGMA application_id` of a snapshot file (`G9CSnapshotFileWriter.ApplicationId`). */
|
|
9
|
+
export declare const SNAPSHOT_FILE_APPLICATION_ID = 1194939206;
|
|
10
|
+
/** A staged file (`StagedFile`). */
|
|
11
|
+
export interface G9StagedFile {
|
|
12
|
+
fileId: string;
|
|
13
|
+
path: string;
|
|
14
|
+
manifest: G9DtSnapshotFileManifest;
|
|
15
|
+
subscriptionKey: string | null;
|
|
16
|
+
firstSequence: number;
|
|
17
|
+
segmentsDone: number;
|
|
18
|
+
}
|
|
19
|
+
/** The device's offer (`DescribeSnapshotFiles`): storage forms and, per received table, the shape the store creates it with. */
|
|
20
|
+
export declare function describeSnapshotFiles(store: StoreInternals, negotiated: readonly G9DtNegotiatedTable[]): G9DtSnapshotFileRequest | null;
|
|
21
|
+
/** The persisted (.NET) form of a plan: each planned file's `snapshotUtc` as a DateTime. */
|
|
22
|
+
export declare function persistedPlan(plan: G9DtPullPlan): string;
|
|
23
|
+
/** The staged files of a run, in plan order. */
|
|
24
|
+
export declare function readStagedFiles(connection: G9SqliteConnection, runId: string): Promise<G9StagedFile[]>;
|
|
25
|
+
/**
|
|
26
|
+
* `StageFileSegment`: one segment to its place in the staged file, checked against its SHA-256 by the sink BEFORE it is
|
|
27
|
+
* written. Durable only at checkpoints - every `snapshotFileCheckpointBytes` and at the last segment - in that order: the file
|
|
28
|
+
* is flushed first, then the stage row records the resume point.
|
|
29
|
+
*/
|
|
30
|
+
export declare function stageFileSegment(store: StoreInternals, runId: string, chunk: G9DtSyncChunk): Promise<void>;
|
|
31
|
+
/** A resumed stream starts at a file's last checkpoint: segments written after it are written again. */
|
|
32
|
+
export declare function forgetPendingSegments(store: StoreInternals, runId: string): void;
|
|
33
|
+
/** The staged files of the runs a statement is about to delete (their rows go in the same transaction, the files after it). */
|
|
34
|
+
export declare function takeStagedFiles(connection: G9SqliteConnection, runFilterSql: string, params?: {
|
|
35
|
+
[name: string]: G9SqlValue;
|
|
36
|
+
}): Promise<string[]>;
|
|
37
|
+
export declare function deleteFiles(store: StoreInternals, paths: readonly string[]): Promise<void>;
|
|
38
|
+
/** Deletes staged files no stage refers to any more (a crash between a stage's commit and its files' deletion). */
|
|
39
|
+
export declare function sweepOrphanSnapshotFiles(store: StoreInternals, connection: G9SqliteConnection): Promise<void>;
|
|
40
|
+
/** `VerifyStagedFile`: every segment arrived, the size is the manifest's, and it is a snapshot file (header + "G9SF"). */
|
|
41
|
+
export declare function verifyStagedFile(store: StoreInternals, file: G9StagedFile): Promise<void>;
|
|
42
|
+
/** `AttachedFiles.Schema`. */
|
|
43
|
+
export declare function attachedSchema(index: number): string;
|
|
44
|
+
/** ATTACHes the staged files (outside any transaction) and returns the detach action. */
|
|
45
|
+
export declare function attachFiles(connection: G9SqliteConnection, files: readonly G9StagedFile[]): Promise<() => Promise<void>>;
|
|
46
|
+
/** The first snapshot-file time per subscription of a plan (the reconcile clock of a file-based subscription starts there). */
|
|
47
|
+
export declare function fileSnapshotTimes(plan: G9DtPullPlan): {
|
|
48
|
+
[subscriptionKey: string]: number;
|
|
49
|
+
};
|
|
50
|
+
/** `ApplySnapshotFile`: copy, columns or merge per table, metadata set-based, inside the apply's transaction. */
|
|
51
|
+
export declare function applySnapshotFile(store: StoreInternals, context: ApplyContext, schema: string, file: G9StagedFile): Promise<void>;
|