@itwin/core-backend 5.14.0-dev.1 → 5.14.0-dev.11
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 +31 -1
- package/lib/cjs/BriefcaseManager.d.ts +6 -0
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +12 -6
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/ChangesetReader.d.ts.map +1 -1
- package/lib/cjs/ChangesetReader.js +1 -0
- package/lib/cjs/ChangesetReader.js.map +1 -1
- package/lib/cjs/ChangesetReaderTypes.d.ts +2 -1
- package/lib/cjs/ChangesetReaderTypes.d.ts.map +1 -1
- package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js +9 -2
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +1 -0
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/Element.d.ts +1 -1
- package/lib/cjs/Element.js +1 -1
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/Entity.d.ts +3 -3
- package/lib/cjs/Entity.js +3 -3
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +83 -35
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +196 -89
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +51 -17
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/SchemaSync.d.ts +126 -18
- package/lib/cjs/SchemaSync.d.ts.map +1 -1
- package/lib/cjs/SchemaSync.js +303 -81
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.d.ts +16 -8
- package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js +11 -1
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SynchronousChannel.d.ts +11 -1
- package/lib/cjs/SynchronousChannel.d.ts.map +1 -1
- package/lib/cjs/SynchronousChannel.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +16 -13
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.d.ts +57 -0
- package/lib/cjs/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/SchemaSyncReservations.d.ts.map +1 -1
- package/lib/cjs/internal/SchemaSyncReservations.js +13 -3
- package/lib/cjs/internal/SchemaSyncReservations.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +6 -0
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +12 -6
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/ChangesetReader.d.ts.map +1 -1
- package/lib/esm/ChangesetReader.js +1 -0
- package/lib/esm/ChangesetReader.js.map +1 -1
- package/lib/esm/ChangesetReaderTypes.d.ts +2 -1
- package/lib/esm/ChangesetReaderTypes.d.ts.map +1 -1
- package/lib/esm/ChangesetReaderTypes.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js +10 -3
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +1 -0
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/Element.d.ts +1 -1
- package/lib/esm/Element.js +1 -1
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/Entity.d.ts +3 -3
- package/lib/esm/Entity.js +3 -3
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +83 -35
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +196 -89
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js +52 -18
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/SchemaSync.d.ts +126 -18
- package/lib/esm/SchemaSync.d.ts.map +1 -1
- package/lib/esm/SchemaSync.js +304 -82
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.d.ts +16 -8
- package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/esm/SqliteChangesetReader.js +11 -1
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/SynchronousChannel.d.ts +11 -1
- package/lib/esm/SynchronousChannel.d.ts.map +1 -1
- package/lib/esm/SynchronousChannel.js.map +1 -1
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +17 -14
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.d.ts +57 -0
- package/lib/esm/internal/IntegrityCheck.d.ts.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/SchemaSyncReservations.d.ts.map +1 -1
- package/lib/esm/internal/SchemaSyncReservations.js +13 -3
- package/lib/esm/internal/SchemaSyncReservations.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js +65 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +3 -1
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +218 -28
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebaseTestUtils.d.ts +3 -0
- package/lib/esm/test/hubaccess/SemanticRebaseTestUtils.d.ts.map +1 -0
- package/lib/esm/test/hubaccess/SemanticRebaseTestUtils.js +15 -0
- package/lib/esm/test/hubaccess/SemanticRebaseTestUtils.js.map +1 -0
- package/lib/esm/test/standalone/ChangesetReader.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 +116 -0
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaSyncDb.test.js +5 -25
- package/lib/esm/test/standalone/SchemaSyncDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js +1 -0
- package/lib/esm/test/standalone/SchemaSyncElementReservation.test.js.map +1 -1
- package/package.json +14 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLiteDb.test.d.ts","sourceRoot":"","sources":["../../../../src/test/standalone/SQLiteDb.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SQLiteDb.test.d.ts","sourceRoot":"","sources":["../../../../src/test/standalone/SQLiteDb.test.ts"],"names":[],"mappings":"AAYA,OAAO,cAAc,CAAC"}
|
|
@@ -2,11 +2,65 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
6
|
+
if (value !== null && value !== void 0) {
|
|
7
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
8
|
+
var dispose, inner;
|
|
9
|
+
if (async) {
|
|
10
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.asyncDispose];
|
|
12
|
+
}
|
|
13
|
+
if (dispose === void 0) {
|
|
14
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
15
|
+
dispose = value[Symbol.dispose];
|
|
16
|
+
if (async) inner = dispose;
|
|
17
|
+
}
|
|
18
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
19
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
20
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
21
|
+
}
|
|
22
|
+
else if (async) {
|
|
23
|
+
env.stack.push({ async: true });
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
};
|
|
27
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
28
|
+
return function (env) {
|
|
29
|
+
function fail(e) {
|
|
30
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
31
|
+
env.hasError = true;
|
|
32
|
+
}
|
|
33
|
+
var r, s = 0;
|
|
34
|
+
function next() {
|
|
35
|
+
while (r = env.stack.pop()) {
|
|
36
|
+
try {
|
|
37
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
38
|
+
if (r.dispose) {
|
|
39
|
+
var result = r.dispose.call(r.value);
|
|
40
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
41
|
+
}
|
|
42
|
+
else s |= 1;
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
fail(e);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
49
|
+
if (env.hasError) throw env.error;
|
|
50
|
+
}
|
|
51
|
+
return next();
|
|
52
|
+
};
|
|
53
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
54
|
+
var e = new Error(message);
|
|
55
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
56
|
+
});
|
|
5
57
|
import { expect } from "chai";
|
|
6
58
|
import { BeDuration, DbResult, OpenMode } from "@itwin/core-bentley";
|
|
7
59
|
import { IModelJsFs } from "../../IModelJsFs";
|
|
8
60
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
61
|
+
import { SnapshotDb } from "../../IModelDb";
|
|
9
62
|
import { SQLiteDb } from "../../SQLiteDb";
|
|
63
|
+
import { SqliteChangesetReader } from "../../SqliteChangesetReader";
|
|
10
64
|
import "../TestUtils"; // registers the global mocha before/after hooks that start/stop the backend
|
|
11
65
|
describe("SQLiteDb", () => {
|
|
12
66
|
it("should create new SQLiteDb", async () => {
|
|
@@ -61,6 +115,68 @@ describe("SQLiteDb", () => {
|
|
|
61
115
|
});
|
|
62
116
|
});
|
|
63
117
|
});
|
|
118
|
+
it("supports reading an iModel changeset with SQLiteDb", () => {
|
|
119
|
+
const iModelFileName = IModelTestUtils.resolveAssetFile("_mocks_/ReadOnlyTest/ReadOnlyTest.bim");
|
|
120
|
+
const changesetFileName = IModelTestUtils.resolveAssetFile("_mocks_/ReadOnlyTest/csets/dbe4b3824129f99e4eb485fb7cd9d2fea2354be1.cs");
|
|
121
|
+
const iModel = SnapshotDb.openFile(iModelFileName);
|
|
122
|
+
let tableName;
|
|
123
|
+
let columnNames;
|
|
124
|
+
let expectedValues;
|
|
125
|
+
let stage;
|
|
126
|
+
try {
|
|
127
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
128
|
+
try {
|
|
129
|
+
const schemaReader = __addDisposableResource(env_1, SqliteChangesetReader.openFile({ fileName: changesetFileName, db: iModel }), false);
|
|
130
|
+
expect(schemaReader.step()).true;
|
|
131
|
+
tableName = schemaReader.tableName;
|
|
132
|
+
columnNames = schemaReader.getColumnNames(tableName);
|
|
133
|
+
stage = schemaReader.op === "Deleted" ? "Old" : "New";
|
|
134
|
+
expectedValues = schemaReader.getChangeValuesObject(stage, { includeNullColumns: true });
|
|
135
|
+
}
|
|
136
|
+
catch (e_1) {
|
|
137
|
+
env_1.error = e_1;
|
|
138
|
+
env_1.hasError = true;
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
__disposeResources(env_1);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
iModel.close();
|
|
146
|
+
}
|
|
147
|
+
const dbFileName = IModelTestUtils.prepareOutputFile("SQLiteDb", "changeset-reader.db");
|
|
148
|
+
const db = new SQLiteDb();
|
|
149
|
+
db.createDb(dbFileName, undefined, { rawSQLite: true });
|
|
150
|
+
const declaredColumns = columnNames.slice(0, -1);
|
|
151
|
+
try {
|
|
152
|
+
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
153
|
+
try {
|
|
154
|
+
const missingTableReader = __addDisposableResource(env_2, SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true }), false);
|
|
155
|
+
expect(missingTableReader.step()).true;
|
|
156
|
+
expect(() => missingTableReader.getChangeValuesObject(stage)).throws(`changeset table ${tableName} does not exist`);
|
|
157
|
+
db.executeSQL(`CREATE TABLE "${tableName}" (${declaredColumns.map((name) => `"${name}"`).join(",")})`);
|
|
158
|
+
const checkedReader = __addDisposableResource(env_2, SqliteChangesetReader.openFile({ fileName: changesetFileName, db }), false);
|
|
159
|
+
expect(checkedReader.step()).true;
|
|
160
|
+
expect(() => checkedReader.getChangeValuesObject(stage)).throws("columns count does not match");
|
|
161
|
+
const uncheckedReader = __addDisposableResource(env_2, SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true }), false);
|
|
162
|
+
expect(uncheckedReader.step()).true;
|
|
163
|
+
const values = uncheckedReader.getChangeValuesObject(stage, { includeNullColumns: true });
|
|
164
|
+
const expectedDeclaredValues = Object.fromEntries(declaredColumns.map((name) => [name, expectedValues[name]]));
|
|
165
|
+
expect(values).deep.equal(expectedDeclaredValues);
|
|
166
|
+
}
|
|
167
|
+
catch (e_2) {
|
|
168
|
+
env_2.error = e_2;
|
|
169
|
+
env_2.hasError = true;
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
__disposeResources(env_2);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
db.closeDb();
|
|
177
|
+
}
|
|
178
|
+
expect(() => SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true })).throws("db must be open");
|
|
179
|
+
});
|
|
64
180
|
describe("applyChangeset", () => {
|
|
65
181
|
const readRows = (db, tableName) => {
|
|
66
182
|
const rows = [];
|
|
@@ -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 { SQLiteDb } from \"../../SQLiteDb\";\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 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 { 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"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
|
-
import {
|
|
5
|
+
import { Guid, Id64, OpenMode } from "@itwin/core-bentley";
|
|
6
6
|
import { BriefcaseIdValue, Code, ElementReservationError } from "@itwin/core-common";
|
|
7
7
|
import { expect } from "chai";
|
|
8
8
|
import { IModelJsFs, SchemaSync } from "../../core-backend";
|
|
@@ -33,12 +33,7 @@ describe("SchemaSyncDb", () => {
|
|
|
33
33
|
schemaDb.closeDb();
|
|
34
34
|
IModelJsFs.removeSync(schemaDbFileName);
|
|
35
35
|
});
|
|
36
|
-
|
|
37
|
-
function simulatePreviousDbSchema() {
|
|
38
|
-
let res = schemaDb.executeSQL("DROP TABLE reserved_elements");
|
|
39
|
-
expect(res).to.equal(DbResult.BE_SQLITE_DONE);
|
|
40
|
-
res = schemaDb.executeSQL("DELETE FROM be_Prop WHERE namespace='schemasync'");
|
|
41
|
-
expect(res).to.equal(DbResult.BE_SQLITE_DONE);
|
|
36
|
+
function simulateVersion4Db() {
|
|
42
37
|
schemaDb.setRequiredVersions({ readVersion: "^4.0.0", writeVersion: "^4.0.0" });
|
|
43
38
|
schemaDb.saveChanges();
|
|
44
39
|
}
|
|
@@ -74,25 +69,10 @@ describe("SchemaSyncDb", () => {
|
|
|
74
69
|
const elementIdCol = cols.find((c) => c.name === "elementId");
|
|
75
70
|
expect(elementIdCol.notnull).to.equal(1);
|
|
76
71
|
});
|
|
77
|
-
it("
|
|
78
|
-
|
|
72
|
+
it("refuses a database from the previous major version", () => {
|
|
73
|
+
simulateVersion4Db();
|
|
79
74
|
schemaDb.closeDb();
|
|
80
|
-
schemaDb.openDb(schemaDbFileName, OpenMode.ReadWrite);
|
|
81
|
-
expect(getTableInfo("reserved_elements")).to.be.empty;
|
|
82
|
-
expect(readNextLocalId()).to.equal(1);
|
|
83
|
-
let version = schemaDb.getRequiredVersions();
|
|
84
|
-
expect(version.readVersion).to.equal("^4.0.0");
|
|
85
|
-
expect(version.writeVersion).to.equal("^4.0.0");
|
|
86
|
-
await schemaDb.reserveElements([{
|
|
87
|
-
federationGuid: Guid.createValue(),
|
|
88
|
-
ecClassId: "0x1",
|
|
89
|
-
code: Code.fromJSON({ spec: "0x1", scope: "0x2", value: "foo" })
|
|
90
|
-
}]);
|
|
91
|
-
expect(getTableInfo("reserved_elements")).to.not.be.empty;
|
|
92
|
-
expect(readNextLocalId()).to.equal(2);
|
|
93
|
-
version = schemaDb.getRequiredVersions();
|
|
94
|
-
expect(version.readVersion).to.equal("^4.1.0");
|
|
95
|
-
expect(version.writeVersion).to.equal("^4.1.0");
|
|
75
|
+
expect(() => schemaDb.openDb(schemaDbFileName, OpenMode.ReadWrite)).to.throw();
|
|
96
76
|
});
|
|
97
77
|
});
|
|
98
78
|
describe("reserveElements", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaSyncDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SchemaSyncDb.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 { DbResult, Guid, Id64, OpenMode } from \"@itwin/core-bentley\";\r\nimport { BriefcaseIdValue, Code, ElementReservationError } from \"@itwin/core-common\";\r\nimport { expect } from \"chai\";\r\nimport { IModelJsFs, SchemaSync } from \"../../core-backend\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\n\r\n/** Assert that `promise` rejects with an `ElementReservationError` carrying the given key. */\r\nasync function expectReservationError(promise: Promise<unknown>, key: ElementReservationError.Key): Promise<void> {\r\n try {\r\n await promise;\r\n } catch (err) {\r\n expect(ElementReservationError.isError(err, key), `expected ElementReservationError '${key}', got: ${JSON.stringify(err)}`).to.be.true;\r\n return;\r\n }\r\n expect.fail(`expected promise to reject with ElementReservationError '${key}'`);\r\n}\r\n\r\ndescribe(\"SchemaSyncDb\", () => {\r\n let schemaDb: SchemaSync.SchemaSyncDb;\r\n let schemaDbFileName: string;\r\n\r\n beforeEach(() => {\r\n schemaDbFileName = IModelTestUtils.prepareOutputFile(\"SchemaSyncDb\", \"schema-sync.db\");\r\n SchemaSync.SchemaSyncDb.createNewDb(schemaDbFileName);\r\n schemaDb = new SchemaSync.SchemaSyncDb();\r\n schemaDb.openDb(schemaDbFileName, OpenMode.ReadWrite);\r\n });\r\n\r\n afterEach(() => {\r\n if (schemaDb.isOpen)\r\n schemaDb.closeDb();\r\n IModelJsFs.removeSync(schemaDbFileName);\r\n });\r\n\r\n // This is a little gross, but the easiest way to test upgrading from v4.0\r\n function simulatePreviousDbSchema() {\r\n let res = schemaDb.executeSQL(\"DROP TABLE reserved_elements\");\r\n expect(res).to.equal(DbResult.BE_SQLITE_DONE);\r\n res = schemaDb.executeSQL(\"DELETE FROM be_Prop WHERE namespace='schemasync'\");\r\n expect(res).to.equal(DbResult.BE_SQLITE_DONE);\r\n schemaDb.setRequiredVersions({ readVersion: \"^4.0.0\", writeVersion: \"^4.0.0\" });\r\n schemaDb.saveChanges();\r\n }\r\n\r\n function getTableInfo(tableName: string) {\r\n return schemaDb.withSqliteStatement(`PRAGMA table_info(${tableName})`, (stmt) => {\r\n const rows: Array<{ name: string, type: string, notnull: number }> = [];\r\n while (stmt.nextRow())\r\n rows.push({ name: stmt.getValueString(1), type: stmt.getValueString(2), notnull: stmt.getValueInteger(3) });\r\n return rows;\r\n });\r\n }\r\n\r\n function readReservedRows(): Array<{ federationGuid: string, elementId: string, ecClassId: string, codeValue: string }> {\r\n return schemaDb.withSqliteStatement(\r\n \"SELECT federationGuid, elementId, ecClassId, codeValue FROM reserved_elements ORDER BY elementId\",\r\n (stmt) => {\r\n const rows: Array<{ federationGuid: string, elementId: string, ecClassId: string, codeValue: string }> = [];\r\n while (stmt.nextRow()) {\r\n rows.push({\r\n federationGuid: stmt.getValueGuid(0),\r\n elementId: stmt.getValueId(1),\r\n ecClassId: stmt.getValueId(2),\r\n codeValue: stmt.getValueString(3),\r\n });\r\n }\r\n return rows;\r\n },\r\n );\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/dot-notation\r\n const readNextLocalId = () => schemaDb[\"getNextReservedElementLocalId\"]();\r\n\r\n describe(\"schema\", () => {\r\n it(\"creates the reserved_elements table with elementId NOT NULL UNIQUE\", () => {\r\n const cols = getTableInfo(\"reserved_elements\");\r\n const names = cols.map((c) => c.name).sort();\r\n expect(names).to.deep.equal([\"codeScope\", \"codeSpecId\", \"codeValue\", \"ecClassId\", \"elementId\", \"federationGuid\"]);\r\n const elementIdCol = cols.find((c) => c.name === \"elementId\")!;\r\n expect(elementIdCol.notnull).to.equal(1);\r\n });\r\n\r\n it(\"lazily updates to new schema just before reserving elements\", async () => {\r\n simulatePreviousDbSchema();\r\n schemaDb.closeDb();\r\n schemaDb.openDb(schemaDbFileName, OpenMode.ReadWrite);\r\n\r\n expect(getTableInfo(\"reserved_elements\")).to.be.empty;\r\n expect(readNextLocalId()).to.equal(1);\r\n let version = schemaDb.getRequiredVersions();\r\n expect(version.readVersion).to.equal(\"^4.0.0\");\r\n expect(version.writeVersion).to.equal(\"^4.0.0\");\r\n\r\n await schemaDb.reserveElements([{\r\n federationGuid: Guid.createValue(),\r\n ecClassId: \"0x1\",\r\n code: Code.fromJSON({ spec: \"0x1\", scope: \"0x2\", value: \"foo\" })\r\n }]);\r\n\r\n expect(getTableInfo(\"reserved_elements\")).to.not.be.empty;\r\n expect(readNextLocalId()).to.equal(2);\r\n version = schemaDb.getRequiredVersions();\r\n expect(version.readVersion).to.equal(\"^4.1.0\");\r\n expect(version.writeVersion).to.equal(\"^4.1.0\");\r\n });\r\n });\r\n\r\n describe(\"reserveElements\", () => {\r\n function makeReservation(federationGuid: string, codeValue: string, ecClassId = \"0x1\"): SchemaSync.ProposedElementReservation {\r\n return {\r\n federationGuid,\r\n ecClassId,\r\n code: Code.fromJSON({ spec: \"0x1\", scope: \"0x2\", value: codeValue }),\r\n };\r\n }\r\n\r\n it(\"throws when nextReservedElementLocalId file property is corrupt\", async () => {\r\n for (const corruptValue of [\"abc\", \"0\", \"-1\", \"1.5\"]) {\r\n schemaDb[_nativeDb].saveFileProperty({ namespace: \"schemasync\", name: \"nextReservedElementLocalId\" }, corruptValue);\r\n schemaDb.saveChanges();\r\n\r\n await expectReservationError(schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"cat\"),\r\n ]), \"corrupt-reservation-data\");\r\n }\r\n });\r\n\r\n it(\"rejects duplicate non-empty code values across different federation guids\", async () => {\r\n await expect(schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-X\"),\r\n makeReservation(Guid.createValue(), \"Cat-X\"),\r\n ])).to.be.rejected;\r\n });\r\n\r\n it(\"treats code values case-insensitively when enforcing uniqueness\", async () => {\r\n await expect(schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-A\"),\r\n makeReservation(Guid.createValue(), \"cat-a\"),\r\n ])).to.be.rejected;\r\n });\r\n\r\n it(\"persists local-id counter across reserve calls\", async () => {\r\n await schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-A\"),\r\n ]);\r\n expect(readNextLocalId()).to.equal(2);\r\n\r\n await schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-B\"),\r\n ]);\r\n expect(readNextLocalId()).to.equal(3);\r\n });\r\n\r\n it(\"allocates the elementId using the SchemaSyncElementReserved briefcase id\", async () => {\r\n await schemaDb.reserveElements([makeReservation(Guid.createValue(), \"Cat-A\")]);\r\n const elementId = readReservedRows()[0].elementId;\r\n expect(elementId).to.equal(Id64.fromLocalAndBriefcaseIds(1, BriefcaseIdValue.SchemaSyncElementReserved));\r\n expect(Id64.getBriefcaseId(elementId)).to.equal(BriefcaseIdValue.SchemaSyncElementReserved);\r\n expect(Id64.getLocalId(elementId)).to.equal(1);\r\n });\r\n\r\n it(\"assigns sequential local Ids for a batch\", async () => {\r\n await schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-A\"),\r\n makeReservation(Guid.createValue(), \"Cat-B\"),\r\n makeReservation(Guid.createValue(), \"Cat-C\"),\r\n ]);\r\n const rows = readReservedRows();\r\n expect(rows).to.have.lengthOf(3);\r\n expect(rows.map((r) => Id64.getLocalId(r.elementId))).to.deep.equal([1, 2, 3]);\r\n expect(readNextLocalId()).to.equal(4);\r\n });\r\n\r\n it(\"is idempotent within a single call (duplicate element props)\", async () => {\r\n const federationGuid = Guid.createValue();\r\n await schemaDb.reserveElements([\r\n makeReservation(federationGuid, \"Cat-A\"),\r\n makeReservation(federationGuid, \"Cat-A\"),\r\n ]);\r\n expect(readReservedRows()).to.have.lengthOf(1);\r\n expect(readNextLocalId()).to.equal(2);\r\n });\r\n\r\n it(\"is idempotent across calls (returns existing id, allocates no new row)\", async () => {\r\n const federationGuid = Guid.createValue();\r\n await schemaDb.reserveElements([makeReservation(federationGuid, \"Cat-A\")]);\r\n const firstId = readReservedRows()[0].elementId;\r\n\r\n await schemaDb.reserveElements([makeReservation(federationGuid, \"Cat-A\")]);\r\n expect(readReservedRows()).to.have.lengthOf(1);\r\n expect(readReservedRows()[0].elementId).to.equal(firstId);\r\n expect(readNextLocalId()).to.equal(2);\r\n });\r\n\r\n it(\"allows multiple identities with empty codes to coexist\", async () => {\r\n await schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"\"),\r\n makeReservation(Guid.createValue(), \"\"),\r\n makeReservation(Guid.createValue(), \"\"),\r\n ]);\r\n const rows = readReservedRows();\r\n expect(rows).to.have.lengthOf(3);\r\n expect(new Set(rows.map((r) => r.elementId)).size).to.equal(3);\r\n });\r\n\r\n it(\"throws when an existing reservation has a different class\", async () => {\r\n const federationGuid = Guid.createValue();\r\n await schemaDb.reserveElements([makeReservation(federationGuid, \"Cat-A\", \"0x1\")]);\r\n await expectReservationError(schemaDb.reserveElements([\r\n makeReservation(federationGuid, \"Cat-A\", \"0x2\"),\r\n ]), \"reservation-conflict\");\r\n });\r\n\r\n it(\"throws when federationGuid and code resolve to different existing rows\", async () => {\r\n const federationGuidA = Guid.createValue();\r\n const federationGuidB = Guid.createValue();\r\n await schemaDb.reserveElements([\r\n makeReservation(federationGuidA, \"Cat-A\"),\r\n makeReservation(federationGuidB, \"Cat-B\"),\r\n ]);\r\n // fedGuid lookup returns the A row, code lookup returns the B row.\r\n await expectReservationError(schemaDb.reserveElements([\r\n makeReservation(federationGuidA, \"Cat-B\"),\r\n ]), \"reservation-conflict\");\r\n });\r\n\r\n it(\"throws when the local-id sequence is exhausted\", async () => {\r\n // eslint-disable-next-line @typescript-eslint/dot-notation\r\n schemaDb[\"setNextReservedElementLocalId\"](Math.pow(2, 40) - 2); // Seed counter near the 2^40 ceiling.\r\n schemaDb.saveChanges();\r\n await expectReservationError(schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-A\"),\r\n makeReservation(Guid.createValue(), \"Cat-B\"),\r\n makeReservation(Guid.createValue(), \"Cat-C\"),\r\n ]), \"id-sequence-exhausted\");\r\n expect(readReservedRows()).to.be.empty;\r\n });\r\n\r\n it(\"throws when a federationGuid is missing\", async () => {\r\n await expectReservationError(schemaDb.reserveElements([\r\n { ecClassId: \"0x1\", code: Code.fromJSON({ spec: \"0x1\", scope: \"0x2\", value: \"Cat-A\" }) } as any,\r\n ]), \"invalid-reservation\");\r\n expect(readReservedRows()).to.be.empty;\r\n });\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"SchemaSyncDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SchemaSyncDb.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 { Guid, Id64, OpenMode } from \"@itwin/core-bentley\";\r\nimport { BriefcaseIdValue, Code, ElementReservationError } from \"@itwin/core-common\";\r\nimport { expect } from \"chai\";\r\nimport { IModelJsFs, SchemaSync } from \"../../core-backend\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\n\r\n/** Assert that `promise` rejects with an `ElementReservationError` carrying the given key. */\r\nasync function expectReservationError(promise: Promise<unknown>, key: ElementReservationError.Key): Promise<void> {\r\n try {\r\n await promise;\r\n } catch (err) {\r\n expect(ElementReservationError.isError(err, key), `expected ElementReservationError '${key}', got: ${JSON.stringify(err)}`).to.be.true;\r\n return;\r\n }\r\n expect.fail(`expected promise to reject with ElementReservationError '${key}'`);\r\n}\r\n\r\ndescribe(\"SchemaSyncDb\", () => {\r\n let schemaDb: SchemaSync.SchemaSyncDb;\r\n let schemaDbFileName: string;\r\n\r\n beforeEach(() => {\r\n schemaDbFileName = IModelTestUtils.prepareOutputFile(\"SchemaSyncDb\", \"schema-sync.db\");\r\n SchemaSync.SchemaSyncDb.createNewDb(schemaDbFileName);\r\n schemaDb = new SchemaSync.SchemaSyncDb();\r\n schemaDb.openDb(schemaDbFileName, OpenMode.ReadWrite);\r\n });\r\n\r\n afterEach(() => {\r\n if (schemaDb.isOpen)\r\n schemaDb.closeDb();\r\n IModelJsFs.removeSync(schemaDbFileName);\r\n });\r\n\r\n function simulateVersion4Db() {\r\n schemaDb.setRequiredVersions({ readVersion: \"^4.0.0\", writeVersion: \"^4.0.0\" });\r\n schemaDb.saveChanges();\r\n }\r\n\r\n function getTableInfo(tableName: string) {\r\n return schemaDb.withSqliteStatement(`PRAGMA table_info(${tableName})`, (stmt) => {\r\n const rows: Array<{ name: string, type: string, notnull: number }> = [];\r\n while (stmt.nextRow())\r\n rows.push({ name: stmt.getValueString(1), type: stmt.getValueString(2), notnull: stmt.getValueInteger(3) });\r\n return rows;\r\n });\r\n }\r\n\r\n function readReservedRows(): Array<{ federationGuid: string, elementId: string, ecClassId: string, codeValue: string }> {\r\n return schemaDb.withSqliteStatement(\r\n \"SELECT federationGuid, elementId, ecClassId, codeValue FROM reserved_elements ORDER BY elementId\",\r\n (stmt) => {\r\n const rows: Array<{ federationGuid: string, elementId: string, ecClassId: string, codeValue: string }> = [];\r\n while (stmt.nextRow()) {\r\n rows.push({\r\n federationGuid: stmt.getValueGuid(0),\r\n elementId: stmt.getValueId(1),\r\n ecClassId: stmt.getValueId(2),\r\n codeValue: stmt.getValueString(3),\r\n });\r\n }\r\n return rows;\r\n },\r\n );\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/dot-notation\r\n const readNextLocalId = () => schemaDb[\"getNextReservedElementLocalId\"]();\r\n\r\n describe(\"schema\", () => {\r\n it(\"creates the reserved_elements table with elementId NOT NULL UNIQUE\", () => {\r\n const cols = getTableInfo(\"reserved_elements\");\r\n const names = cols.map((c) => c.name).sort();\r\n expect(names).to.deep.equal([\"codeScope\", \"codeSpecId\", \"codeValue\", \"ecClassId\", \"elementId\", \"federationGuid\"]);\r\n const elementIdCol = cols.find((c) => c.name === \"elementId\")!;\r\n expect(elementIdCol.notnull).to.equal(1);\r\n });\r\n\r\n it(\"refuses a database from the previous major version\", () => {\r\n simulateVersion4Db();\r\n schemaDb.closeDb();\r\n\r\n expect(() => schemaDb.openDb(schemaDbFileName, OpenMode.ReadWrite)).to.throw();\r\n });\r\n });\r\n\r\n describe(\"reserveElements\", () => {\r\n function makeReservation(federationGuid: string, codeValue: string, ecClassId = \"0x1\"): SchemaSync.ProposedElementReservation {\r\n return {\r\n federationGuid,\r\n ecClassId,\r\n code: Code.fromJSON({ spec: \"0x1\", scope: \"0x2\", value: codeValue }),\r\n };\r\n }\r\n\r\n it(\"throws when nextReservedElementLocalId file property is corrupt\", async () => {\r\n for (const corruptValue of [\"abc\", \"0\", \"-1\", \"1.5\"]) {\r\n schemaDb[_nativeDb].saveFileProperty({ namespace: \"schemasync\", name: \"nextReservedElementLocalId\" }, corruptValue);\r\n schemaDb.saveChanges();\r\n\r\n await expectReservationError(schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"cat\"),\r\n ]), \"corrupt-reservation-data\");\r\n }\r\n });\r\n\r\n it(\"rejects duplicate non-empty code values across different federation guids\", async () => {\r\n await expect(schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-X\"),\r\n makeReservation(Guid.createValue(), \"Cat-X\"),\r\n ])).to.be.rejected;\r\n });\r\n\r\n it(\"treats code values case-insensitively when enforcing uniqueness\", async () => {\r\n await expect(schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-A\"),\r\n makeReservation(Guid.createValue(), \"cat-a\"),\r\n ])).to.be.rejected;\r\n });\r\n\r\n it(\"persists local-id counter across reserve calls\", async () => {\r\n await schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-A\"),\r\n ]);\r\n expect(readNextLocalId()).to.equal(2);\r\n\r\n await schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-B\"),\r\n ]);\r\n expect(readNextLocalId()).to.equal(3);\r\n });\r\n\r\n it(\"allocates the elementId using the SchemaSyncElementReserved briefcase id\", async () => {\r\n await schemaDb.reserveElements([makeReservation(Guid.createValue(), \"Cat-A\")]);\r\n const elementId = readReservedRows()[0].elementId;\r\n expect(elementId).to.equal(Id64.fromLocalAndBriefcaseIds(1, BriefcaseIdValue.SchemaSyncElementReserved));\r\n expect(Id64.getBriefcaseId(elementId)).to.equal(BriefcaseIdValue.SchemaSyncElementReserved);\r\n expect(Id64.getLocalId(elementId)).to.equal(1);\r\n });\r\n\r\n it(\"assigns sequential local Ids for a batch\", async () => {\r\n await schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-A\"),\r\n makeReservation(Guid.createValue(), \"Cat-B\"),\r\n makeReservation(Guid.createValue(), \"Cat-C\"),\r\n ]);\r\n const rows = readReservedRows();\r\n expect(rows).to.have.lengthOf(3);\r\n expect(rows.map((r) => Id64.getLocalId(r.elementId))).to.deep.equal([1, 2, 3]);\r\n expect(readNextLocalId()).to.equal(4);\r\n });\r\n\r\n it(\"is idempotent within a single call (duplicate element props)\", async () => {\r\n const federationGuid = Guid.createValue();\r\n await schemaDb.reserveElements([\r\n makeReservation(federationGuid, \"Cat-A\"),\r\n makeReservation(federationGuid, \"Cat-A\"),\r\n ]);\r\n expect(readReservedRows()).to.have.lengthOf(1);\r\n expect(readNextLocalId()).to.equal(2);\r\n });\r\n\r\n it(\"is idempotent across calls (returns existing id, allocates no new row)\", async () => {\r\n const federationGuid = Guid.createValue();\r\n await schemaDb.reserveElements([makeReservation(federationGuid, \"Cat-A\")]);\r\n const firstId = readReservedRows()[0].elementId;\r\n\r\n await schemaDb.reserveElements([makeReservation(federationGuid, \"Cat-A\")]);\r\n expect(readReservedRows()).to.have.lengthOf(1);\r\n expect(readReservedRows()[0].elementId).to.equal(firstId);\r\n expect(readNextLocalId()).to.equal(2);\r\n });\r\n\r\n it(\"allows multiple identities with empty codes to coexist\", async () => {\r\n await schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"\"),\r\n makeReservation(Guid.createValue(), \"\"),\r\n makeReservation(Guid.createValue(), \"\"),\r\n ]);\r\n const rows = readReservedRows();\r\n expect(rows).to.have.lengthOf(3);\r\n expect(new Set(rows.map((r) => r.elementId)).size).to.equal(3);\r\n });\r\n\r\n it(\"throws when an existing reservation has a different class\", async () => {\r\n const federationGuid = Guid.createValue();\r\n await schemaDb.reserveElements([makeReservation(federationGuid, \"Cat-A\", \"0x1\")]);\r\n await expectReservationError(schemaDb.reserveElements([\r\n makeReservation(federationGuid, \"Cat-A\", \"0x2\"),\r\n ]), \"reservation-conflict\");\r\n });\r\n\r\n it(\"throws when federationGuid and code resolve to different existing rows\", async () => {\r\n const federationGuidA = Guid.createValue();\r\n const federationGuidB = Guid.createValue();\r\n await schemaDb.reserveElements([\r\n makeReservation(federationGuidA, \"Cat-A\"),\r\n makeReservation(federationGuidB, \"Cat-B\"),\r\n ]);\r\n // fedGuid lookup returns the A row, code lookup returns the B row.\r\n await expectReservationError(schemaDb.reserveElements([\r\n makeReservation(federationGuidA, \"Cat-B\"),\r\n ]), \"reservation-conflict\");\r\n });\r\n\r\n it(\"throws when the local-id sequence is exhausted\", async () => {\r\n // eslint-disable-next-line @typescript-eslint/dot-notation\r\n schemaDb[\"setNextReservedElementLocalId\"](Math.pow(2, 40) - 2); // Seed counter near the 2^40 ceiling.\r\n schemaDb.saveChanges();\r\n await expectReservationError(schemaDb.reserveElements([\r\n makeReservation(Guid.createValue(), \"Cat-A\"),\r\n makeReservation(Guid.createValue(), \"Cat-B\"),\r\n makeReservation(Guid.createValue(), \"Cat-C\"),\r\n ]), \"id-sequence-exhausted\");\r\n expect(readReservedRows()).to.be.empty;\r\n });\r\n\r\n it(\"throws when a federationGuid is missing\", async () => {\r\n await expectReservationError(schemaDb.reserveElements([\r\n { ecClassId: \"0x1\", code: Code.fromJSON({ spec: \"0x1\", scope: \"0x2\", value: \"Cat-A\" }) } as any,\r\n ]), \"invalid-reservation\");\r\n expect(readReservedRows()).to.be.empty;\r\n });\r\n });\r\n});\r\n"]}
|
|
@@ -130,6 +130,7 @@ describe("SchemaSync element reservation", () => {
|
|
|
130
130
|
sinon.stub(iModel[_nativeDb], "schemaSyncInit").callsFake(() => {
|
|
131
131
|
schemaSyncEnabled = true;
|
|
132
132
|
});
|
|
133
|
+
sinon.stub(iModel.locks, "isServerBased").value(true);
|
|
133
134
|
sinon.stub(iModel, "acquireSchemaLock").resolves();
|
|
134
135
|
sinon.stub(iModel, "pullChanges").resolves();
|
|
135
136
|
sinon.stub(iModel, "pushChanges").resolves();
|