@itwin/core-backend 5.16.0-dev.5 → 5.16.0-dev.7
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/CHANGELOG.md +29 -1
- package/lib/cjs/EditTxn.d.ts +56 -19
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +54 -19
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +3 -3
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +4 -3
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/SQLiteDb.d.ts +52 -5
- package/lib/cjs/SQLiteDb.d.ts.map +1 -1
- package/lib/cjs/SQLiteDb.js +40 -5
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +11 -6
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.d.ts +4 -0
- package/lib/cjs/internal/ChangesetConflictArgs.d.ts.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js +1 -0
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/EditTxn.d.ts +56 -19
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +53 -18
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +3 -3
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +4 -3
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/SQLiteDb.d.ts +52 -5
- package/lib/esm/SQLiteDb.d.ts.map +1 -1
- package/lib/esm/SQLiteDb.js +40 -5
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +12 -7
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.d.ts +4 -0
- package/lib/esm/internal/ChangesetConflictArgs.d.ts.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js +1 -0
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js +403 -249
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +71 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/DeleteElements.test.js +962 -83
- package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +6 -2
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js +15 -0
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js +422 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/package.json +17 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLiteDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SQLiteDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport { BeDuration, DbResult, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport { SqliteChangesetReader } from \"../../SqliteChangesetReader\";\r\nimport \"../TestUtils\"; // registers the global mocha before/after hooks that start/stop the backend\r\n\r\ndescribe(\"SQLiteDb\", () => {\r\n\r\n it(\"should create new SQLiteDb\", async () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"db1.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(fileName, undefined, { rawSQLite: true, pageSize: 8 * 1024 });\r\n db.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (1,\"val1\")`);\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (2,\"val2\")`);\r\n db.saveChanges();\r\n\r\n const testDb = () => {\r\n db.withSqliteStatement(\"SELECT id,val from test1\", (stmt) => {\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(1);\r\n expect(stmt.getValue(1).getString()).equal(\"val1\");\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(2);\r\n expect(stmt.getValue(1).getString()).equal(\"val2\");\r\n });\r\n db.closeDb();\r\n };\r\n testDb();\r\n\r\n // now test immutable flag\r\n db.openDb(fileName, { openMode: OpenMode.Readonly, skipFileCheck: true, immutable: true, defaultTxn: SQLiteDb.DefaultTxnMode.None, rawSQLite: true });\r\n testDb();\r\n\r\n expect(db.isOpen).false;\r\n expect(() => db.vacuum()).throws(\"not open\");\r\n\r\n let val = db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, () => {\r\n expect(db.isOpen);\r\n db.vacuum();\r\n return 22;\r\n });\r\n expect(val).equal(22);\r\n expect(db.isOpen).false;\r\n\r\n val = await db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, async () => {\r\n expect(db.isOpen);\r\n await BeDuration.fromMilliseconds(10).wait();\r\n return 100;\r\n });\r\n expect(val).equal(100);\r\n expect(db.isOpen).false;\r\n });\r\n\r\n it(\"should be able to open existing .bim file with SQLiteDb\", () => {\r\n const testFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = new SQLiteDb();\r\n db.withOpenDb({ dbName: testFileName }, () => {\r\n db.withSqliteStatement(`SELECT StrData FROM be_Prop WHERE Namespace=\"ec_Db\" AND Name=\"SchemaVersion\"`, (stmt) => {\r\n expect(stmt.step()).equal(DbResult.BE_SQLITE_ROW);\r\n const val = JSON.parse(stmt.getValue(0).getString());\r\n expect(val.major).equal(4, \"read major version\");\r\n expect(val.minor).equal(0, \"read minor version\");\r\n });\r\n });\r\n });\r\n\r\n it(\"supports reading an iModel changeset with SQLiteDb\", () => {\r\n const iModelFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/ReadOnlyTest.bim\");\r\n const changesetFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/csets/dbe4b3824129f99e4eb485fb7cd9d2fea2354be1.cs\");\r\n const iModel = SnapshotDb.openFile(iModelFileName);\r\n let tableName: string;\r\n let columnNames: string[];\r\n let expectedValues: Record<string, unknown>;\r\n let stage: \"Old\" | \"New\";\r\n try {\r\n using schemaReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db: iModel });\r\n expect(schemaReader.step()).true;\r\n tableName = schemaReader.tableName;\r\n columnNames = schemaReader.getColumnNames(tableName);\r\n stage = schemaReader.op === \"Deleted\" ? \"Old\" : \"New\";\r\n expectedValues = schemaReader.getChangeValuesObject(stage, { includeNullColumns: true })!;\r\n } finally {\r\n iModel.close();\r\n }\r\n\r\n const dbFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"changeset-reader.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(dbFileName, undefined, { rawSQLite: true });\r\n const declaredColumns = columnNames.slice(0, -1);\r\n\r\n try {\r\n using missingTableReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(missingTableReader.step()).true;\r\n expect(() => missingTableReader.getChangeValuesObject(stage)).throws(`changeset table ${tableName} does not exist`);\r\n\r\n db.executeSQL(`CREATE TABLE \"${tableName}\" (${declaredColumns.map((name) => `\"${name}\"`).join(\",\")})`);\r\n\r\n using checkedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db });\r\n expect(checkedReader.step()).true;\r\n expect(() => checkedReader.getChangeValuesObject(stage)).throws(\"columns count does not match\");\r\n\r\n using uncheckedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(uncheckedReader.step()).true;\r\n const values = uncheckedReader.getChangeValuesObject(stage, { includeNullColumns: true });\r\n const expectedDeclaredValues = Object.fromEntries(declaredColumns.map((name) => [name, expectedValues[name]]));\r\n expect(values).deep.equal(expectedDeclaredValues);\r\n } finally {\r\n db.closeDb();\r\n }\r\n\r\n expect(() => SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true })).throws(\"db must be open\");\r\n });\r\n\r\n describe(\"applyChangeset\", () => {\r\n const readRows = (db: SQLiteDb, tableName: string) => {\r\n const rows: Array<{ id: number, val: string }> = [];\r\n db.withSqliteStatement(`SELECT id,val FROM ${tableName} ORDER BY id`, (stmt) => {\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n rows.push({ id: stmt.getValue(0).getInteger(), val: stmt.getValue(1).getString() });\r\n });\r\n return rows;\r\n };\r\n\r\n it(\"should apply a changeset containing data changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-1.changeset\");\r\n\r\n // create the source db (with the table already present - raw sqlite changesets cannot capture DDL),\r\n // then capture a changeset that inserts some rows\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n source.startChangeTracking();\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'val1')`);\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'val2')`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n // apply the changeset (raw sqlite changesets have no header to validate) to a db with the same schema\r\n const target = new SQLiteDb();\r\n target.createDb(targetFileName, undefined, { rawSQLite: true });\r\n target.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n target.saveChanges();\r\n target.applyChangeset(changesetFileName);\r\n target.saveChanges();\r\n\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"val1\" }, { id: 2, val: \"val2\" }]);\r\n\r\n source.closeDb();\r\n target.closeDb();\r\n });\r\n\r\n it(\"should throw when creating a changeset containing DDL/schema changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl-source.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl.changeset\");\r\n\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeDdl(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n\r\n // raw sqlite changesets cannot represent DDL/schema changes\r\n expect(() => source.createChangeset(changesetFileName)).throws();\r\n\r\n source.closeDb();\r\n });\r\n\r\n it(\"should fail if applying a changeset produces a conflict, leaving it to the caller to abandon the partially-applied changes\", () => {\r\n const baseFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-base.db\");\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-2.changeset\");\r\n\r\n // create a common base db with two rows, then clone it so source and target start out identical\r\n const base = new SQLiteDb();\r\n base.createDb(baseFileName, undefined, { rawSQLite: true });\r\n base.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'base1')`);\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'base2')`);\r\n base.saveChanges();\r\n base.closeDb();\r\n\r\n IModelJsFs.copySync(baseFileName, sourceFileName);\r\n IModelJsFs.copySync(baseFileName, targetFileName);\r\n\r\n // diverge source: update both rows and capture that as a single changeset. Only the second row will\r\n // conflict with target's divergence below - the first row's change would apply cleanly on its own.\r\n const source = new SQLiteDb();\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeSQL(`UPDATE test1 SET val='fromSource1' WHERE id=1`);\r\n source.executeSQL(`UPDATE test1 SET val='fromSource2' WHERE id=2`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n source.closeDb();\r\n\r\n // diverge target independently - only on the second row - so applying source's changeset conflicts partway through\r\n const target = new SQLiteDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n target.executeSQL(`UPDATE test1 SET val='fromTarget2' WHERE id=2`);\r\n target.saveChanges();\r\n\r\n // confirm the pre-apply baseline: id=1 was never touched by target, id=2 diverged from source\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // applyChangeset only throws on failure - it does not commit or abandon changes itself. Since the first\r\n // row's change didn't conflict, it may already have been applied to the current transaction by the time\r\n // the second row's conflict causes the throw.\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"fromSource1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // it is the caller's responsibility to abandon (or save) the partially-applied changes after catching the error\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n target.closeDb();\r\n });\r\n });\r\n\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"SQLiteDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SQLiteDb.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { expect } from \"chai\";\r\nimport * as sinon from \"sinon\";\r\nimport { BeDuration, DbConflictCause, DbConflictResolution, DbOpcode, DbResult, Logger, LogLevel, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport { SqliteChangesetReader } from \"../../SqliteChangesetReader\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\nimport \"../TestUtils\"; // registers the global mocha before/after hooks that start/stop the backend\r\n\r\ndescribe(\"SQLiteDb\", () => {\r\n\r\n it(\"should create new SQLiteDb\", async () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"db1.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(fileName, undefined, { rawSQLite: true, pageSize: 8 * 1024 });\r\n db.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (1,\"val1\")`);\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (2,\"val2\")`);\r\n db.saveChanges();\r\n\r\n const testDb = () => {\r\n db.withSqliteStatement(\"SELECT id,val from test1\", (stmt) => {\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(1);\r\n expect(stmt.getValue(1).getString()).equal(\"val1\");\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(2);\r\n expect(stmt.getValue(1).getString()).equal(\"val2\");\r\n });\r\n db.closeDb();\r\n };\r\n testDb();\r\n\r\n // now test immutable flag\r\n db.openDb(fileName, { openMode: OpenMode.Readonly, skipFileCheck: true, immutable: true, defaultTxn: SQLiteDb.DefaultTxnMode.None, rawSQLite: true });\r\n testDb();\r\n\r\n expect(db.isOpen).false;\r\n expect(() => db.vacuum()).throws(\"not open\");\r\n\r\n let val = db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, () => {\r\n expect(db.isOpen);\r\n db.vacuum();\r\n return 22;\r\n });\r\n expect(val).equal(22);\r\n expect(db.isOpen).false;\r\n\r\n val = await db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, async () => {\r\n expect(db.isOpen);\r\n await BeDuration.fromMilliseconds(10).wait();\r\n return 100;\r\n });\r\n expect(val).equal(100);\r\n expect(db.isOpen).false;\r\n });\r\n\r\n it(\"should be able to open existing .bim file with SQLiteDb\", () => {\r\n const testFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = new SQLiteDb();\r\n db.withOpenDb({ dbName: testFileName }, () => {\r\n db.withSqliteStatement(`SELECT StrData FROM be_Prop WHERE Namespace=\"ec_Db\" AND Name=\"SchemaVersion\"`, (stmt) => {\r\n expect(stmt.step()).equal(DbResult.BE_SQLITE_ROW);\r\n const val = JSON.parse(stmt.getValue(0).getString());\r\n expect(val.major).equal(4, \"read major version\");\r\n expect(val.minor).equal(0, \"read minor version\");\r\n });\r\n });\r\n });\r\n\r\n it(\"supports reading an iModel changeset with SQLiteDb\", () => {\r\n const iModelFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/ReadOnlyTest.bim\");\r\n const changesetFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/csets/dbe4b3824129f99e4eb485fb7cd9d2fea2354be1.cs\");\r\n const iModel = SnapshotDb.openFile(iModelFileName);\r\n let tableName: string;\r\n let columnNames: string[];\r\n let expectedValues: Record<string, unknown>;\r\n let stage: \"Old\" | \"New\";\r\n try {\r\n using schemaReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db: iModel });\r\n expect(schemaReader.step()).true;\r\n tableName = schemaReader.tableName;\r\n columnNames = schemaReader.getColumnNames(tableName);\r\n stage = schemaReader.op === \"Deleted\" ? \"Old\" : \"New\";\r\n expectedValues = schemaReader.getChangeValuesObject(stage, { includeNullColumns: true })!;\r\n } finally {\r\n iModel.close();\r\n }\r\n\r\n const dbFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"changeset-reader.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(dbFileName, undefined, { rawSQLite: true });\r\n const declaredColumns = columnNames.slice(0, -1);\r\n\r\n try {\r\n using missingTableReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(missingTableReader.step()).true;\r\n expect(() => missingTableReader.getChangeValuesObject(stage)).throws(`changeset table ${tableName} does not exist`);\r\n\r\n db.executeSQL(`CREATE TABLE \"${tableName}\" (${declaredColumns.map((name) => `\"${name}\"`).join(\",\")})`);\r\n\r\n using checkedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db });\r\n expect(checkedReader.step()).true;\r\n expect(() => checkedReader.getChangeValuesObject(stage)).throws(\"columns count does not match\");\r\n\r\n using uncheckedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(uncheckedReader.step()).true;\r\n const values = uncheckedReader.getChangeValuesObject(stage, { includeNullColumns: true });\r\n const expectedDeclaredValues = Object.fromEntries(declaredColumns.map((name) => [name, expectedValues[name]]));\r\n expect(values).deep.equal(expectedDeclaredValues);\r\n } finally {\r\n db.closeDb();\r\n }\r\n\r\n expect(() => SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true })).throws(\"db must be open\");\r\n });\r\n\r\n describe(\"applyChangeset\", () => {\r\n const applyFlags = SQLiteDb.ApplyChangesetFlags;\r\n const policy = SQLiteDb.ChangesetConflictPolicy;\r\n const readRows = (db: SQLiteDb, tableName: string) => {\r\n const rows: Array<{ id: number, val: string }> = [];\r\n db.withSqliteStatement(`SELECT id,val FROM ${tableName} ORDER BY id`, (stmt) => {\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n rows.push({ id: stmt.getValue(0).getInteger(), val: stmt.getValue(1).getString() });\r\n });\r\n return rows;\r\n };\r\n\r\n it(\"should apply a changeset containing data changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-1.changeset\");\r\n\r\n // create the source db (with the table already present - raw sqlite changesets cannot capture DDL),\r\n // then capture a changeset that inserts some rows\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n source.startChangeTracking();\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'val1')`);\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'val2')`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n // apply the changeset (raw sqlite changesets have no header to validate) to a db with the same schema\r\n const target = new SQLiteDb();\r\n target.createDb(targetFileName, undefined, { rawSQLite: true });\r\n target.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n target.saveChanges();\r\n target.applyChangeset(changesetFileName);\r\n target.saveChanges();\r\n\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"val1\" }, { id: 2, val: \"val2\" }]);\r\n\r\n source.closeDb();\r\n target.closeDb();\r\n });\r\n\r\n it(\"should throw when creating a changeset containing DDL/schema changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl-source.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl.changeset\");\r\n\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeDdl(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n\r\n // raw sqlite changesets cannot represent DDL/schema changes\r\n expect(() => source.createChangeset(changesetFileName)).throws();\r\n\r\n source.closeDb();\r\n });\r\n\r\n it(\"should fail if applying a changeset produces a conflict, leaving it to the caller to abandon the partially-applied changes\", () => {\r\n const baseFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-base.db\");\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-2.changeset\");\r\n\r\n // create a common base db with two rows, then clone it so source and target start out identical\r\n const base = new SQLiteDb();\r\n base.createDb(baseFileName, undefined, { rawSQLite: true });\r\n base.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'base1')`);\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'base2')`);\r\n base.saveChanges();\r\n base.closeDb();\r\n\r\n IModelJsFs.copySync(baseFileName, sourceFileName);\r\n IModelJsFs.copySync(baseFileName, targetFileName);\r\n\r\n // diverge source: update both rows and capture that as a single changeset. Only the second row will\r\n // conflict with target's divergence below - the first row's change would apply cleanly on its own.\r\n const source = new SQLiteDb();\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeSQL(`UPDATE test1 SET val='fromSource1' WHERE id=1`);\r\n source.executeSQL(`UPDATE test1 SET val='fromSource2' WHERE id=2`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n source.closeDb();\r\n\r\n // diverge target independently - only on the second row - so applying source's changeset conflicts partway through\r\n const target = new SQLiteDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n target.executeSQL(`UPDATE test1 SET val='fromTarget2' WHERE id=2`);\r\n target.saveChanges();\r\n\r\n // confirm the pre-apply baseline: id=1 was never touched by target, id=2 diverged from source\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // applyChangeset only throws on failure - it does not commit or abandon changes itself. Since the first\r\n // row's change didn't conflict, it may already have been applied to the current transaction by the time\r\n // the second row's conflict causes the throw.\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"fromSource1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // it is the caller's responsibility to abandon (or save) the partially-applied changes after catching the error\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n expect(() => target.applyChangeset(changesetFileName, applyFlags.None, policy.AbortOnAnyConflict)).throws();\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n target.closeDb();\r\n });\r\n\r\n const withChangeset = (name: string, sourceSql: string[], targetSql: string[], test: (target: SQLiteDb, changesetFile: string, targetFile: string) => void) => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `${name}-source.db`);\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `${name}-target.db`);\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `${name}.changeset`);\r\n const source = new SQLiteDb();\r\n const target = new SQLiteDb();\r\n try {\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT NOT NULL UNIQUE)\");\r\n source.executeSQL(\"INSERT INTO test1 VALUES (1,'base1'),(2,'base2')\");\r\n source.saveChanges();\r\n source.closeDb();\r\n IModelJsFs.copySync(sourceFileName, targetFileName);\r\n\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n for (const sql of sourceSql)\r\n source.executeSQL(sql);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n for (const sql of targetSql)\r\n target.executeSQL(sql);\r\n target.saveChanges();\r\n test(target, changesetFileName, targetFileName);\r\n } finally {\r\n if (source.isOpen)\r\n source.closeDb();\r\n if (target.isOpen)\r\n target.closeDb();\r\n }\r\n };\r\n\r\n const conflictCases = [\r\n {\r\n name: \"replace primary-key insert conflicts\",\r\n sourceSql: \"INSERT INTO test1 VALUES (3,'incoming')\",\r\n targetSql: \"INSERT INTO test1 VALUES (3,'existing')\",\r\n expected: [{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }, { id: 3, val: \"incoming\" }],\r\n },\r\n {\r\n name: \"skip deletes of missing rows\",\r\n sourceSql: \"DELETE FROM test1 WHERE id=1\",\r\n targetSql: \"DELETE FROM test1 WHERE id=1\",\r\n expected: [{ id: 2, val: \"base2\" }],\r\n },\r\n {\r\n name: \"skip updates of missing rows\",\r\n sourceSql: \"UPDATE test1 SET val='incoming' WHERE id=1\",\r\n targetSql: \"DELETE FROM test1 WHERE id=1\",\r\n expected: [{ id: 2, val: \"base2\" }],\r\n },\r\n {\r\n name: \"replace conflicting update values\",\r\n sourceSql: \"UPDATE test1 SET val='incoming' WHERE id=1\",\r\n targetSql: \"UPDATE test1 SET val='existing' WHERE id=1\",\r\n expected: [{ id: 1, val: \"incoming\" }, { id: 2, val: \"base2\" }],\r\n },\r\n {\r\n name: \"apply deletes despite conflicting before-values\",\r\n sourceSql: \"DELETE FROM test1 WHERE id=1\",\r\n targetSql: \"UPDATE test1 SET val='existing' WHERE id=1\",\r\n expected: [{ id: 2, val: \"base2\" }],\r\n },\r\n {\r\n name: \"skip incoming changes that violate unique constraints\",\r\n sourceSql: \"INSERT INTO test1 VALUES (3,'incoming')\",\r\n targetSql: \"UPDATE test1 SET val='incoming' WHERE id=2\",\r\n expected: [{ id: 1, val: \"base1\" }, { id: 2, val: \"incoming\" }],\r\n },\r\n ];\r\n\r\n for (const [index, testCase] of conflictCases.entries()) {\r\n it(`should ${testCase.name} with the no-local-changes policy`, () => {\r\n withChangeset(`no-local-changes-${index}`, [testCase.sourceSql], [testCase.targetSql], (target, changesetFileName, targetFileName) => {\r\n const beforeApply = readRows(target, \"test1\");\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal(beforeApply);\r\n\r\n target.applyChangeset(changesetFileName, applyFlags.None, policy.NoLocalChanges);\r\n expect(readRows(target, \"test1\")).deep.equal(testCase.expected);\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal(beforeApply);\r\n target.applyChangeset(changesetFileName, applyFlags.None, policy.NoLocalChanges);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"test1\")).deep.equal(testCase.expected);\r\n });\r\n });\r\n }\r\n\r\n it(\"should combine Invert and IgnoreNoop without invoking a conflict handler for no-op deletes\", () => {\r\n withChangeset(\"invert-ignore-noop\", [\"INSERT INTO test1 VALUES (3,'incoming')\"], [\"INSERT INTO test1 VALUES (3,'incoming')\"], (target, file) => {\r\n target.applyChangeset(file, applyFlags.Invert);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }]);\r\n target.applyChangeset(file, applyFlags.Invert | applyFlags.IgnoreNoop, () => {\r\n throw new Error(\"No-op delete should not invoke the conflict handler\");\r\n });\r\n target.applyChangeset(file);\r\n target.applyChangeset(file, applyFlags.IgnoreNoop, () => {\r\n throw new Error(\"No-op insert should not invoke the conflict handler\");\r\n });\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }, { id: 3, val: \"incoming\" }]);\r\n });\r\n });\r\n\r\n for (const insert of [false, true]) {\r\n it(`should replace indirect ${insert ? \"insert conflicts with a warning\" : \"update conflicts without warnings\"} with the no-local-changes policy`, () => {\r\n const indirectSql = insert ? \"INSERT INTO test1 VALUES (3,'incoming')\" : \"UPDATE test1 SET val='incoming' WHERE id=2\";\r\n const targetSql = insert ? \"INSERT INTO test1 VALUES (3,'existing')\" : \"UPDATE test1 SET val='existing' WHERE id=2\";\r\n withChangeset(`indirect-${insert ? \"insert\" : \"update\"}`, [\r\n `CREATE TRIGGER indirect_change AFTER UPDATE ON test1 WHEN NEW.id=1 BEGIN ${indirectSql}; END`,\r\n \"UPDATE test1 SET val='direct' WHERE id=1\",\r\n ], [targetSql], (target, file, targetFile) => {\r\n const conflicts: SQLiteDb.ChangesetConflictArgs[] = [];\r\n target.applyChangeset(file, applyFlags.None, (args) => {\r\n conflicts.push(args);\r\n return DbConflictResolution.Replace;\r\n });\r\n expect(conflicts).lengthOf(1);\r\n expect(conflicts[0]).include({ cause: insert ? DbConflictCause.Conflict : DbConflictCause.Data, indirect: true });\r\n target.abandonChanges();\r\n\r\n const sandbox = sinon.createSandbox();\r\n const category = \"BeSQLite\";\r\n const levels = { ...Logger.categoryFilter, [category]: LogLevel.Warning };\r\n sandbox.stub(Logger, \"categoryFilter\").get(() => levels);\r\n const logWarning = sandbox.spy(Logger, \"logWarning\");\r\n Logger.onLogLevelChanged.raiseEvent();\r\n try {\r\n target.applyChangeset(file, applyFlags.None, policy.NoLocalChanges);\r\n expect(logWarning.calledWith(category)).equal(insert);\r\n } finally {\r\n sandbox.restore();\r\n Logger.onLogLevelChanged.raiseEvent();\r\n }\r\n const expected = insert\r\n ? [{ id: 1, val: \"direct\" }, { id: 2, val: \"base2\" }, { id: 3, val: \"incoming\" }]\r\n : [{ id: 1, val: \"direct\" }, { id: 2, val: \"incoming\" }];\r\n expect(readRows(target, \"test1\")).deep.equal(expected);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"test1\")).deep.equal(expected);\r\n });\r\n });\r\n }\r\n\r\n it(\"should expose NoUpdateLoop independently of conflict policy\", () => {\r\n withChangeset(\"no-update-loop\", [\r\n \"UPDATE test1 SET val='temp' WHERE id=1\",\r\n \"UPDATE test1 SET val='base1' WHERE id=2\",\r\n \"UPDATE test1 SET val='base2' WHERE id=1\",\r\n ], [], (target, file) => {\r\n target.applyChangeset(file);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base2\" }, { id: 2, val: \"base1\" }]);\r\n target.abandonChanges();\r\n expect(() => target.applyChangeset(file, applyFlags.NoUpdateLoop)).throws();\r\n target.abandonChanges();\r\n target.applyChangeset(file, applyFlags.NoUpdateLoop, policy.NoLocalChanges);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }]);\r\n });\r\n });\r\n\r\n it(\"should let a custom handler skip a conflicting insert and retain its copied arguments\", () => {\r\n withChangeset(\"custom-conflict\", [\"INSERT INTO test1 VALUES (3,'incoming')\"], [\"INSERT INTO test1 VALUES (3,'existing')\"], (target, file) => {\r\n const conflicts: SQLiteDb.ChangesetConflictArgs[] = [];\r\n target.applyChangeset(file, applyFlags.None, (args) => {\r\n conflicts.push(args);\r\n return DbConflictResolution.Skip;\r\n });\r\n expect(conflicts).deep.equal([{\r\n cause: DbConflictCause.Conflict,\r\n opcode: DbOpcode.Insert,\r\n indirect: false,\r\n tableName: \"test1\",\r\n columnCount: 2,\r\n primaryKeyColumns: [0],\r\n }]);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }, { id: 3, val: \"existing\" }]);\r\n });\r\n });\r\n\r\n it(\"should honor custom Replace and Abort resolutions and propagate callback exceptions\", () => {\r\n withChangeset(\"custom-resolution\", [\"UPDATE test1 SET val='incoming' WHERE id=1\"], [\"UPDATE test1 SET val='existing' WHERE id=1\"], (target, file) => {\r\n target.applyChangeset(file, applyFlags.None, (args) => {\r\n expect(args.cause).equal(DbConflictCause.Data);\r\n expect(args).deep.equal({\r\n cause: DbConflictCause.Data,\r\n opcode: DbOpcode.Update,\r\n indirect: false,\r\n tableName: \"test1\",\r\n columnCount: 2,\r\n primaryKeyColumns: [0],\r\n });\r\n return DbConflictResolution.Replace;\r\n });\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"incoming\" });\r\n target.abandonChanges();\r\n\r\n expect(() => target.applyChangeset(file, applyFlags.None, () => DbConflictResolution.Abort)).throws();\r\n target.abandonChanges();\r\n const error = new Error(\"custom conflict failure\");\r\n expect(() => target.applyChangeset(file, applyFlags.None, () => { throw error; })).throws(error);\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"existing\" });\r\n target.applyChangeset(file, applyFlags.None, () => DbConflictResolution.Replace);\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"incoming\" });\r\n });\r\n });\r\n\r\n it(\"should reject invalid flags, policies, and custom resolutions\", () => {\r\n withChangeset(\"invalid-apply-options\", [\"INSERT INTO test1 VALUES (3,'incoming')\"], [\"INSERT INTO test1 VALUES (3,'existing')\"], (target, file) => {\r\n const applyChangeset = target.applyChangeset.bind(target);\r\n for (const flags of [-1, 16, 0.5, Number.NaN, Number.POSITIVE_INFINITY, true])\r\n expect(() => Reflect.apply(applyChangeset, undefined, [file, flags])).throws(TypeError);\r\n expect(() => Reflect.apply(applyChangeset, undefined, [file, applyFlags.None, 2])).throws(TypeError);\r\n for (const resolution of [undefined, -1, 3, 0.5, Number.NaN, Promise.resolve(DbConflictResolution.Skip)]) {\r\n expect(() => Reflect.apply(applyChangeset, undefined, [file, applyFlags.None, (): unknown => resolution])).throws(TypeError);\r\n target.abandonChanges();\r\n }\r\n });\r\n });\r\n\r\n it(\"should reject reentrant lifecycle and transaction changes while allowing conflict queries\", () => {\r\n withChangeset(\"reentrant-apply\", [\"UPDATE test1 SET val='incoming' WHERE id=1\"], [\"UPDATE test1 SET val='existing' WHERE id=1\"], (target, file, targetFile) => {\r\n const nativeDb = target[_nativeDb];\r\n const operations = [\r\n () => target.saveChanges(),\r\n () => target.abandonChanges(),\r\n () => nativeDb.restartDefaultTxn(),\r\n () => target.closeDb(),\r\n () => nativeDb.dispose(),\r\n () => target.openDb(targetFile, OpenMode.ReadWrite),\r\n () => target.createDb(targetFile),\r\n () => target.applyChangeset(file),\r\n () => target.vacuum(),\r\n () => nativeDb.analyze(),\r\n () => nativeDb.enableWalMode(),\r\n () => nativeDb.performCheckpoint(),\r\n () => nativeDb.setAutoCheckpointThreshold(100),\r\n () => target.executeDdl(\"DROP TABLE test1\"),\r\n () => target.startChangeTracking(),\r\n () => target.createChangeset(file),\r\n () => nativeDb.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"value\"),\r\n ];\r\n let calls = 0;\r\n target.applyChangeset(file, applyFlags.None, () => {\r\n ++calls;\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"existing\" });\r\n for (const operation of operations)\r\n expect(operation).throws(\"cannot modify or close database while applying a changeset\");\r\n expect(target.isOpen).true;\r\n return DbConflictResolution.Replace;\r\n });\r\n expect(calls).equal(1);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"incoming\" });\r\n });\r\n });\r\n\r\n it(\"should release the apply guard after a reentrant operation aborts the callback\", () => {\r\n withChangeset(\"reentrant-apply-failure\", [\r\n \"UPDATE test1 SET val='incoming1' WHERE id=1\",\r\n \"UPDATE test1 SET val='incoming2' WHERE id=2\",\r\n ], [\"UPDATE test1 SET val='existing' WHERE id=2\"], (target, file) => {\r\n expect(() => target.applyChangeset(file, applyFlags.None, () => {\r\n target.saveChanges();\r\n return DbConflictResolution.Replace;\r\n })).throws(\"cannot modify or close database while applying a changeset\");\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"incoming1\" }, { id: 2, val: \"existing\" }]);\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"existing\" }]);\r\n target.applyChangeset(file, applyFlags.None, () => DbConflictResolution.Replace);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"incoming1\" }, { id: 2, val: \"incoming2\" }]);\r\n });\r\n });\r\n\r\n for (const testCase of [conflictCases[1], conflictCases[5]]) {\r\n it(`should reject Replace when the handler must ${testCase.name}`, () => {\r\n withChangeset(`invalid-replace-${testCase.name}`, [testCase.sourceSql], [testCase.targetSql], (target, file) => {\r\n const beforeApply = readRows(target, \"test1\");\r\n expect(() => target.applyChangeset(file, applyFlags.None, () => DbConflictResolution.Replace))\r\n .throws(TypeError, \"Replace is valid only for data and primary-key insert conflicts\");\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal(beforeApply);\r\n });\r\n });\r\n }\r\n\r\n const withCascadeChangeset = (name: string, test: (target: SQLiteDb, file: string, targetFile: string) => void) => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `cascade-${name}-source.db`);\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `cascade-${name}-target.db`);\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `cascade-${name}.changeset`);\r\n const source = new SQLiteDb();\r\n const target = new SQLiteDb();\r\n try {\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE parent(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.executeSQL(\"CREATE TABLE child(id INTEGER PRIMARY KEY,val TEXT,parentId INTEGER REFERENCES parent(id) ON DELETE CASCADE)\");\r\n source.executeSQL(\"INSERT INTO parent VALUES (1,'slab')\");\r\n source.executeSQL(\"INSERT INTO child VALUES (1,'child1',1),(2,'child2',1)\");\r\n source.saveChanges();\r\n source.closeDb();\r\n IModelJsFs.copySync(sourceFileName, targetFileName);\r\n\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeSQL(\"DELETE FROM parent WHERE id=1\");\r\n expect(readRows(source, \"parent\")).deep.equal([]);\r\n expect(readRows(source, \"child\")).deep.equal([]);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n test(target, changesetFileName, targetFileName);\r\n } finally {\r\n if (source.isOpen)\r\n source.closeDb();\r\n if (target.isOpen)\r\n target.closeDb();\r\n }\r\n };\r\n\r\n it(\"should apply a captured parent cascade with FkNoAction and preserve unrelated families\", () => {\r\n withCascadeChangeset(\"unrelated-family\", (target, file, targetFile) => {\r\n target.executeSQL(\"INSERT INTO parent VALUES (2,'other')\");\r\n target.executeSQL(\"INSERT INTO child VALUES (3,'other child',2)\");\r\n target.saveChanges();\r\n\r\n target.applyChangeset(file, applyFlags.FkNoAction);\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 2, val: \"other\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 3, val: \"other child\" }]);\r\n target.abandonChanges();\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 1, val: \"slab\" }, { id: 2, val: \"other\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 1, val: \"child1\" }, { id: 2, val: \"child2\" }, { id: 3, val: \"other child\" }]);\r\n\r\n target.applyChangeset(file, applyFlags.FkNoAction);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 2, val: \"other\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 3, val: \"other child\" }]);\r\n });\r\n });\r\n\r\n it(\"should apply a captured parent cascade with foreign-key actions enabled\", () => {\r\n withCascadeChangeset(\"actions-enabled\", (target, file, targetFile) => {\r\n target.applyChangeset(file, applyFlags.None, policy.NoLocalChanges);\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n });\r\n });\r\n\r\n it(\"should replace conflicting indirect child deletes from a captured parent cascade\", () => {\r\n withCascadeChangeset(\"changed-child\", (target, file, targetFile) => {\r\n target.executeSQL(\"UPDATE child SET val='changed child' WHERE id=1\");\r\n target.saveChanges();\r\n expect(() => target.applyChangeset(file, applyFlags.FkNoAction)).throws();\r\n target.abandonChanges();\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 1, val: \"slab\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 1, val: \"changed child\" }, { id: 2, val: \"child2\" }]);\r\n\r\n const conflicts: SQLiteDb.ChangesetConflictArgs[] = [];\r\n target.applyChangeset(file, applyFlags.FkNoAction, (args) => {\r\n conflicts.push(args);\r\n return DbConflictResolution.Replace;\r\n });\r\n expect(conflicts).deep.equal([{\r\n cause: DbConflictCause.Data,\r\n opcode: DbOpcode.Delete,\r\n indirect: true,\r\n tableName: \"child\",\r\n columnCount: 3,\r\n primaryKeyColumns: [0],\r\n }]);\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n target.abandonChanges();\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 1, val: \"changed child\" }, { id: 2, val: \"child2\" }]);\r\n\r\n target.applyChangeset(file, applyFlags.FkNoAction, policy.NoLocalChanges);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n });\r\n });\r\n\r\n for (const extraChild of [false, true]) {\r\n it(`should ${extraChild ? \"reject orphaned children instead of cascading\" : \"apply parent and cascaded child deletions\"} with FkNoAction and the no-local-changes policy`, () => {\r\n withCascadeChangeset(extraChild ? \"orphan\" : \"complete\", (target, changesetFileName, targetFileName) => {\r\n if (extraChild) {\r\n target.executeSQL(\"INSERT INTO child VALUES (3,'extra child',1)\");\r\n target.saveChanges();\r\n expect(() => target.applyChangeset(changesetFileName, applyFlags.FkNoAction, policy.NoLocalChanges)).throws();\r\n target.abandonChanges();\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 1, val: \"slab\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 1, val: \"child1\" }, { id: 2, val: \"child2\" }, { id: 3, val: \"extra child\" }]);\r\n const conflicts: SQLiteDb.ChangesetConflictArgs[] = [];\r\n expect(() => target.applyChangeset(changesetFileName, applyFlags.FkNoAction, (args) => {\r\n conflicts.push(args);\r\n return args.cause === DbConflictCause.ForeignKey ? DbConflictResolution.Abort : DbConflictResolution.Skip;\r\n })).throws();\r\n expect(conflicts).deep.equal([{ cause: DbConflictCause.ForeignKey, foreignKeyConflicts: 1 }]);\r\n target.abandonChanges();\r\n expect(() => target.applyChangeset(changesetFileName, applyFlags.FkNoAction, () => DbConflictResolution.Replace))\r\n .throws(TypeError, \"Replace is valid only for data and primary-key insert conflicts\");\r\n target.abandonChanges();\r\n target.applyChangeset(changesetFileName, applyFlags.None, policy.NoLocalChanges);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n } else {\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n target.abandonChanges();\r\n target.applyChangeset(changesetFileName, applyFlags.FkNoAction, policy.NoLocalChanges);\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n }\r\n });\r\n });\r\n }\r\n });\r\n\r\n});\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-backend",
|
|
3
|
-
"version": "5.16.0-dev.
|
|
3
|
+
"version": "5.16.0-dev.7",
|
|
4
4
|
"description": "iTwin.js backend components",
|
|
5
5
|
"main": "lib/cjs/core-backend.js",
|
|
6
6
|
"module": "lib/esm/core-backend.js",
|
|
7
7
|
"typings": "lib/cjs/core-backend",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"engines": {
|
|
10
|
-
"node": "^20.0.0 || ^22.0.0 || ^24.0.0"
|
|
10
|
+
"node": "^20.0.0 || ^22.0.0 || ^24.0.0 || ^26.0.0"
|
|
11
11
|
},
|
|
12
12
|
"repository": {
|
|
13
13
|
"type": "git",
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
},
|
|
28
28
|
"peerDependencies": {
|
|
29
29
|
"@opentelemetry/api": "^1.0.4",
|
|
30
|
-
"@itwin/core-
|
|
31
|
-
"@itwin/core-
|
|
32
|
-
"@itwin/core-geometry": "5.16.0-dev.
|
|
33
|
-
"@itwin/ecschema-metadata": "5.16.0-dev.
|
|
34
|
-
"@itwin/core-quantity": "5.16.0-dev.
|
|
30
|
+
"@itwin/core-bentley": "5.16.0-dev.7",
|
|
31
|
+
"@itwin/core-common": "5.16.0-dev.7",
|
|
32
|
+
"@itwin/core-geometry": "5.16.0-dev.7",
|
|
33
|
+
"@itwin/ecschema-metadata": "5.16.0-dev.7",
|
|
34
|
+
"@itwin/core-quantity": "5.16.0-dev.7"
|
|
35
35
|
},
|
|
36
36
|
"peerDependenciesMeta": {
|
|
37
37
|
"@opentelemetry/api": {
|
|
@@ -72,18 +72,18 @@
|
|
|
72
72
|
"marked": "^14.1.3",
|
|
73
73
|
"sql-formatter": "^15.4.6",
|
|
74
74
|
"vite": "^6.4.4",
|
|
75
|
-
"@itwin/build-tools": "5.16.0-dev.
|
|
76
|
-
"@itwin/core-
|
|
77
|
-
"@itwin/core-
|
|
78
|
-
"@itwin/core-quantity": "5.16.0-dev.
|
|
79
|
-
"@itwin/core-geometry": "5.16.0-dev.
|
|
80
|
-
"@itwin/ecschema-
|
|
81
|
-
"@itwin/
|
|
82
|
-
"
|
|
83
|
-
"
|
|
75
|
+
"@itwin/build-tools": "5.16.0-dev.7",
|
|
76
|
+
"@itwin/core-bentley": "5.16.0-dev.7",
|
|
77
|
+
"@itwin/core-common": "5.16.0-dev.7",
|
|
78
|
+
"@itwin/core-quantity": "5.16.0-dev.7",
|
|
79
|
+
"@itwin/core-geometry": "5.16.0-dev.7",
|
|
80
|
+
"@itwin/ecschema-locaters": "5.16.0-dev.7",
|
|
81
|
+
"@itwin/ecschema-metadata": "5.16.0-dev.7",
|
|
82
|
+
"@itwin/ecsql-common": "5.16.0-dev.7",
|
|
83
|
+
"internal-tools": "3.0.0-dev.69"
|
|
84
84
|
},
|
|
85
85
|
"dependencies": {
|
|
86
|
-
"@bentley/imodeljs-native": "5.16.
|
|
86
|
+
"@bentley/imodeljs-native": "5.16.16",
|
|
87
87
|
"@itwin/object-storage-azure": "^3.0.4",
|
|
88
88
|
"@azure/storage-blob": "^12.28.0",
|
|
89
89
|
"form-data": "^4.0.6",
|