@itwin/core-backend 5.2.0-dev.32 → 5.2.0-dev.34

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 CHANGED
@@ -1,6 +1,11 @@
1
1
  # Change Log - @itwin/core-backend
2
2
 
3
- This log was last generated on Wed, 17 Sep 2025 17:22:50 GMT and should not be manually modified.
3
+ This log was last generated on Wed, 24 Sep 2025 17:42:18 GMT and should not be manually modified.
4
+
5
+ ## 5.1.9
6
+ Wed, 24 Sep 2025 17:38:08 GMT
7
+
8
+ _Version update only_
4
9
 
5
10
  ## 5.1.8
6
11
  Wed, 17 Sep 2025 17:17:16 GMT
@@ -105,6 +105,14 @@ export declare class SqliteChangesetReader implements Disposable {
105
105
  static openTxn(args: {
106
106
  txnId: Id64String;
107
107
  } & SqliteChangesetReaderArgs): SqliteChangesetReader;
108
+ /**
109
+ * Open in-memory changes for the given iModel.
110
+ * @param args - The arguments for opening in-memory changes.
111
+ * @returns SqliteChangesetReader instance
112
+ */
113
+ static openInMemory(args: SqliteChangesetReaderArgs & {
114
+ db: IModelDb;
115
+ }): SqliteChangesetReader;
108
116
  /**
109
117
  * Writes the changeset to a file.
110
118
  * @note can be use with openGroup() or openLocalChanges() to persist changeset.
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteChangesetReader.d.ts","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SqliteChangesetReader.d.ts","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"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"}
@@ -68,6 +68,17 @@ class SqliteChangesetReader {
68
68
  reader._nativeReader.openTxn(args.db[Symbols_1._nativeDb], args.txnId, args.invert ?? false);
69
69
  return reader;
70
70
  }
71
+ /**
72
+ * Open in-memory changes for the given iModel.
73
+ * @param args - The arguments for opening in-memory changes.
74
+ * @returns SqliteChangesetReader instance
75
+ */
76
+ static openInMemory(args) {
77
+ const reader = new SqliteChangesetReader(args.db);
78
+ reader._disableSchemaCheck = args.disableSchemaCheck ?? false;
79
+ reader._nativeReader.openInMemoryChanges(args.db[Symbols_1._nativeDb], args.invert ?? false);
80
+ return reader;
81
+ }
71
82
  /**
72
83
  * Writes the changeset to a file.
73
84
  * @note can be use with openGroup() or openLocalChanges() to persist changeset.
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteChangesetReader.js","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module SQLiteDb\n */\nimport { DbChangeStage, DbOpcode, DbResult, DbValueType, Id64String } from \"@itwin/core-bentley\";\nimport { ECDb } from \"./ECDb\";\nimport { IModelDb } from \"./IModelDb\";\nimport { IModelNative } from \"./internal/NativePlatform\";\nimport { _nativeDb } from \"./internal/Symbols\";\n\n/** Changed value type\n * @beta\n*/\ntype SqliteValue = Uint8Array | number | string | null | undefined;\n\n/** Array of changed values\n * @beta\n*/\ntype SqliteValueArray = SqliteValue[];\n/**\n * Format option when converting change from array to column/value object.\n * @beta\n */\nexport interface ChangeFormatArgs {\n /** include table name */\n includeTableName?: true;\n /** include op code */\n includeOpCode?: true;\n /** include null columns */\n includeNullColumns?: true;\n /** include value version */\n includeStage?: true;\n /** include primary key in update change */\n includePrimaryKeyInUpdateNew?: true;\n}\n\n/** Operation that cause the change\n * @beta\n*/\nexport type SqliteChangeOp = \"Inserted\" | \"Updated\" | \"Deleted\";\n\n/** Stage is version of value that needed to be read\n * @beta\n*/\nexport type SqliteValueStage = \"Old\" | \"New\";\n\n/** Db from which schema will be read. It should be from timeline to which changeset belong.\n * @beta\n*/\nexport type AnyDb = IModelDb | ECDb;\n\n/** Arg to open a changeset file from disk\n * @beta\n*/\nexport interface SqliteChangesetReaderArgs {\n /** db from which schema will be read. It should be at or ahead of the latest changeset being opened.*/\n readonly db: AnyDb;\n /** invert the changeset operations */\n readonly invert?: true;\n /** do not check if column of change match db schema instead ignore addition columns */\n readonly disableSchemaCheck?: true;\n}\n/**\n * Represent sqlite change.\n * @beta\n */\nexport interface SqliteChange {\n /** name of table */\n $table?: string;\n /** SQLite operation that created this change */\n $op?: SqliteChangeOp;\n /** version of data in change. */\n $stage?: SqliteValueStage;\n /** columns in change */\n [key: string]: any;\n}\n/**\n * Read raw sqlite changeset from disk and enumerate changes.\n * It also optionally let you format change with schema from\n * a db provided.\n * @beta\n */\nexport class SqliteChangesetReader implements Disposable {\n private readonly _nativeReader = new IModelNative.platform.ChangesetReader();\n private _schemaCache = new Map<string, string[]>();\n private _disableSchemaCheck = false;\n private _changeIndex = 0;\n protected constructor(\n /** db from where sql schema will be read */\n public readonly db: AnyDb,\n ) { }\n\n /**\n * Open changeset file from disk\n * @param args fileName of changeset reader and other options.\n * @returns SqliteChangesetReader instance\n */\n public static openFile(args: { readonly fileName: string } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openFile(args.fileName, args.invert ?? false);\n return reader;\n }\n /**\n * Group changeset file into single changeset and open that changeset.\n * @param args - The arguments for opening the changeset group. Requires an open db.\n * @returns The SqliteChangesetReader instance.\n */\n public static openGroup(args: { readonly changesetFiles: string[] } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n if (args.changesetFiles.length === 0) {\n throw new Error(\"changesetFiles must contain at least one file.\");\n }\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openGroup(args.changesetFiles, args.db[_nativeDb], args.invert ?? false);\n return reader;\n }\n /**\n * Open txn change in iModel.\n * @param args iModel and other options.\n * @returns SqliteChangesetReader instance\n */\n public static openTxn(args: { txnId: Id64String } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n if (args.db instanceof ECDb) {\n throw new Error(\"ECDb does not support openTxn\");\n }\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openTxn(args.db[_nativeDb], args.txnId, args.invert ?? false);\n return reader;\n }\n /**\n * Writes the changeset to a file.\n * @note can be use with openGroup() or openLocalChanges() to persist changeset.\n * @param args - The arguments for writing to the file.\n * @param args.fileName - The name of the file to write to.\n * @param args.containsSchemaChanges - Indicates whether the changeset contains schema changes.\n * @param args.overwriteFile - Indicates whether to override the file if it already exists. Default is false.\n */\n public writeToFile(args: { fileName: string, containsSchemaChanges: boolean, overwriteFile?: boolean }): void {\n this._nativeReader.writeToFile(args.fileName, args.containsSchemaChanges, args.overwriteFile ?? false);\n }\n /**\n * Open local changes in iModel.\n * @param args iModel and other options.\n * @param args.db must be of type IModelDb\n * @returns SqliteChangesetReader instance\n */\n public static openLocalChanges(args: Omit<SqliteChangesetReaderArgs, \"db\"> & { db: IModelDb, includeInMemoryChanges?: true }): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openLocalChanges(args.db[_nativeDb], args.includeInMemoryChanges ?? false, args.invert ?? false);\n return reader;\n }\n /** check if schema check is disabled or not */\n public get disableSchemaCheck(): boolean { return this._disableSchemaCheck; }\n /** Move to next change in changeset\n * @returns true if there is current change false if reader is end of changeset.\n * @beta\n */\n public step(): boolean {\n if (this._nativeReader.step()) {\n this._changeIndex++;\n return true;\n }\n return false;\n }\n /** Check if reader current on a row\n * @beta\n */\n public get hasRow(): boolean {\n return this._nativeReader.hasRow();\n }\n /** Check if its current change is indirect\n * @beta\n */\n public get isIndirect(): boolean {\n return this._nativeReader.isIndirectChange();\n }\n /** Get count of columns in current change\n * @beta\n */\n public get columnCount(): number {\n return this._nativeReader.getColumnCount();\n }\n /** Get operation that caused the change\n * @beta\n */\n public get op(): SqliteChangeOp {\n if (this._nativeReader.getOpCode() === DbOpcode.Insert)\n return \"Inserted\";\n\n if (this._nativeReader.getOpCode() === DbOpcode.Delete)\n return \"Deleted\";\n\n return \"Updated\";\n }\n /** Get primary key value array\n * @beta\n */\n public get primaryKeyValues(): SqliteValueArray {\n return this._nativeReader.getPrimaryKeys();\n }\n /** Get primary key columns.\n * @note To this to work db arg must be set when opening changeset file.\n * @beta\n */\n public getPrimaryKeyColumnNames(): string[] {\n const cols = this.getColumnNames(this.tableName);\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\n\n return this._nativeReader.getPrimaryKeyColumnIndexes().map((i) => cols[i]);\n }\n /** Get current change table.\n * @beta\n */\n public get tableName(): string {\n return this._nativeReader.getTableName();\n }\n /**\n * Get changed binary value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType;\n }\n\n /**\n * Get changed binary value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueBinary(columnIndex: number, stage: SqliteValueStage): Uint8Array | null | undefined {\n return this._nativeReader.getColumnValueBinary(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed double value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueDouble(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\n return this._nativeReader.getColumnValueDouble(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed Id value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueId(columnIndex: number, stage: SqliteValueStage): Id64String | null | undefined {\n return this._nativeReader.getColumnValueId(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed integer value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueInteger(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\n return this._nativeReader.getColumnValueInteger(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed text value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueText(columnIndex: number, stage: SqliteValueStage): string | null | undefined {\n return this._nativeReader.getColumnValueText(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Check if change value is null\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns true if value is null\n * @beta\n */\n public isColumnValueNull(columnIndex: number, stage: SqliteValueStage): boolean | undefined {\n return this._nativeReader.isColumnValueNull(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get change value type\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns change value type\n * @beta\n */\n public getColumnValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType | undefined;\n }\n\n /**\n * Get changed value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValue(columnIndex: number, stage: SqliteValueStage): SqliteValue {\n return this._nativeReader.getColumnValue(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n /**\n * Get all changed value in current change as array\n * @param stage old or new values for current change.\n * @returns array of values.\n * @beta\n */\n public getChangeValuesArray(stage: SqliteValueStage): SqliteValueArray | undefined {\n return this._nativeReader.getRow(stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n /**\n * Get change as object and format its content.\n * @param stage old or new value for current change.\n * @param args change format options\n * @returns return object or undefined\n * @beta\n */\n public getChangeValuesObject(stage: SqliteValueStage, args: ChangeFormatArgs = {}): SqliteChange | undefined {\n const cols = this.getColumnNames(this.tableName);\n const row = this.getChangeValuesArray(stage);\n if (!row)\n return undefined;\n process.env;\n const minLen = Math.min(cols.length, row.length);\n\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\n\n const out: SqliteChange = {};\n if (args.includeTableName) {\n out.$table = this.tableName;\n }\n if (args.includeOpCode) {\n out.$op = this.op;\n }\n if (args.includeStage) {\n out.$stage = stage;\n }\n\n if (args.includePrimaryKeyInUpdateNew && this.op === \"Updated\" && stage === \"New\") {\n const pkNames = this.getPrimaryKeyColumnNames();\n const pkValues = this.primaryKeyValues;\n pkNames.forEach((v, i) => {\n out[v] = pkValues[i];\n });\n }\n const isNullOrUndefined = (val: SqliteValue) => typeof val === \"undefined\";\n\n for (let i = 0; i < minLen; ++i) {\n const columnValue = row[i];\n const columnName = cols[i];\n if (!args.includeNullColumns && isNullOrUndefined(columnValue))\n continue;\n\n out[columnName] = columnValue;\n }\n return out;\n }\n /**\n * Get list of column for a table. This function also caches the result.\n * @note To this to work db arg must be set when opening changeset file.\n * @param tableName name of the table for which columns are requested.\n * @returns columns of table.\n * @beta\n */\n public getColumnNames(tableName: string): string[] {\n const columns = this._schemaCache.get(tableName);\n if (columns)\n return columns;\n\n return this.db.withPreparedSqliteStatement(\"SELECT [name] FROM PRAGMA_TABLE_INFO(?) ORDER BY [cid]\", (stmt) => {\n stmt.bindString(1, tableName);\n const tblCols: string[] = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n tblCols.push(stmt.getValueString(0));\n }\n this._schemaCache.set(tableName, tblCols);\n return tblCols;\n });\n }\n /** index of current change\n * @beta\n */\n public get changeIndex() { return this._changeIndex; }\n /**\n * Close changeset\n * @beta\n */\n public close() {\n this._changeIndex = 0;\n this._nativeReader.close();\n }\n /**\n * Dispose this object\n * @beta\n */\n public [Symbol.dispose](): void {\n this.close();\n }\n}\n"]}
1
+ {"version":3,"file":"SqliteChangesetReader.js","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module SQLiteDb\n */\nimport { DbChangeStage, DbOpcode, DbResult, DbValueType, Id64String } from \"@itwin/core-bentley\";\nimport { ECDb } from \"./ECDb\";\nimport { IModelDb } from \"./IModelDb\";\nimport { IModelNative } from \"./internal/NativePlatform\";\nimport { _nativeDb } from \"./internal/Symbols\";\n\n/** Changed value type\n * @beta\n*/\ntype SqliteValue = Uint8Array | number | string | null | undefined;\n\n/** Array of changed values\n * @beta\n*/\ntype SqliteValueArray = SqliteValue[];\n/**\n * Format option when converting change from array to column/value object.\n * @beta\n */\nexport interface ChangeFormatArgs {\n /** include table name */\n includeTableName?: true;\n /** include op code */\n includeOpCode?: true;\n /** include null columns */\n includeNullColumns?: true;\n /** include value version */\n includeStage?: true;\n /** include primary key in update change */\n includePrimaryKeyInUpdateNew?: true;\n}\n\n/** Operation that cause the change\n * @beta\n*/\nexport type SqliteChangeOp = \"Inserted\" | \"Updated\" | \"Deleted\";\n\n/** Stage is version of value that needed to be read\n * @beta\n*/\nexport type SqliteValueStage = \"Old\" | \"New\";\n\n/** Db from which schema will be read. It should be from timeline to which changeset belong.\n * @beta\n*/\nexport type AnyDb = IModelDb | ECDb;\n\n/** Arg to open a changeset file from disk\n * @beta\n*/\nexport interface SqliteChangesetReaderArgs {\n /** db from which schema will be read. It should be at or ahead of the latest changeset being opened.*/\n readonly db: AnyDb;\n /** invert the changeset operations */\n readonly invert?: true;\n /** do not check if column of change match db schema instead ignore addition columns */\n readonly disableSchemaCheck?: true;\n}\n/**\n * Represent sqlite change.\n * @beta\n */\nexport interface SqliteChange {\n /** name of table */\n $table?: string;\n /** SQLite operation that created this change */\n $op?: SqliteChangeOp;\n /** version of data in change. */\n $stage?: SqliteValueStage;\n /** columns in change */\n [key: string]: any;\n}\n/**\n * Read raw sqlite changeset from disk and enumerate changes.\n * It also optionally let you format change with schema from\n * a db provided.\n * @beta\n */\nexport class SqliteChangesetReader implements Disposable {\n private readonly _nativeReader = new IModelNative.platform.ChangesetReader();\n private _schemaCache = new Map<string, string[]>();\n private _disableSchemaCheck = false;\n private _changeIndex = 0;\n protected constructor(\n /** db from where sql schema will be read */\n public readonly db: AnyDb,\n ) { }\n\n /**\n * Open changeset file from disk\n * @param args fileName of changeset reader and other options.\n * @returns SqliteChangesetReader instance\n */\n public static openFile(args: { readonly fileName: string } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openFile(args.fileName, args.invert ?? false);\n return reader;\n }\n /**\n * Group changeset file into single changeset and open that changeset.\n * @param args - The arguments for opening the changeset group. Requires an open db.\n * @returns The SqliteChangesetReader instance.\n */\n public static openGroup(args: { readonly changesetFiles: string[] } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n if (args.changesetFiles.length === 0) {\n throw new Error(\"changesetFiles must contain at least one file.\");\n }\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openGroup(args.changesetFiles, args.db[_nativeDb], args.invert ?? false);\n return reader;\n }\n /**\n * Open txn change in iModel.\n * @param args iModel and other options.\n * @returns SqliteChangesetReader instance\n */\n public static openTxn(args: { txnId: Id64String } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n if (args.db instanceof ECDb) {\n throw new Error(\"ECDb does not support openTxn\");\n }\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openTxn(args.db[_nativeDb], args.txnId, args.invert ?? false);\n return reader;\n }\n /**\n * Open in-memory changes for the given iModel.\n * @param args - The arguments for opening in-memory changes.\n * @returns SqliteChangesetReader instance\n */\n public static openInMemory(args: SqliteChangesetReaderArgs & { db: IModelDb }): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openInMemoryChanges(args.db[_nativeDb], args.invert ?? false);\n return reader;\n }\n /**\n * Writes the changeset to a file.\n * @note can be use with openGroup() or openLocalChanges() to persist changeset.\n * @param args - The arguments for writing to the file.\n * @param args.fileName - The name of the file to write to.\n * @param args.containsSchemaChanges - Indicates whether the changeset contains schema changes.\n * @param args.overwriteFile - Indicates whether to override the file if it already exists. Default is false.\n */\n public writeToFile(args: { fileName: string, containsSchemaChanges: boolean, overwriteFile?: boolean }): void {\n this._nativeReader.writeToFile(args.fileName, args.containsSchemaChanges, args.overwriteFile ?? false);\n }\n /**\n * Open local changes in iModel.\n * @param args iModel and other options.\n * @param args.db must be of type IModelDb\n * @returns SqliteChangesetReader instance\n */\n public static openLocalChanges(args: Omit<SqliteChangesetReaderArgs, \"db\"> & { db: IModelDb, includeInMemoryChanges?: true }): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openLocalChanges(args.db[_nativeDb], args.includeInMemoryChanges ?? false, args.invert ?? false);\n return reader;\n }\n /** check if schema check is disabled or not */\n public get disableSchemaCheck(): boolean { return this._disableSchemaCheck; }\n /** Move to next change in changeset\n * @returns true if there is current change false if reader is end of changeset.\n * @beta\n */\n public step(): boolean {\n if (this._nativeReader.step()) {\n this._changeIndex++;\n return true;\n }\n return false;\n }\n /** Check if reader current on a row\n * @beta\n */\n public get hasRow(): boolean {\n return this._nativeReader.hasRow();\n }\n /** Check if its current change is indirect\n * @beta\n */\n public get isIndirect(): boolean {\n return this._nativeReader.isIndirectChange();\n }\n /** Get count of columns in current change\n * @beta\n */\n public get columnCount(): number {\n return this._nativeReader.getColumnCount();\n }\n /** Get operation that caused the change\n * @beta\n */\n public get op(): SqliteChangeOp {\n if (this._nativeReader.getOpCode() === DbOpcode.Insert)\n return \"Inserted\";\n\n if (this._nativeReader.getOpCode() === DbOpcode.Delete)\n return \"Deleted\";\n\n return \"Updated\";\n }\n /** Get primary key value array\n * @beta\n */\n public get primaryKeyValues(): SqliteValueArray {\n return this._nativeReader.getPrimaryKeys();\n }\n /** Get primary key columns.\n * @note To this to work db arg must be set when opening changeset file.\n * @beta\n */\n public getPrimaryKeyColumnNames(): string[] {\n const cols = this.getColumnNames(this.tableName);\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\n\n return this._nativeReader.getPrimaryKeyColumnIndexes().map((i) => cols[i]);\n }\n /** Get current change table.\n * @beta\n */\n public get tableName(): string {\n return this._nativeReader.getTableName();\n }\n /**\n * Get changed binary value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType;\n }\n\n /**\n * Get changed binary value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueBinary(columnIndex: number, stage: SqliteValueStage): Uint8Array | null | undefined {\n return this._nativeReader.getColumnValueBinary(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed double value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueDouble(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\n return this._nativeReader.getColumnValueDouble(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed Id value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueId(columnIndex: number, stage: SqliteValueStage): Id64String | null | undefined {\n return this._nativeReader.getColumnValueId(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed integer value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueInteger(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\n return this._nativeReader.getColumnValueInteger(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed text value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueText(columnIndex: number, stage: SqliteValueStage): string | null | undefined {\n return this._nativeReader.getColumnValueText(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Check if change value is null\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns true if value is null\n * @beta\n */\n public isColumnValueNull(columnIndex: number, stage: SqliteValueStage): boolean | undefined {\n return this._nativeReader.isColumnValueNull(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get change value type\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns change value type\n * @beta\n */\n public getColumnValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType | undefined;\n }\n\n /**\n * Get changed value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValue(columnIndex: number, stage: SqliteValueStage): SqliteValue {\n return this._nativeReader.getColumnValue(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n /**\n * Get all changed value in current change as array\n * @param stage old or new values for current change.\n * @returns array of values.\n * @beta\n */\n public getChangeValuesArray(stage: SqliteValueStage): SqliteValueArray | undefined {\n return this._nativeReader.getRow(stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n /**\n * Get change as object and format its content.\n * @param stage old or new value for current change.\n * @param args change format options\n * @returns return object or undefined\n * @beta\n */\n public getChangeValuesObject(stage: SqliteValueStage, args: ChangeFormatArgs = {}): SqliteChange | undefined {\n const cols = this.getColumnNames(this.tableName);\n const row = this.getChangeValuesArray(stage);\n if (!row)\n return undefined;\n process.env;\n const minLen = Math.min(cols.length, row.length);\n\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\n\n const out: SqliteChange = {};\n if (args.includeTableName) {\n out.$table = this.tableName;\n }\n if (args.includeOpCode) {\n out.$op = this.op;\n }\n if (args.includeStage) {\n out.$stage = stage;\n }\n\n if (args.includePrimaryKeyInUpdateNew && this.op === \"Updated\" && stage === \"New\") {\n const pkNames = this.getPrimaryKeyColumnNames();\n const pkValues = this.primaryKeyValues;\n pkNames.forEach((v, i) => {\n out[v] = pkValues[i];\n });\n }\n const isNullOrUndefined = (val: SqliteValue) => typeof val === \"undefined\";\n\n for (let i = 0; i < minLen; ++i) {\n const columnValue = row[i];\n const columnName = cols[i];\n if (!args.includeNullColumns && isNullOrUndefined(columnValue))\n continue;\n\n out[columnName] = columnValue;\n }\n return out;\n }\n /**\n * Get list of column for a table. This function also caches the result.\n * @note To this to work db arg must be set when opening changeset file.\n * @param tableName name of the table for which columns are requested.\n * @returns columns of table.\n * @beta\n */\n public getColumnNames(tableName: string): string[] {\n const columns = this._schemaCache.get(tableName);\n if (columns)\n return columns;\n\n return this.db.withPreparedSqliteStatement(\"SELECT [name] FROM PRAGMA_TABLE_INFO(?) ORDER BY [cid]\", (stmt) => {\n stmt.bindString(1, tableName);\n const tblCols: string[] = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n tblCols.push(stmt.getValueString(0));\n }\n this._schemaCache.set(tableName, tblCols);\n return tblCols;\n });\n }\n /** index of current change\n * @beta\n */\n public get changeIndex() { return this._changeIndex; }\n /**\n * Close changeset\n * @beta\n */\n public close() {\n this._changeIndex = 0;\n this._nativeReader.close();\n }\n /**\n * Dispose this object\n * @beta\n */\n public [Symbol.dispose](): void {\n this.close();\n }\n}\n"]}
@@ -105,6 +105,14 @@ export declare class SqliteChangesetReader implements Disposable {
105
105
  static openTxn(args: {
106
106
  txnId: Id64String;
107
107
  } & SqliteChangesetReaderArgs): SqliteChangesetReader;
108
+ /**
109
+ * Open in-memory changes for the given iModel.
110
+ * @param args - The arguments for opening in-memory changes.
111
+ * @returns SqliteChangesetReader instance
112
+ */
113
+ static openInMemory(args: SqliteChangesetReaderArgs & {
114
+ db: IModelDb;
115
+ }): SqliteChangesetReader;
108
116
  /**
109
117
  * Writes the changeset to a file.
110
118
  * @note can be use with openGroup() or openLocalChanges() to persist changeset.
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteChangesetReader.d.ts","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SqliteChangesetReader.d.ts","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"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"}
@@ -65,6 +65,17 @@ export class SqliteChangesetReader {
65
65
  reader._nativeReader.openTxn(args.db[_nativeDb], args.txnId, args.invert ?? false);
66
66
  return reader;
67
67
  }
68
+ /**
69
+ * Open in-memory changes for the given iModel.
70
+ * @param args - The arguments for opening in-memory changes.
71
+ * @returns SqliteChangesetReader instance
72
+ */
73
+ static openInMemory(args) {
74
+ const reader = new SqliteChangesetReader(args.db);
75
+ reader._disableSchemaCheck = args.disableSchemaCheck ?? false;
76
+ reader._nativeReader.openInMemoryChanges(args.db[_nativeDb], args.invert ?? false);
77
+ return reader;
78
+ }
68
79
  /**
69
80
  * Writes the changeset to a file.
70
81
  * @note can be use with openGroup() or openLocalChanges() to persist changeset.
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteChangesetReader.js","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module SQLiteDb\n */\nimport { DbChangeStage, DbOpcode, DbResult, DbValueType, Id64String } from \"@itwin/core-bentley\";\nimport { ECDb } from \"./ECDb\";\nimport { IModelDb } from \"./IModelDb\";\nimport { IModelNative } from \"./internal/NativePlatform\";\nimport { _nativeDb } from \"./internal/Symbols\";\n\n/** Changed value type\n * @beta\n*/\ntype SqliteValue = Uint8Array | number | string | null | undefined;\n\n/** Array of changed values\n * @beta\n*/\ntype SqliteValueArray = SqliteValue[];\n/**\n * Format option when converting change from array to column/value object.\n * @beta\n */\nexport interface ChangeFormatArgs {\n /** include table name */\n includeTableName?: true;\n /** include op code */\n includeOpCode?: true;\n /** include null columns */\n includeNullColumns?: true;\n /** include value version */\n includeStage?: true;\n /** include primary key in update change */\n includePrimaryKeyInUpdateNew?: true;\n}\n\n/** Operation that cause the change\n * @beta\n*/\nexport type SqliteChangeOp = \"Inserted\" | \"Updated\" | \"Deleted\";\n\n/** Stage is version of value that needed to be read\n * @beta\n*/\nexport type SqliteValueStage = \"Old\" | \"New\";\n\n/** Db from which schema will be read. It should be from timeline to which changeset belong.\n * @beta\n*/\nexport type AnyDb = IModelDb | ECDb;\n\n/** Arg to open a changeset file from disk\n * @beta\n*/\nexport interface SqliteChangesetReaderArgs {\n /** db from which schema will be read. It should be at or ahead of the latest changeset being opened.*/\n readonly db: AnyDb;\n /** invert the changeset operations */\n readonly invert?: true;\n /** do not check if column of change match db schema instead ignore addition columns */\n readonly disableSchemaCheck?: true;\n}\n/**\n * Represent sqlite change.\n * @beta\n */\nexport interface SqliteChange {\n /** name of table */\n $table?: string;\n /** SQLite operation that created this change */\n $op?: SqliteChangeOp;\n /** version of data in change. */\n $stage?: SqliteValueStage;\n /** columns in change */\n [key: string]: any;\n}\n/**\n * Read raw sqlite changeset from disk and enumerate changes.\n * It also optionally let you format change with schema from\n * a db provided.\n * @beta\n */\nexport class SqliteChangesetReader implements Disposable {\n private readonly _nativeReader = new IModelNative.platform.ChangesetReader();\n private _schemaCache = new Map<string, string[]>();\n private _disableSchemaCheck = false;\n private _changeIndex = 0;\n protected constructor(\n /** db from where sql schema will be read */\n public readonly db: AnyDb,\n ) { }\n\n /**\n * Open changeset file from disk\n * @param args fileName of changeset reader and other options.\n * @returns SqliteChangesetReader instance\n */\n public static openFile(args: { readonly fileName: string } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openFile(args.fileName, args.invert ?? false);\n return reader;\n }\n /**\n * Group changeset file into single changeset and open that changeset.\n * @param args - The arguments for opening the changeset group. Requires an open db.\n * @returns The SqliteChangesetReader instance.\n */\n public static openGroup(args: { readonly changesetFiles: string[] } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n if (args.changesetFiles.length === 0) {\n throw new Error(\"changesetFiles must contain at least one file.\");\n }\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openGroup(args.changesetFiles, args.db[_nativeDb], args.invert ?? false);\n return reader;\n }\n /**\n * Open txn change in iModel.\n * @param args iModel and other options.\n * @returns SqliteChangesetReader instance\n */\n public static openTxn(args: { txnId: Id64String } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n if (args.db instanceof ECDb) {\n throw new Error(\"ECDb does not support openTxn\");\n }\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openTxn(args.db[_nativeDb], args.txnId, args.invert ?? false);\n return reader;\n }\n /**\n * Writes the changeset to a file.\n * @note can be use with openGroup() or openLocalChanges() to persist changeset.\n * @param args - The arguments for writing to the file.\n * @param args.fileName - The name of the file to write to.\n * @param args.containsSchemaChanges - Indicates whether the changeset contains schema changes.\n * @param args.overwriteFile - Indicates whether to override the file if it already exists. Default is false.\n */\n public writeToFile(args: { fileName: string, containsSchemaChanges: boolean, overwriteFile?: boolean }): void {\n this._nativeReader.writeToFile(args.fileName, args.containsSchemaChanges, args.overwriteFile ?? false);\n }\n /**\n * Open local changes in iModel.\n * @param args iModel and other options.\n * @param args.db must be of type IModelDb\n * @returns SqliteChangesetReader instance\n */\n public static openLocalChanges(args: Omit<SqliteChangesetReaderArgs, \"db\"> & { db: IModelDb, includeInMemoryChanges?: true }): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openLocalChanges(args.db[_nativeDb], args.includeInMemoryChanges ?? false, args.invert ?? false);\n return reader;\n }\n /** check if schema check is disabled or not */\n public get disableSchemaCheck(): boolean { return this._disableSchemaCheck; }\n /** Move to next change in changeset\n * @returns true if there is current change false if reader is end of changeset.\n * @beta\n */\n public step(): boolean {\n if (this._nativeReader.step()) {\n this._changeIndex++;\n return true;\n }\n return false;\n }\n /** Check if reader current on a row\n * @beta\n */\n public get hasRow(): boolean {\n return this._nativeReader.hasRow();\n }\n /** Check if its current change is indirect\n * @beta\n */\n public get isIndirect(): boolean {\n return this._nativeReader.isIndirectChange();\n }\n /** Get count of columns in current change\n * @beta\n */\n public get columnCount(): number {\n return this._nativeReader.getColumnCount();\n }\n /** Get operation that caused the change\n * @beta\n */\n public get op(): SqliteChangeOp {\n if (this._nativeReader.getOpCode() === DbOpcode.Insert)\n return \"Inserted\";\n\n if (this._nativeReader.getOpCode() === DbOpcode.Delete)\n return \"Deleted\";\n\n return \"Updated\";\n }\n /** Get primary key value array\n * @beta\n */\n public get primaryKeyValues(): SqliteValueArray {\n return this._nativeReader.getPrimaryKeys();\n }\n /** Get primary key columns.\n * @note To this to work db arg must be set when opening changeset file.\n * @beta\n */\n public getPrimaryKeyColumnNames(): string[] {\n const cols = this.getColumnNames(this.tableName);\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\n\n return this._nativeReader.getPrimaryKeyColumnIndexes().map((i) => cols[i]);\n }\n /** Get current change table.\n * @beta\n */\n public get tableName(): string {\n return this._nativeReader.getTableName();\n }\n /**\n * Get changed binary value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType;\n }\n\n /**\n * Get changed binary value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueBinary(columnIndex: number, stage: SqliteValueStage): Uint8Array | null | undefined {\n return this._nativeReader.getColumnValueBinary(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed double value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueDouble(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\n return this._nativeReader.getColumnValueDouble(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed Id value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueId(columnIndex: number, stage: SqliteValueStage): Id64String | null | undefined {\n return this._nativeReader.getColumnValueId(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed integer value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueInteger(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\n return this._nativeReader.getColumnValueInteger(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed text value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueText(columnIndex: number, stage: SqliteValueStage): string | null | undefined {\n return this._nativeReader.getColumnValueText(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Check if change value is null\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns true if value is null\n * @beta\n */\n public isColumnValueNull(columnIndex: number, stage: SqliteValueStage): boolean | undefined {\n return this._nativeReader.isColumnValueNull(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get change value type\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns change value type\n * @beta\n */\n public getColumnValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType | undefined;\n }\n\n /**\n * Get changed value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValue(columnIndex: number, stage: SqliteValueStage): SqliteValue {\n return this._nativeReader.getColumnValue(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n /**\n * Get all changed value in current change as array\n * @param stage old or new values for current change.\n * @returns array of values.\n * @beta\n */\n public getChangeValuesArray(stage: SqliteValueStage): SqliteValueArray | undefined {\n return this._nativeReader.getRow(stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n /**\n * Get change as object and format its content.\n * @param stage old or new value for current change.\n * @param args change format options\n * @returns return object or undefined\n * @beta\n */\n public getChangeValuesObject(stage: SqliteValueStage, args: ChangeFormatArgs = {}): SqliteChange | undefined {\n const cols = this.getColumnNames(this.tableName);\n const row = this.getChangeValuesArray(stage);\n if (!row)\n return undefined;\n process.env;\n const minLen = Math.min(cols.length, row.length);\n\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\n\n const out: SqliteChange = {};\n if (args.includeTableName) {\n out.$table = this.tableName;\n }\n if (args.includeOpCode) {\n out.$op = this.op;\n }\n if (args.includeStage) {\n out.$stage = stage;\n }\n\n if (args.includePrimaryKeyInUpdateNew && this.op === \"Updated\" && stage === \"New\") {\n const pkNames = this.getPrimaryKeyColumnNames();\n const pkValues = this.primaryKeyValues;\n pkNames.forEach((v, i) => {\n out[v] = pkValues[i];\n });\n }\n const isNullOrUndefined = (val: SqliteValue) => typeof val === \"undefined\";\n\n for (let i = 0; i < minLen; ++i) {\n const columnValue = row[i];\n const columnName = cols[i];\n if (!args.includeNullColumns && isNullOrUndefined(columnValue))\n continue;\n\n out[columnName] = columnValue;\n }\n return out;\n }\n /**\n * Get list of column for a table. This function also caches the result.\n * @note To this to work db arg must be set when opening changeset file.\n * @param tableName name of the table for which columns are requested.\n * @returns columns of table.\n * @beta\n */\n public getColumnNames(tableName: string): string[] {\n const columns = this._schemaCache.get(tableName);\n if (columns)\n return columns;\n\n return this.db.withPreparedSqliteStatement(\"SELECT [name] FROM PRAGMA_TABLE_INFO(?) ORDER BY [cid]\", (stmt) => {\n stmt.bindString(1, tableName);\n const tblCols: string[] = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n tblCols.push(stmt.getValueString(0));\n }\n this._schemaCache.set(tableName, tblCols);\n return tblCols;\n });\n }\n /** index of current change\n * @beta\n */\n public get changeIndex() { return this._changeIndex; }\n /**\n * Close changeset\n * @beta\n */\n public close() {\n this._changeIndex = 0;\n this._nativeReader.close();\n }\n /**\n * Dispose this object\n * @beta\n */\n public [Symbol.dispose](): void {\n this.close();\n }\n}\n"]}
1
+ {"version":3,"file":"SqliteChangesetReader.js","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAA2B,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAoE/C;;;;;GAKG;AACH,MAAM,OAAO,qBAAqB;IAOd;IAND,aAAa,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;IACrE,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,mBAAmB,GAAG,KAAK,CAAC;IAC5B,YAAY,GAAG,CAAC,CAAC;IACzB;IACE,4CAA4C;IAC5B,EAAS;QAAT,OAAE,GAAF,EAAE,CAAO;IACvB,CAAC;IAEL;;;;OAIG;IACI,MAAM,CAAC,QAAQ,CAAC,IAA+D;QACpF,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC9D,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,SAAS,CAAC,IAAuE;QAC7F,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC9D,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;QAC9F,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,OAAO,CAAC,IAAuD;QAC3E,IAAI,IAAI,CAAC,EAAE,YAAY,IAAI,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC9D,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;QACnF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,YAAY,CAAC,IAAkD;QAC3E,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC9D,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;QACnF,OAAO,MAAM,CAAC;IAChB,CAAC;IACD;;;;;;;OAOG;IACI,WAAW,CAAC,IAAmF;QACpG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC;IACzG,CAAC;IACD;;;;;OAKG;IACI,MAAM,CAAC,gBAAgB,CAAC,IAA6F;QAC1H,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC9D,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,sBAAsB,IAAI,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;QACtH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,+CAA+C;IAC/C,IAAW,kBAAkB,KAAc,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7E;;;MAGE;IACK,IAAI;QACT,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD;;MAEE;IACF,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;IACrC,CAAC;IACD;;MAEE;IACF,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;IAC/C,CAAC;IACD;;MAEE;IACF,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;IAC7C,CAAC;IACD;;MAEE;IACF,IAAW,EAAE;QACX,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,QAAQ,CAAC,MAAM;YACpD,OAAO,UAAU,CAAC;QAEpB,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,QAAQ,CAAC,MAAM;YACpD,OAAO,SAAS,CAAC;QAEnB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD;;MAEE;IACF,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;IAC7C,CAAC;IACD;;;OAGG;IACI,wBAAwB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW;YAC/D,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,oDAAoD,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAE7I,OAAO,IAAI,CAAC,aAAa,CAAC,0BAA0B,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD;;MAEE;IACF,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;IAC3C,CAAC;IACD;;;;;;OAMG;IACI,kBAAkB,CAAC,WAAmB,EAAE,KAAuB;QACpE,OAAO,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAgB,CAAC;IACpI,CAAC;IAED;;;;;;OAMG;IACI,oBAAoB,CAAC,WAAmB,EAAE,KAAuB;QACtE,OAAO,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvH,CAAC;IAED;;;;;;OAMG;IACI,oBAAoB,CAAC,WAAmB,EAAE,KAAuB;QACtE,OAAO,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvH,CAAC;IAED;;;;;;OAMG;IACI,gBAAgB,CAAC,WAAmB,EAAE,KAAuB;QAClE,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACnH,CAAC;IAED;;;;;;OAMG;IACI,qBAAqB,CAAC,WAAmB,EAAE,KAAuB;QACvE,OAAO,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACxH,CAAC;IAED;;;;;;OAMG;IACI,kBAAkB,CAAC,WAAmB,EAAE,KAAuB;QACpE,OAAO,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACrH,CAAC;IAED;;;;;;OAMG;IACI,iBAAiB,CAAC,WAAmB,EAAE,KAAuB;QACnE,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACpH,CAAC;IAED;;;;;;OAMG;IACI,kBAAkB,CAAC,WAAmB,EAAE,KAAuB;QACpE,OAAO,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAA4B,CAAC;IAChJ,CAAC;IAED;;;;;;OAMG;IACI,cAAc,CAAC,WAAmB,EAAE,KAAuB;QAChE,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,WAAW,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACjH,CAAC;IACD;;;;;OAKG;IACI,oBAAoB,CAAC,KAAuB;QACjD,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD;;;;;;OAMG;IACI,qBAAqB,CAAC,KAAuB,EAAE,OAAyB,EAAE;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG;YACN,OAAO,SAAS,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,WAAW;YAC/D,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,SAAS,oDAAoD,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAE7I,MAAM,GAAG,GAAiB,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,IAAI,IAAI,CAAC,4BAA4B,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YAClF,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACvC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACvB,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,iBAAiB,GAAG,CAAC,GAAgB,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,WAAW,CAAC;QAE3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,iBAAiB,CAAC,WAAW,CAAC;gBAC5D,SAAS;YAEX,GAAG,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD;;;;;;OAMG;IACI,cAAc,CAAC,SAAiB;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QAEjB,OAAO,IAAI,CAAC,EAAE,CAAC,2BAA2B,CAAC,wDAAwD,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5G,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC1C,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IACD;;OAEG;IACH,IAAW,WAAW,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACtD;;;OAGG;IACI,KAAK;QACV,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD;;;OAGG;IACI,CAAC,MAAM,CAAC,OAAO,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module SQLiteDb\n */\nimport { DbChangeStage, DbOpcode, DbResult, DbValueType, Id64String } from \"@itwin/core-bentley\";\nimport { ECDb } from \"./ECDb\";\nimport { IModelDb } from \"./IModelDb\";\nimport { IModelNative } from \"./internal/NativePlatform\";\nimport { _nativeDb } from \"./internal/Symbols\";\n\n/** Changed value type\n * @beta\n*/\ntype SqliteValue = Uint8Array | number | string | null | undefined;\n\n/** Array of changed values\n * @beta\n*/\ntype SqliteValueArray = SqliteValue[];\n/**\n * Format option when converting change from array to column/value object.\n * @beta\n */\nexport interface ChangeFormatArgs {\n /** include table name */\n includeTableName?: true;\n /** include op code */\n includeOpCode?: true;\n /** include null columns */\n includeNullColumns?: true;\n /** include value version */\n includeStage?: true;\n /** include primary key in update change */\n includePrimaryKeyInUpdateNew?: true;\n}\n\n/** Operation that cause the change\n * @beta\n*/\nexport type SqliteChangeOp = \"Inserted\" | \"Updated\" | \"Deleted\";\n\n/** Stage is version of value that needed to be read\n * @beta\n*/\nexport type SqliteValueStage = \"Old\" | \"New\";\n\n/** Db from which schema will be read. It should be from timeline to which changeset belong.\n * @beta\n*/\nexport type AnyDb = IModelDb | ECDb;\n\n/** Arg to open a changeset file from disk\n * @beta\n*/\nexport interface SqliteChangesetReaderArgs {\n /** db from which schema will be read. It should be at or ahead of the latest changeset being opened.*/\n readonly db: AnyDb;\n /** invert the changeset operations */\n readonly invert?: true;\n /** do not check if column of change match db schema instead ignore addition columns */\n readonly disableSchemaCheck?: true;\n}\n/**\n * Represent sqlite change.\n * @beta\n */\nexport interface SqliteChange {\n /** name of table */\n $table?: string;\n /** SQLite operation that created this change */\n $op?: SqliteChangeOp;\n /** version of data in change. */\n $stage?: SqliteValueStage;\n /** columns in change */\n [key: string]: any;\n}\n/**\n * Read raw sqlite changeset from disk and enumerate changes.\n * It also optionally let you format change with schema from\n * a db provided.\n * @beta\n */\nexport class SqliteChangesetReader implements Disposable {\n private readonly _nativeReader = new IModelNative.platform.ChangesetReader();\n private _schemaCache = new Map<string, string[]>();\n private _disableSchemaCheck = false;\n private _changeIndex = 0;\n protected constructor(\n /** db from where sql schema will be read */\n public readonly db: AnyDb,\n ) { }\n\n /**\n * Open changeset file from disk\n * @param args fileName of changeset reader and other options.\n * @returns SqliteChangesetReader instance\n */\n public static openFile(args: { readonly fileName: string } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openFile(args.fileName, args.invert ?? false);\n return reader;\n }\n /**\n * Group changeset file into single changeset and open that changeset.\n * @param args - The arguments for opening the changeset group. Requires an open db.\n * @returns The SqliteChangesetReader instance.\n */\n public static openGroup(args: { readonly changesetFiles: string[] } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n if (args.changesetFiles.length === 0) {\n throw new Error(\"changesetFiles must contain at least one file.\");\n }\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openGroup(args.changesetFiles, args.db[_nativeDb], args.invert ?? false);\n return reader;\n }\n /**\n * Open txn change in iModel.\n * @param args iModel and other options.\n * @returns SqliteChangesetReader instance\n */\n public static openTxn(args: { txnId: Id64String } & SqliteChangesetReaderArgs): SqliteChangesetReader {\n if (args.db instanceof ECDb) {\n throw new Error(\"ECDb does not support openTxn\");\n }\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openTxn(args.db[_nativeDb], args.txnId, args.invert ?? false);\n return reader;\n }\n /**\n * Open in-memory changes for the given iModel.\n * @param args - The arguments for opening in-memory changes.\n * @returns SqliteChangesetReader instance\n */\n public static openInMemory(args: SqliteChangesetReaderArgs & { db: IModelDb }): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openInMemoryChanges(args.db[_nativeDb], args.invert ?? false);\n return reader;\n }\n /**\n * Writes the changeset to a file.\n * @note can be use with openGroup() or openLocalChanges() to persist changeset.\n * @param args - The arguments for writing to the file.\n * @param args.fileName - The name of the file to write to.\n * @param args.containsSchemaChanges - Indicates whether the changeset contains schema changes.\n * @param args.overwriteFile - Indicates whether to override the file if it already exists. Default is false.\n */\n public writeToFile(args: { fileName: string, containsSchemaChanges: boolean, overwriteFile?: boolean }): void {\n this._nativeReader.writeToFile(args.fileName, args.containsSchemaChanges, args.overwriteFile ?? false);\n }\n /**\n * Open local changes in iModel.\n * @param args iModel and other options.\n * @param args.db must be of type IModelDb\n * @returns SqliteChangesetReader instance\n */\n public static openLocalChanges(args: Omit<SqliteChangesetReaderArgs, \"db\"> & { db: IModelDb, includeInMemoryChanges?: true }): SqliteChangesetReader {\n const reader = new SqliteChangesetReader(args.db);\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\n reader._nativeReader.openLocalChanges(args.db[_nativeDb], args.includeInMemoryChanges ?? false, args.invert ?? false);\n return reader;\n }\n /** check if schema check is disabled or not */\n public get disableSchemaCheck(): boolean { return this._disableSchemaCheck; }\n /** Move to next change in changeset\n * @returns true if there is current change false if reader is end of changeset.\n * @beta\n */\n public step(): boolean {\n if (this._nativeReader.step()) {\n this._changeIndex++;\n return true;\n }\n return false;\n }\n /** Check if reader current on a row\n * @beta\n */\n public get hasRow(): boolean {\n return this._nativeReader.hasRow();\n }\n /** Check if its current change is indirect\n * @beta\n */\n public get isIndirect(): boolean {\n return this._nativeReader.isIndirectChange();\n }\n /** Get count of columns in current change\n * @beta\n */\n public get columnCount(): number {\n return this._nativeReader.getColumnCount();\n }\n /** Get operation that caused the change\n * @beta\n */\n public get op(): SqliteChangeOp {\n if (this._nativeReader.getOpCode() === DbOpcode.Insert)\n return \"Inserted\";\n\n if (this._nativeReader.getOpCode() === DbOpcode.Delete)\n return \"Deleted\";\n\n return \"Updated\";\n }\n /** Get primary key value array\n * @beta\n */\n public get primaryKeyValues(): SqliteValueArray {\n return this._nativeReader.getPrimaryKeys();\n }\n /** Get primary key columns.\n * @note To this to work db arg must be set when opening changeset file.\n * @beta\n */\n public getPrimaryKeyColumnNames(): string[] {\n const cols = this.getColumnNames(this.tableName);\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\n\n return this._nativeReader.getPrimaryKeyColumnIndexes().map((i) => cols[i]);\n }\n /** Get current change table.\n * @beta\n */\n public get tableName(): string {\n return this._nativeReader.getTableName();\n }\n /**\n * Get changed binary value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType;\n }\n\n /**\n * Get changed binary value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueBinary(columnIndex: number, stage: SqliteValueStage): Uint8Array | null | undefined {\n return this._nativeReader.getColumnValueBinary(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed double value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueDouble(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\n return this._nativeReader.getColumnValueDouble(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed Id value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueId(columnIndex: number, stage: SqliteValueStage): Id64String | null | undefined {\n return this._nativeReader.getColumnValueId(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed integer value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueInteger(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\n return this._nativeReader.getColumnValueInteger(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get changed text value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValueText(columnIndex: number, stage: SqliteValueStage): string | null | undefined {\n return this._nativeReader.getColumnValueText(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Check if change value is null\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns true if value is null\n * @beta\n */\n public isColumnValueNull(columnIndex: number, stage: SqliteValueStage): boolean | undefined {\n return this._nativeReader.isColumnValueNull(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n\n /**\n * Get change value type\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns change value type\n * @beta\n */\n public getColumnValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType | undefined;\n }\n\n /**\n * Get changed value for a column\n * @param columnIndex index of column in current change\n * @param stage old or new value for change.\n * @returns value for changed column\n * @beta\n */\n public getChangeValue(columnIndex: number, stage: SqliteValueStage): SqliteValue {\n return this._nativeReader.getColumnValue(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n /**\n * Get all changed value in current change as array\n * @param stage old or new values for current change.\n * @returns array of values.\n * @beta\n */\n public getChangeValuesArray(stage: SqliteValueStage): SqliteValueArray | undefined {\n return this._nativeReader.getRow(stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\n }\n /**\n * Get change as object and format its content.\n * @param stage old or new value for current change.\n * @param args change format options\n * @returns return object or undefined\n * @beta\n */\n public getChangeValuesObject(stage: SqliteValueStage, args: ChangeFormatArgs = {}): SqliteChange | undefined {\n const cols = this.getColumnNames(this.tableName);\n const row = this.getChangeValuesArray(stage);\n if (!row)\n return undefined;\n process.env;\n const minLen = Math.min(cols.length, row.length);\n\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\n\n const out: SqliteChange = {};\n if (args.includeTableName) {\n out.$table = this.tableName;\n }\n if (args.includeOpCode) {\n out.$op = this.op;\n }\n if (args.includeStage) {\n out.$stage = stage;\n }\n\n if (args.includePrimaryKeyInUpdateNew && this.op === \"Updated\" && stage === \"New\") {\n const pkNames = this.getPrimaryKeyColumnNames();\n const pkValues = this.primaryKeyValues;\n pkNames.forEach((v, i) => {\n out[v] = pkValues[i];\n });\n }\n const isNullOrUndefined = (val: SqliteValue) => typeof val === \"undefined\";\n\n for (let i = 0; i < minLen; ++i) {\n const columnValue = row[i];\n const columnName = cols[i];\n if (!args.includeNullColumns && isNullOrUndefined(columnValue))\n continue;\n\n out[columnName] = columnValue;\n }\n return out;\n }\n /**\n * Get list of column for a table. This function also caches the result.\n * @note To this to work db arg must be set when opening changeset file.\n * @param tableName name of the table for which columns are requested.\n * @returns columns of table.\n * @beta\n */\n public getColumnNames(tableName: string): string[] {\n const columns = this._schemaCache.get(tableName);\n if (columns)\n return columns;\n\n return this.db.withPreparedSqliteStatement(\"SELECT [name] FROM PRAGMA_TABLE_INFO(?) ORDER BY [cid]\", (stmt) => {\n stmt.bindString(1, tableName);\n const tblCols: string[] = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n tblCols.push(stmt.getValueString(0));\n }\n this._schemaCache.set(tableName, tblCols);\n return tblCols;\n });\n }\n /** index of current change\n * @beta\n */\n public get changeIndex() { return this._changeIndex; }\n /**\n * Close changeset\n * @beta\n */\n public close() {\n this._changeIndex = 0;\n this._nativeReader.close();\n }\n /**\n * Dispose this object\n * @beta\n */\n public [Symbol.dispose](): void {\n this.close();\n }\n}\n"]}
@@ -60,7 +60,7 @@ import { Arc3d, IModelJson, Point3d } from "@itwin/core-geometry";
60
60
  import { assert, expect } from "chai";
61
61
  import * as path from "node:path";
62
62
  import { DrawingCategory } from "../../Category";
63
- import { ChangesetECAdaptor as ECChangesetAdaptor, ECChangeUnifierCache, PartialECChangeUnifier } from "../../ChangesetECAdaptor";
63
+ import { ChangesetECAdaptor, ChangesetECAdaptor as ECChangesetAdaptor, ECChangeUnifierCache, PartialECChangeUnifier } from "../../ChangesetECAdaptor";
64
64
  import { HubMock } from "../../internal/HubMock";
65
65
  import { SnapshotDb } from "../../IModelDb";
66
66
  import { SqliteChangesetReader } from "../../SqliteChangesetReader";
@@ -1298,5 +1298,135 @@ describe("Changeset Reader API", async () => {
1298
1298
  // Cleanup
1299
1299
  await Promise.all([secondBriefcase.close(), firstBriefcase.close()]);
1300
1300
  });
1301
+ it("openInMemory() & step()", async () => {
1302
+ const adminToken = "super manager token";
1303
+ const iModelName = "test";
1304
+ const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: "TestSubject", accessToken: adminToken });
1305
+ assert.isNotEmpty(rwIModelId);
1306
+ const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });
1307
+ // 1. Import schema with class that span overflow table.
1308
+ const schema = `<?xml version="1.0" encoding="UTF-8"?>
1309
+ <ECSchema schemaName="TestDomain" alias="ts" version="01.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
1310
+ <ECSchemaReference name="BisCore" version="01.00" alias="bis"/>
1311
+ <ECEntityClass typeName="Test2dElement">
1312
+ <BaseClass>bis:GraphicalElement2d</BaseClass>
1313
+ <ECProperty propertyName="p1" typeName="string"/>
1314
+ </ECEntityClass>
1315
+ </ECSchema>`;
1316
+ await rwIModel.importSchemaStrings([schema]);
1317
+ rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);
1318
+ // Create drawing model and category
1319
+ await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });
1320
+ const codeProps = Code.createEmpty();
1321
+ codeProps.value = "DrawingModel";
1322
+ const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);
1323
+ let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, "MyDrawingCategory");
1324
+ if (undefined === drawingCategoryId)
1325
+ drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, "MyDrawingCategory", new SubCategoryAppearance({ color: ColorDef.fromString("rgb(255,0,0)").toJSON() }));
1326
+ rwIModel.saveChanges();
1327
+ await rwIModel.pushChanges({ description: "setup category", accessToken: adminToken });
1328
+ const geomArray = [
1329
+ Arc3d.createXY(Point3d.create(0, 0), 5),
1330
+ Arc3d.createXY(Point3d.create(5, 5), 2),
1331
+ Arc3d.createXY(Point3d.create(-5, -5), 20),
1332
+ ];
1333
+ const geometryStream = [];
1334
+ for (const geom of geomArray) {
1335
+ const arcData = IModelJson.Writer.toIModelJson(geom);
1336
+ geometryStream.push(arcData);
1337
+ }
1338
+ const e1 = {
1339
+ classFullName: `TestDomain:Test2dElement`,
1340
+ model: drawingModelId,
1341
+ category: drawingCategoryId,
1342
+ code: Code.createEmpty(),
1343
+ geom: geometryStream,
1344
+ ...{ p1: "test1" },
1345
+ };
1346
+ // 2. Insert a element for the class
1347
+ await rwIModel.locks.acquireLocks({ shared: drawingModelId });
1348
+ const e1id = rwIModel.elements.insertElement(e1);
1349
+ assert.isTrue(Id64.isValidId64(e1id), "insert worked");
1350
+ if (true) {
1351
+ const reader = SqliteChangesetReader.openInMemory({ db: rwIModel, disableSchemaCheck: true });
1352
+ const adaptor = new ChangesetECAdaptor(reader);
1353
+ const unifier = new PartialECChangeUnifier(rwIModel);
1354
+ while (adaptor.step()) {
1355
+ unifier.appendFrom(adaptor);
1356
+ }
1357
+ reader.close();
1358
+ // verify the inserted element's properties
1359
+ const instances = Array.from(unifier.instances);
1360
+ expect(instances.length).to.equals(1);
1361
+ const testEl = instances[0];
1362
+ expect(testEl.$meta?.op).to.equals("Inserted");
1363
+ expect(testEl.$meta?.classFullName).to.equals("TestDomain:Test2dElement");
1364
+ expect(testEl.$meta?.stage).to.equals("New");
1365
+ expect(testEl.ECClassId).to.equals("0x168");
1366
+ expect(testEl.ECInstanceId).to.equals(e1id);
1367
+ expect(testEl.Model.Id).to.equals(drawingModelId);
1368
+ expect(testEl.Category.Id).to.equals(drawingCategoryId);
1369
+ expect(testEl.Origin.X).to.equals(0);
1370
+ expect(testEl.Origin.Y).to.equals(0);
1371
+ expect(testEl.Rotation).to.equals(0);
1372
+ expect(testEl.BBoxLow.X).to.equals(-25);
1373
+ expect(testEl.BBoxLow.Y).to.equals(-25);
1374
+ expect(testEl.BBoxHigh.X).to.equals(15);
1375
+ expect(testEl.BBoxHigh.Y).to.equals(15);
1376
+ expect(testEl.p1).to.equals("test1");
1377
+ }
1378
+ // save changes and verify the the txn
1379
+ rwIModel.saveChanges();
1380
+ if (true) {
1381
+ const txnId = rwIModel.txns.getLastSavedTxnProps()?.id;
1382
+ expect(txnId).to.not.be.undefined;
1383
+ const reader = SqliteChangesetReader.openTxn({ db: rwIModel, disableSchemaCheck: true, txnId });
1384
+ const adaptor = new ChangesetECAdaptor(reader);
1385
+ const unifier = new PartialECChangeUnifier(rwIModel);
1386
+ while (adaptor.step()) {
1387
+ unifier.appendFrom(adaptor);
1388
+ }
1389
+ reader.close();
1390
+ // verify the inserted element's properties
1391
+ const instances = Array.from(unifier.instances);
1392
+ expect(instances.length).to.equals(3);
1393
+ // DrawingModel new instance
1394
+ const drawingModelElNew = instances[0];
1395
+ expect(drawingModelElNew.$meta?.op).to.equals("Updated");
1396
+ expect(drawingModelElNew.$meta?.classFullName).to.equals("BisCore:DrawingModel");
1397
+ expect(drawingModelElNew.$meta?.stage).to.equals("New");
1398
+ expect(drawingModelElNew.ECClassId).to.equals("0xaa");
1399
+ expect(drawingModelElNew.ECInstanceId).to.equals(drawingModelId);
1400
+ expect(drawingModelElNew.LastMod).to.exist;
1401
+ expect(drawingModelElNew.GeometryGuid).to.exist;
1402
+ // DrawingModel old instance
1403
+ const drawingModelElOld = instances[1];
1404
+ expect(drawingModelElOld.$meta?.op).to.equals("Updated");
1405
+ expect(drawingModelElOld.$meta?.classFullName).to.equals("BisCore:DrawingModel");
1406
+ expect(drawingModelElOld.$meta?.stage).to.equals("Old");
1407
+ expect(drawingModelElOld.ECClassId).to.equals("0xaa");
1408
+ expect(drawingModelElOld.ECInstanceId).to.equals(drawingModelId);
1409
+ expect(drawingModelElOld.LastMod).to.null;
1410
+ expect(drawingModelElOld.GeometryGuid).to.null;
1411
+ // Test element instance
1412
+ const testEl = instances[2];
1413
+ expect(testEl.$meta?.op).to.equals("Inserted");
1414
+ expect(testEl.$meta?.classFullName).to.equals("TestDomain:Test2dElement");
1415
+ expect(testEl.$meta?.stage).to.equals("New");
1416
+ expect(testEl.ECClassId).to.equals("0x168");
1417
+ expect(testEl.ECInstanceId).to.equals(e1id);
1418
+ expect(testEl.Model.Id).to.equals(drawingModelId);
1419
+ expect(testEl.Category.Id).to.equals(drawingCategoryId);
1420
+ expect(testEl.Origin.X).to.equals(0);
1421
+ expect(testEl.Origin.Y).to.equals(0);
1422
+ expect(testEl.Rotation).to.equals(0);
1423
+ expect(testEl.BBoxLow.X).to.equals(-25);
1424
+ expect(testEl.BBoxLow.Y).to.equals(-25);
1425
+ expect(testEl.BBoxHigh.X).to.equals(15);
1426
+ expect(testEl.BBoxHigh.Y).to.equals(15);
1427
+ expect(testEl.p1).to.equals("test1");
1428
+ }
1429
+ await rwIModel.pushChanges({ description: "insert element", accessToken: adminToken });
1430
+ });
1301
1431
  });
1302
1432
  //# sourceMappingURL=ChangesetReader.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChangesetReader.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangesetReader.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { DbResult, GuidString, Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Code, ColorDef, GeometryStreamProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\nimport { Arc3d, IModelJson, Point3d } from \"@itwin/core-geometry\";\nimport { assert, expect } from \"chai\";\nimport * as path from \"node:path\";\nimport { DrawingCategory } from \"../../Category\";\nimport { ChangedECInstance, ChangesetECAdaptor as ECChangesetAdaptor, ECChangeUnifierCache, PartialECChangeUnifier } from \"../../ChangesetECAdaptor\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\nimport { SqliteChangeOp, SqliteChangesetReader } from \"../../SqliteChangesetReader\";\nimport { HubWrappers, IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { _nativeDb, ChannelControl } from \"../../core-backend\";\n\ndescribe(\"Changeset Reader API\", async () => {\n let iTwinId: GuidString;\n\n before(() => {\n HubMock.startup(\"ChangesetReaderTest\", KnownTestLocations.outputDir);\n iTwinId = HubMock.iTwinId;\n });\n after(() => HubMock.shutdown());\n it(\"Able to recover from when ExclusiveRootClassId is NULL for overflow table\", async () => {\n /**\n * 1. Import schema with class that span overflow table.\n * 2. Insert a element for the class.\n * 3. Push changes to hub.\n * 4. Update the element.\n * 5. Push changes to hub.\n * 6. Delete the element.\n * 7. Set ExclusiveRootClassId to NULL for overflow table. (Simulate the issue)\n * 8. ECChangesetAdaptor should be able to read the changeset 2 in which element is updated against latest imodel where element is deleted.\n */\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const nProps = 36;\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n // 1. Import schema with class that span overflow table.\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n ${Array(nProps).fill(undefined).map((_, i) => `<ECProperty propertyName=\"p${i}\" typeName=\"string\"/>`).join(\"\\n\")}\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // Create drawing model and category\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n // Insert element with 100 properties\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n const props = Array(nProps).fill(undefined).map((_, i) => {\n return { [`p${i}`]: `test_${i}` };\n }).reduce((acc, curr) => {\n return { ...acc, ...curr };\n }, {});\n\n const geomElement = {\n classFullName: `TestDomain:Test2dElement`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...props,\n };\n\n // 2. Insert a element for the class.\n const id = rwIModel.elements.insertElement(geomElement);\n assert.isTrue(Id64.isValidId64(id), \"insert worked\");\n rwIModel.saveChanges();\n\n // 3. Push changes to hub.\n await rwIModel.pushChanges({ description: \"insert element\", accessToken: adminToken });\n\n // 4. Update the element.\n const updatedElementProps = Object.assign(\n rwIModel.elements.getElementProps(id),\n Array(nProps).fill(undefined).map((_, i) => {\n return { [`p${i}`]: `updated_${i}` };\n }).reduce((acc, curr) => {\n return { ...acc, ...curr };\n }, {}));\n\n await rwIModel.locks.acquireLocks({ exclusive: id });\n rwIModel.elements.updateElement(updatedElementProps);\n rwIModel.saveChanges();\n\n // 5. Push changes to hub.\n await rwIModel.pushChanges({ description: \"update element\", accessToken: adminToken });\n\n await rwIModel.locks.acquireLocks({ exclusive: id });\n\n // 6. Delete the element.\n rwIModel.elements.deleteElement(id);\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"delete element\", accessToken: adminToken });\n\n const targetDir = path.join(KnownTestLocations.outputDir, rwIModelId, \"changesets\");\n const changesets = await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir });\n const reader = SqliteChangesetReader.openFile({ fileName: changesets[1].pathname, db: rwIModel, disableSchemaCheck: true });\n\n // Set ExclusiveRootClassId to NULL for overflow table to simulate the issue\n expect(rwIModel[_nativeDb].executeSql(\"UPDATE ec_Table SET ExclusiveRootClassId=NULL WHERE Name='bis_GeometricElement2d_Overflow'\")).to.be.eq(DbResult.BE_SQLITE_OK);\n\n const adaptor = new ECChangesetAdaptor(reader);\n let assertOnOverflowTable = false;\n\n const expectedInserted = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECClassId: undefined,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECInstanceId: \"\",\n $meta: {\n tables: [\"bis_GeometricElement2d_Overflow\"],\n op: \"Updated\",\n classFullName: \"BisCore:GeometricElement2d\",\n fallbackClassId: \"0x5e\",\n changeIndexes: [3],\n stage: \"New\",\n },\n };\n const expectedDeleted = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECClassId: undefined,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECInstanceId: \"\",\n $meta: {\n tables: [\"bis_GeometricElement2d_Overflow\"],\n op: \"Updated\",\n classFullName: \"BisCore:GeometricElement2d\",\n fallbackClassId: \"0x5e\",\n changeIndexes: [3],\n stage: \"Old\",\n },\n };\n\n while (adaptor.step()) {\n if (adaptor.op === \"Updated\" && adaptor.inserted?.$meta?.tables[0] === \"bis_GeometricElement2d_Overflow\") {\n assert.deepEqual(adaptor.inserted as any, expectedInserted);\n assert.deepEqual(adaptor.deleted as any, expectedDeleted);\n assertOnOverflowTable = true;\n }\n }\n\n assert.isTrue(assertOnOverflowTable);\n rwIModel.close();\n });\n\n function getClassIdByName(iModel: BriefcaseDb, className: string): Id64String {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return iModel.withPreparedStatement(`SELECT ECInstanceId from meta.ECClassDef where Name=?`, (stmt) => {\n stmt.bindString(1, className);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n return stmt.getValue(0).getId();\n });\n }\n\n it(\"Changeset reader / EC adaptor\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"s\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.saveChanges(\"user 1: schema changeset\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"push schema changeset\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n }\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n let totalEl = 0;\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n rwIModel.saveChanges(\"user 1: create drawing partition\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"user 1: create drawing partition\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n }\n\n await rwIModel.locks.acquireLocks({ shared: drawingModelId });\n const insertElements = (imodel: BriefcaseDb, className: string = \"Test2dElement\", noOfElements: number = 10, userProp: (n: number) => object) => {\n for (let m = 0; m < noOfElements; ++m) {\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n const prop = userProp(++totalEl);\n // Create props\n const geomElement = {\n classFullName: `TestDomain:${className}`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...prop,\n };\n const id = imodel.elements.insertElement(geomElement);\n assert.isTrue(Id64.isValidId64(id), \"insert worked\");\n }\n };\n const generatedStr = new Array(10).join(\"x\");\n insertElements(rwIModel, \"Test2dElement\", 1, () => {\n return { s: generatedStr };\n });\n\n const updatedElements = async () => {\n await rwIModel.locks.acquireLocks({ exclusive: \"0x20000000004\" });\n const updatedElement = rwIModel.elements.getElementProps(\"0x20000000004\");\n (updatedElement as any).s = \"updated property\";\n rwIModel.elements.updateElement(updatedElement);\n rwIModel.saveChanges(\"user 1: updated data\");\n await rwIModel.pushChanges({ description: \"user 1: update property id=0x20000000004\", accessToken: adminToken });\n };\n\n rwIModel.saveChanges(\"user 1: data\");\n\n if (true || \"test local changes\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 3);\n\n assert.equal(changes[0].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[0].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[0].$meta?.op, \"Updated\");\n assert.equal(changes[0].$meta?.stage, \"New\");\n assert.isNotNull(changes[0].LastMod);\n assert.isNotNull(changes[0].GeometryGuid);\n\n assert.equal(changes[1].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[1].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[1].$meta?.op, \"Updated\");\n assert.equal(changes[1].$meta?.stage, \"Old\");\n assert.isNull(changes[1].LastMod);\n assert.isNull(changes[1].GeometryGuid);\n\n assert.equal(changes[2].ECInstanceId, \"0x20000000004\");\n assert.equal(changes[2].$meta?.classFullName, \"TestDomain:Test2dElement\");\n assert.equal(changes[2].$meta?.op, \"Inserted\");\n assert.equal(changes[2].$meta?.stage, \"New\");\n\n const el = changes.filter((x) => x.ECInstanceId === \"0x20000000004\")[0];\n assert.equal(el.Rotation, 0);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Origin, { X: 0, Y: 0 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.BBoxLow, { X: -25, Y: -25 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.BBoxHigh, { X: 15, Y: 15 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Category, { Id: \"0x20000000002\", RelECClassId: \"0x6d\" });\n assert.equal(el.s, \"xxxxxxxxx\");\n assert.isNull(el.CodeValue);\n assert.isNull(el.UserLabel);\n assert.isNull(el.JsonProperties);\n assert.instanceOf(el.GeometryStream, Uint8Array);\n assert.typeOf(el.FederationGuid, \"string\");\n assert.typeOf(el.LastMod, \"string\");\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Parent, { Id: null, RelECClassId: null });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.TypeDefinition, { Id: null, RelECClassId: null });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Category, { Id: \"0x20000000002\", RelECClassId: \"0x6d\" });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.CodeSpec, { Id: \"0x1\", RelECClassId: \"0x69\" });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.CodeScope, { Id: \"0x1\", RelECClassId: \"0x6b\" });\n\n assert.deepEqual(el.$meta, {\n tables: [\n \"bis_GeometricElement2d\",\n \"bis_Element\",\n ],\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n changeIndexes: [\n 2,\n 1,\n ],\n stage: \"New\",\n });\n }\n\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openLocalChanges({ db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openLocalChanges({ db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n\n const targetDir = path.join(KnownTestLocations.outputDir, rwIModelId, \"changesets\");\n await rwIModel.pushChanges({ description: \"schema changeset\", accessToken: adminToken });\n\n await updatedElements();\n\n const changesets = await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir });\n if (true || \"updated element\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 4);\n\n const classId: Id64String = getClassIdByName(rwIModel, \"Test2dElement\");\n\n // new value\n assert.equal(changes[2].ECInstanceId, \"0x20000000004\");\n assert.equal(changes[2].ECClassId, classId);\n assert.equal(changes[2].s, \"updated property\");\n assert.equal(changes[2].$meta?.classFullName, \"TestDomain:Test2dElement\");\n assert.equal(changes[2].$meta?.op, \"Updated\");\n assert.equal(changes[2].$meta?.stage, \"New\");\n\n // old value\n assert.equal(changes[3].ECInstanceId, \"0x20000000004\");\n assert.equal(changes[3].ECClassId, classId);\n assert.equal(changes[3].s, \"xxxxxxxxx\");\n assert.equal(changes[3].$meta?.classFullName, \"TestDomain:Test2dElement\");\n assert.equal(changes[3].$meta?.op, \"Updated\");\n assert.equal(changes[3].$meta?.stage, \"Old\");\n };\n\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[3].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[3].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n\n if (true || \"updated element when no classId\") {\n const otherDb = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 4);\n\n // new value\n assert.equal(changes[2].ECInstanceId, \"0x20000000004\");\n assert.isUndefined(changes[2].ECClassId);\n assert.isDefined(changes[2].$meta?.fallbackClassId);\n assert.equal(changes[2].$meta?.fallbackClassId, \"0x3d\");\n assert.isUndefined(changes[2].s);\n assert.equal(changes[2].$meta?.classFullName, \"BisCore:GeometricElement2d\");\n assert.equal(changes[2].$meta?.op, \"Updated\");\n assert.equal(changes[2].$meta?.stage, \"New\");\n\n // old value\n assert.equal(changes[3].ECInstanceId, \"0x20000000004\");\n assert.isUndefined(changes[3].ECClassId);\n assert.isDefined(changes[3].$meta?.fallbackClassId);\n assert.equal(changes[3].$meta?.fallbackClassId, \"0x3d\");\n assert.isUndefined(changes[3].s);\n assert.equal(changes[3].$meta?.classFullName, \"BisCore:GeometricElement2d\");\n assert.equal(changes[3].$meta?.op, \"Updated\");\n assert.equal(changes[3].$meta?.stage, \"Old\");\n };\n\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[3].pathname, db: otherDb, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[3].pathname, db: otherDb, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n\n if (true || \"test changeset file\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 3);\n\n assert.equal(changes[0].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[0].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[0].$meta?.op, \"Updated\");\n assert.equal(changes[0].$meta?.stage, \"New\");\n assert.isNotNull(changes[0].LastMod);\n assert.isNotNull(changes[0].GeometryGuid);\n\n assert.equal(changes[1].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[1].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[1].$meta?.op, \"Updated\");\n assert.equal(changes[1].$meta?.stage, \"Old\");\n assert.isNull(changes[1].LastMod);\n assert.isNull(changes[1].GeometryGuid);\n\n assert.equal(changes[2].ECInstanceId, \"0x20000000004\");\n assert.equal(changes[2].$meta?.classFullName, \"TestDomain:Test2dElement\");\n assert.equal(changes[2].$meta?.op, \"Inserted\");\n assert.equal(changes[2].$meta?.stage, \"New\");\n\n const el = changes.filter((x) => x.ECInstanceId === \"0x20000000004\")[0];\n assert.equal(el.Rotation, 0);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Origin, { X: 0, Y: 0 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.BBoxLow, { X: -25, Y: -25 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.BBoxHigh, { X: 15, Y: 15 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Category, { Id: \"0x20000000002\", RelECClassId: \"0x6d\" });\n assert.equal(el.s, \"xxxxxxxxx\");\n assert.isNull(el.CodeValue);\n assert.isNull(el.UserLabel);\n assert.isNull(el.JsonProperties);\n assert.instanceOf(el.GeometryStream, Uint8Array);\n assert.typeOf(el.FederationGuid, \"string\");\n assert.typeOf(el.LastMod, \"string\");\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Parent, { Id: null, RelECClassId: null });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.TypeDefinition, { Id: null, RelECClassId: null });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Category, { Id: \"0x20000000002\", RelECClassId: \"0x6d\" });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.CodeSpec, { Id: \"0x1\", RelECClassId: \"0x69\" });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.CodeScope, { Id: \"0x1\", RelECClassId: \"0x6b\" });\n\n assert.deepEqual(el.$meta, {\n tables: [\n \"bis_GeometricElement2d\",\n \"bis_Element\",\n ],\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n changeIndexes: [\n 2,\n 1,\n ],\n stage: \"New\",\n });\n }\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n if (true || \"test ChangesetAdaptor.acceptClass()\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 1);\n assert.equal(changes[0].$meta?.classFullName, \"TestDomain:Test2dElement\");\n };\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n adaptor.acceptClass(\"TestDomain.Test2dElement\");\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n adaptor.acceptClass(\"TestDomain.Test2dElement\");\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n if (true || \"test ChangesetAdaptor.adaptor()\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 2);\n assert.equal(changes[0].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[0].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[0].$meta?.op, \"Updated\");\n assert.equal(changes[0].$meta?.stage, \"New\");\n assert.equal(changes[1].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[1].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[1].$meta?.op, \"Updated\");\n assert.equal(changes[1].$meta?.stage, \"Old\");\n };\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n adaptor.acceptOp(\"Updated\")\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n adaptor.acceptOp(\"Updated\")\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n rwIModel.close();\n });\n it(\"revert timeline changes\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n let nProps = 0;\n // 1. Import schema with class that span overflow table.\n const addPropertyAndImportSchema = async () => {\n await rwIModel.acquireSchemaLock();\n ++nProps;\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.${nProps}\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n ${Array(nProps).fill(undefined).map((_, i) => `<ECProperty propertyName=\"p${i + 1}\" typeName=\"string\"/>`).join(\"\\n\")}\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n };\n await addPropertyAndImportSchema();\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // Create drawing model and category\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"setup category\", accessToken: adminToken });\n\n const createEl = async (args: { [key: string]: any }) => {\n await rwIModel.locks.acquireLocks({ exclusive: drawingModelId });\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n\n const e1 = {\n classFullName: `TestDomain:Test2dElement`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...args,\n };\n return rwIModel.elements.insertElement(e1);;\n };\n const updateEl = async (id: Id64String, args: { [key: string]: any }) => {\n await rwIModel.locks.acquireLocks({ exclusive: id });\n const updatedElementProps = Object.assign(rwIModel.elements.getElementProps(id), args);\n rwIModel.elements.updateElement(updatedElementProps);\n };\n\n const deleteEl = async (id: Id64String) => {\n await rwIModel.locks.acquireLocks({ exclusive: id });\n rwIModel.elements.deleteElement(id);\n };\n const getChanges = async () => {\n return HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir: path.join(KnownTestLocations.outputDir, rwIModelId, \"changesets\") });\n };\n\n const findEl = (id: Id64String) => {\n try {\n return rwIModel.elements.getElementProps(id);\n } catch {\n return undefined;\n }\n };\n // 2. Insert a element for the class\n const el1 = await createEl({ p1: \"test1\" });\n const el2 = await createEl({ p1: \"test2\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"insert 2 elements\" });\n\n // 3. Update the element.\n await updateEl(el1, { p1: \"test3\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"update element 1\" });\n\n // 4. Delete the element.\n await deleteEl(el2);\n const el3 = await createEl({ p1: \"test4\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"delete element 2\" });\n\n // 5. import schema and insert element 4 & update element 3\n await addPropertyAndImportSchema();\n const el4 = await createEl({ p1: \"test5\", p2: \"test6\" });\n await updateEl(el3, { p1: \"test7\", p2: \"test8\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"import schema, insert element 4 & update element 3\" });\n\n assert.isDefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isDefined(findEl(el3));\n assert.isDefined(findEl(el4));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\"]);\n // 6. Revert to timeline 2\n await rwIModel.revertAndPushChanges({ toIndex: 2, description: \"revert to timeline 2\" });\n assert.equal((await getChanges()).at(-1)!.description, \"revert to timeline 2\");\n\n assert.isUndefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isUndefined(findEl(el3));\n assert.isUndefined(findEl(el4));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\"]);\n\n await rwIModel.revertAndPushChanges({ toIndex: 6, description: \"reinstate last reverted changeset\" });\n assert.equal((await getChanges()).at(-1)!.description, \"reinstate last reverted changeset\");\n assert.isDefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isDefined(findEl(el3));\n assert.isDefined(findEl(el4));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\"]);\n\n await addPropertyAndImportSchema();\n const el5 = await createEl({ p1: \"test9\", p2: \"test10\", p3: \"test11\" });\n await updateEl(el1, { p1: \"test12\", p2: \"test13\", p3: \"test114\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"import schema, insert element 5 & update element 1\" });\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\", \"p3\"]);\n\n // skip schema changes & auto generated comment\n await rwIModel.revertAndPushChanges({ toIndex: 1, skipSchemaChanges: true });\n assert.equal((await getChanges()).at(-1)!.description, \"Reverted changes from 8 to 1 (schema changes skipped)\");\n assert.isUndefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isUndefined(findEl(el3));\n assert.isUndefined(findEl(el4));\n assert.isUndefined(findEl(el5));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\", \"p3\"]);\n\n await rwIModel.revertAndPushChanges({ toIndex: 9 });\n assert.equal((await getChanges()).at(-1)!.description, \"Reverted changes from 9 to 9\");\n assert.isDefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isDefined(findEl(el3));\n assert.isDefined(findEl(el4));\n assert.isDefined(findEl(el5));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\", \"p3\"]);\n rwIModel.close();\n });\n\n it(\"openGroup() & writeToFile()\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n // 1. Import schema with class that span overflow table.\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"p1\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // Create drawing model and category\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"setup category\", accessToken: adminToken });\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n\n const e1 = {\n classFullName: `TestDomain:Test2dElement`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...{ p1: \"test1\" },\n };\n\n // 2. Insert a element for the class\n await rwIModel.locks.acquireLocks({ shared: drawingModelId });\n const e1id = rwIModel.elements.insertElement(e1);\n assert.isTrue(Id64.isValidId64(e1id), \"insert worked\");\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"insert element\", accessToken: adminToken });\n\n // 3. Update the element.\n const updatedElementProps = Object.assign(rwIModel.elements.getElementProps(e1id), { p1: \"test2\" });\n await rwIModel.locks.acquireLocks({ exclusive: e1id });\n rwIModel.elements.updateElement(updatedElementProps);\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"update element\", accessToken: adminToken });\n\n // 4. Delete the element.\n await rwIModel.locks.acquireLocks({ exclusive: e1id });\n rwIModel.elements.deleteElement(e1id);\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"delete element\", accessToken: adminToken });\n\n const targetDir = path.join(KnownTestLocations.outputDir, rwIModelId, \"changesets\");\n const changesets = (await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir })).slice(1);\n\n const testElementClassId: Id64String = getClassIdByName(rwIModel, \"Test2dElement\");\n const drawingModelClassId: Id64String = getClassIdByName(rwIModel, \"DrawingModel\");\n\n if (true || \"Grouping changeset [2,3,4] should not contain TestDomain:Test2dElement as insert+update+delete=noop\") {\n const reader = SqliteChangesetReader.openGroup({ changesetFiles: changesets.map((c) => c.pathname), db: rwIModel, disableSchemaCheck: true });\n const adaptor = new ECChangesetAdaptor(reader);\n const instances: ({ id: string, classId?: string, op: SqliteChangeOp, classFullName?: string })[] = [];\n while (adaptor.step()) {\n if (adaptor.inserted) {\n instances.push({ id: adaptor.inserted?.ECInstanceId, classId: adaptor.inserted.ECClassId, op: adaptor.op, classFullName: adaptor.inserted.$meta?.classFullName });\n } else if (adaptor.deleted) {\n instances.push({ id: adaptor.deleted?.ECInstanceId, classId: adaptor.deleted.ECClassId, op: adaptor.op, classFullName: adaptor.deleted.$meta?.classFullName });\n }\n }\n\n expect(instances.length).to.eq(1);\n expect(instances[0].id).to.eq(\"0x20000000001\");\n expect(instances[0].classId).to.eq(drawingModelClassId);\n expect(instances[0].op).to.eq(\"Updated\");\n expect(instances[0].classFullName).to.eq(\"BisCore:DrawingModel\");\n }\n\n if (true || \"Grouping changeset [3,4] should contain update+delete=delete TestDomain:Test2dElement\") {\n const reader = SqliteChangesetReader.openGroup({ changesetFiles: changesets.slice(1).map((c) => c.pathname), db: rwIModel, disableSchemaCheck: true });\n const adaptor = new ECChangesetAdaptor(reader);\n const instances: ({ id: string, classId?: string, op: SqliteChangeOp, classFullName?: string })[] = [];\n while (adaptor.step()) {\n if (adaptor.inserted) {\n instances.push({ id: adaptor.inserted?.ECInstanceId, classId: adaptor.inserted.ECClassId, op: adaptor.op, classFullName: adaptor.inserted.$meta?.classFullName });\n } else if (adaptor.deleted) {\n instances.push({ id: adaptor.deleted?.ECInstanceId, classId: adaptor.deleted.ECClassId, op: adaptor.op, classFullName: adaptor.deleted.$meta?.classFullName });\n }\n }\n expect(instances.length).to.eq(3);\n expect(instances[0]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Deleted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[1]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Deleted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[2]).deep.eq({\n id: \"0x20000000001\",\n classId: drawingModelClassId,\n op: \"Updated\",\n classFullName: \"BisCore:DrawingModel\",\n });\n }\n\n const groupCsFile = path.join(KnownTestLocations.outputDir, \"changeset_grouping.ec\");\n if (true || \"Grouping changeset [2,3] should contain insert+update=insert TestDomain:Test2dElement\") {\n const reader = SqliteChangesetReader.openGroup({ changesetFiles: changesets.slice(0, 2).map((c) => c.pathname), db: rwIModel, disableSchemaCheck: true });\n const adaptor = new ECChangesetAdaptor(reader);\n const instances: ({ id: string, classId?: string, op: SqliteChangeOp, classFullName?: string })[] = [];\n while (adaptor.step()) {\n if (adaptor.inserted) {\n instances.push({ id: adaptor.inserted?.ECInstanceId, classId: adaptor.inserted.ECClassId, op: adaptor.op, classFullName: adaptor.inserted.$meta?.classFullName });\n } else if (adaptor.deleted) {\n instances.push({ id: adaptor.deleted?.ECInstanceId, classId: adaptor.deleted.ECClassId, op: adaptor.op, classFullName: adaptor.deleted.$meta?.classFullName });\n }\n }\n expect(instances.length).to.eq(3);\n expect(instances[0]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[1]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[2]).deep.eq({\n id: \"0x20000000001\",\n classId: drawingModelClassId,\n op: \"Updated\",\n classFullName: \"BisCore:DrawingModel\",\n });\n\n reader.writeToFile({ fileName: groupCsFile, containsSchemaChanges: false, overwriteFile: true });\n }\n if (true || \"writeToFile() test\") {\n const reader = SqliteChangesetReader.openFile({ fileName: groupCsFile, db: rwIModel, disableSchemaCheck: true });\n const adaptor = new ECChangesetAdaptor(reader);\n const instances: ({ id: string, classId?: string, op: SqliteChangeOp, classFullName?: string })[] = [];\n while (adaptor.step()) {\n if (adaptor.inserted) {\n instances.push({ id: adaptor.inserted?.ECInstanceId, classId: adaptor.inserted.ECClassId, op: adaptor.op, classFullName: adaptor.inserted.$meta?.classFullName });\n } else if (adaptor.deleted) {\n instances.push({ id: adaptor.deleted?.ECInstanceId, classId: adaptor.deleted.ECClassId, op: adaptor.op, classFullName: adaptor.deleted.$meta?.classFullName });\n }\n }\n expect(instances.length).to.eq(3);\n expect(instances[0]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[1]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[2]).deep.eq({\n id: \"0x20000000001\",\n classId: drawingModelClassId,\n op: \"Updated\",\n classFullName: \"BisCore:DrawingModel\",\n });\n }\n rwIModel.close();\n });\n\n it(\"Delete class FK constraint violation in cache table\", async () => {\n // Helper to check if TestClass exists in schema and cache table for both briefcases\n function checkClass(firstBriefcase: BriefcaseDb, isClassInFirst: boolean, secondBriefcase: BriefcaseDb, isClassInSecond: boolean) {\n const firstItems = firstBriefcase.getSchemaProps(\"TestSchema\").items;\n assert.equal(isClassInFirst, !!firstItems?.TestClass);\n\n const secondItems = secondBriefcase.getSchemaProps(\"TestSchema\").items;\n assert.equal(isClassInSecond, !!secondItems?.TestClass);\n\n const sql = `SELECT ch.classId FROM ec_cache_ClassHierarchy ch JOIN ec_Class c ON ch.classId = c.Id WHERE c.Name = 'TestClass'`;\n const firstStmt = firstBriefcase.prepareSqliteStatement(sql);\n assert.equal(firstStmt.step(), isClassInFirst ? DbResult.BE_SQLITE_ROW : DbResult.BE_SQLITE_DONE);\n firstStmt[Symbol.dispose]();\n\n const secondStmt = secondBriefcase.prepareSqliteStatement(sql);\n assert.equal(secondStmt.step(), isClassInSecond ? DbResult.BE_SQLITE_ROW : DbResult.BE_SQLITE_DONE);\n secondStmt[Symbol.dispose]();\n }\n\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n\n // Open two briefcases for the same iModel\n const [firstBriefCase, secondBriefCase] = await Promise.all([\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken }),\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken })\n ]);\n\n // Enable shared channel for both\n [firstBriefCase, secondBriefCase].forEach(briefcase => briefcase.channels.addAllowedChannel(ChannelControl.sharedChannelName));\n\n await firstBriefCase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"1.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n </ECSchema>`]);\n firstBriefCase.saveChanges(\"import initial schema\");\n\n // Push the changes to the hub\n await firstBriefCase.pushChanges({ description: \"push initial schema changeset\", accessToken: adminToken });\n\n // Sync the second briefcase with the iModel\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n\n checkClass(firstBriefCase, true, secondBriefCase, true);\n\n // Import the schema\n await firstBriefCase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"2.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n </ECSchema>`]);\n firstBriefCase.saveChanges(\"imported schema\");\n\n // Push the changeset to the hub\n await firstBriefCase.pushChanges({ description: \"Delete class major change\", accessToken: adminToken });\n\n checkClass(firstBriefCase, false, secondBriefCase, true);\n\n // Apply the latest changeset to a new briefcase\n try {\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n } catch (error: any) {\n assert.fail(`Should not have failed with the error: ${error.message}`);\n }\n\n checkClass(firstBriefCase, false, secondBriefCase, false);\n\n // Cleanup\n await Promise.all([secondBriefCase.close(), firstBriefCase.close()]);\n });\n\n\n it(\"Delete class FK constraint violation in cache table through a revert\", async () => {\n // Helper to check if TestClass exists in schema and cache table for both briefcases\n function checkClass(className: string, firstBriefcase: BriefcaseDb, isClassInFirst: boolean, secondBriefcase: BriefcaseDb, isClassInSecond: boolean) {\n assert.equal(isClassInFirst, !!firstBriefcase.getSchemaProps(\"TestSchema\").items?.[className]);\n assert.equal(isClassInSecond, !!secondBriefcase.getSchemaProps(\"TestSchema\").items?.[className]);\n\n const sql = `SELECT ch.classId FROM ec_cache_ClassHierarchy ch JOIN ec_Class c ON ch.classId = c.Id WHERE c.Name = '${className}'`;\n const firstStmt = firstBriefcase.prepareSqliteStatement(sql);\n assert.equal(firstStmt.step(), isClassInFirst ? DbResult.BE_SQLITE_ROW : DbResult.BE_SQLITE_DONE);\n firstStmt[Symbol.dispose]();\n\n const secondStmt = secondBriefcase.prepareSqliteStatement(sql);\n assert.equal(secondStmt.step(), isClassInSecond ? DbResult.BE_SQLITE_ROW : DbResult.BE_SQLITE_DONE);\n secondStmt[Symbol.dispose]();\n }\n\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n\n // Open two briefcases for the same iModel\n const [firstBriefCase, secondBriefCase] = await Promise.all([\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken }),\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken })\n ]);\n\n // Enable shared channel for both\n [firstBriefCase, secondBriefCase].forEach(briefcase => briefcase.channels.addAllowedChannel(ChannelControl.sharedChannelName));\n\n await firstBriefCase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"1.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n </ECSchema>`]);\n firstBriefCase.saveChanges(\"import initial schema\");\n\n // Push the changes to the hub\n await firstBriefCase.pushChanges({ description: \"push initial schema changeset\", accessToken: adminToken });\n // Sync the second briefcase\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n\n checkClass(\"TestClass\", firstBriefCase, true, secondBriefCase, true);\n\n // Import the schema\n await firstBriefCase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"1.0.1\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n\n <ECEntityClass typeName=\"AnotherTestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n </ECSchema>`]);\n firstBriefCase.saveChanges(\"imported schema\");\n\n // Push the changeset to the hub\n await firstBriefCase.pushChanges({ description: \"Add another class change\", accessToken: adminToken });\n // Sync the second briefcase\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n\n checkClass(\"TestClass\", firstBriefCase, true, secondBriefCase, true);\n checkClass(\"AnotherTestClass\", firstBriefCase, true, secondBriefCase, true);\n\n // Revert the latest changeset from the first briefcase\n try {\n await firstBriefCase.revertAndPushChanges({ toIndex: 2, description: \"Revert last changeset\" });\n } catch (error: any) {\n assert.fail(`Should not have failed with the error: ${error.message}`);\n }\n\n checkClass(\"TestClass\", firstBriefCase, true, secondBriefCase, true);\n checkClass(\"AnotherTestClass\", firstBriefCase, false, secondBriefCase, true);\n\n try {\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n } catch (error: any) {\n assert.fail(`Should not have failed with the error: ${error.message}`);\n }\n\n checkClass(\"TestClass\", firstBriefCase, true, secondBriefCase, true);\n checkClass(\"AnotherTestClass\", firstBriefCase, false, secondBriefCase, false);\n\n // Cleanup\n await Promise.all([secondBriefCase.close(), firstBriefCase.close()]);\n });\n\n it(\"Track changeset health stats\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n\n // Open two briefcases for the same iModel\n const [firstBriefcase, secondBriefcase] = await Promise.all([\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken }),\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken })\n ]);\n\n [firstBriefcase, secondBriefcase].forEach(briefcase => briefcase.channels.addAllowedChannel(ChannelControl.sharedChannelName));\n\n await firstBriefcase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"1.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n </ECSchema>`]);\n firstBriefcase.saveChanges(\"import initial schema\");\n\n // Enable changeset tracking for both briefcases\n await Promise.all([firstBriefcase.enableChangesetStatTracking(), secondBriefcase.enableChangesetStatTracking()]);\n\n await firstBriefcase.pushChanges({ description: \"push initial schema changeset\", accessToken: adminToken });\n await secondBriefcase.pullChanges({ accessToken: adminToken });\n\n // Schema upgrade\n await secondBriefcase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"2.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n <ECProperty propertyName=\"TestProperty\" typeName=\"string\"/>\n </ECEntityClass>\n\n <ECEnumeration typeName=\"TestEnum\" backingTypeName=\"int\" isStrict=\"true\">\n <ECEnumerator name=\"Enumerator1\" value=\"1\" displayLabel=\"TestEnumerator1\"/>\n <ECEnumerator name=\"Enumerator2\" value=\"2\" displayLabel=\"TestEnumerator2\"/>\n </ECEnumeration>\n </ECSchema>`]);\n secondBriefcase.saveChanges(\"imported schema\");\n\n await secondBriefcase.pushChanges({ description: \"Added a property to TestClass and an enum\", accessToken: adminToken });\n await firstBriefcase.pullChanges({ accessToken: adminToken });\n\n // Major schema change\n await firstBriefcase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"2.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEnumeration typeName=\"TestEnum\" backingTypeName=\"int\" isStrict=\"true\">\n <ECEnumerator name=\"Enumerator1\" value=\"1\" displayLabel=\"TestEnumerator1\"/>\n <ECEnumerator name=\"Enumerator2\" value=\"2\" displayLabel=\"TestEnumerator2\"/>\n </ECEnumeration>\n </ECSchema>`]);\n firstBriefcase.saveChanges(\"imported schema\");\n\n await firstBriefcase.pushChanges({ description: \"Deleted TestClass\", accessToken: adminToken });\n await secondBriefcase.pullChanges({ accessToken: adminToken });\n\n const firstBriefcaseChangesets = await firstBriefcase.getAllChangesetHealthData();\n const secondBriefcaseChangesets = await secondBriefcase.getAllChangesetHealthData();\n\n assert.equal(firstBriefcaseChangesets.length, 1);\n const firstBriefcaseChangeset = firstBriefcaseChangesets[0];\n\n expect(firstBriefcaseChangeset.uncompressedSizeBytes).to.be.greaterThan(300);\n expect(firstBriefcaseChangeset.insertedRows).to.be.greaterThanOrEqual(4);\n expect(firstBriefcaseChangeset.updatedRows).to.be.greaterThanOrEqual(1);\n expect(firstBriefcaseChangeset.deletedRows).to.be.eql(0);\n expect(firstBriefcaseChangeset.totalFullTableScans).to.be.eql(0);\n expect(firstBriefcaseChangeset.perStatementStats.length).to.be.eql(5);\n\n assert.equal(secondBriefcaseChangesets.length, 2);\n const [secondBriefcaseChangeset1, secondBriefcaseChangeset2] = secondBriefcaseChangesets;\n\n expect(secondBriefcaseChangeset1.uncompressedSizeBytes).to.be.greaterThan(40000);\n expect(secondBriefcaseChangeset1.insertedRows).to.be.greaterThanOrEqual(52);\n expect(secondBriefcaseChangeset1.updatedRows).to.be.greaterThanOrEqual(921);\n expect(secondBriefcaseChangeset1.deletedRows).to.be.eql(0);\n expect(secondBriefcaseChangeset1.totalFullTableScans).to.be.eql(0);\n expect(secondBriefcaseChangeset1.perStatementStats.length).to.be.eql(11);\n\n expect(secondBriefcaseChangeset2.uncompressedSizeBytes).to.be.greaterThan(40000);\n expect(secondBriefcaseChangeset2.insertedRows).to.be.eql(0);\n expect(secondBriefcaseChangeset2.updatedRows).to.be.greaterThanOrEqual(921);\n expect(secondBriefcaseChangeset2.deletedRows).to.be.greaterThanOrEqual(52);\n expect(secondBriefcaseChangeset2.totalFullTableScans).to.be.eql(0);\n expect(secondBriefcaseChangeset2.perStatementStats.length).to.be.eql(11);\n\n // Cleanup\n await Promise.all([secondBriefcase.close(), firstBriefcase.close()]);\n });\n});\n"]}
1
+ {"version":3,"file":"ChangesetReader.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ChangesetReader.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { DbResult, GuidString, Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Code, ColorDef, GeometryStreamProps, IModel, SubCategoryAppearance } from \"@itwin/core-common\";\nimport { Arc3d, IModelJson, Point3d } from \"@itwin/core-geometry\";\nimport { assert, expect } from \"chai\";\nimport * as path from \"node:path\";\nimport { DrawingCategory } from \"../../Category\";\nimport { ChangedECInstance, ChangesetECAdaptor, ChangesetECAdaptor as ECChangesetAdaptor, ECChangeUnifierCache, PartialECChangeUnifier } from \"../../ChangesetECAdaptor\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\nimport { SqliteChangeOp, SqliteChangesetReader } from \"../../SqliteChangesetReader\";\nimport { HubWrappers, IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { _nativeDb, ChannelControl } from \"../../core-backend\";\n\ndescribe(\"Changeset Reader API\", async () => {\n let iTwinId: GuidString;\n\n before(() => {\n HubMock.startup(\"ChangesetReaderTest\", KnownTestLocations.outputDir);\n iTwinId = HubMock.iTwinId;\n });\n after(() => HubMock.shutdown());\n it(\"Able to recover from when ExclusiveRootClassId is NULL for overflow table\", async () => {\n /**\n * 1. Import schema with class that span overflow table.\n * 2. Insert a element for the class.\n * 3. Push changes to hub.\n * 4. Update the element.\n * 5. Push changes to hub.\n * 6. Delete the element.\n * 7. Set ExclusiveRootClassId to NULL for overflow table. (Simulate the issue)\n * 8. ECChangesetAdaptor should be able to read the changeset 2 in which element is updated against latest imodel where element is deleted.\n */\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const nProps = 36;\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n // 1. Import schema with class that span overflow table.\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n ${Array(nProps).fill(undefined).map((_, i) => `<ECProperty propertyName=\"p${i}\" typeName=\"string\"/>`).join(\"\\n\")}\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // Create drawing model and category\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n // Insert element with 100 properties\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n const props = Array(nProps).fill(undefined).map((_, i) => {\n return { [`p${i}`]: `test_${i}` };\n }).reduce((acc, curr) => {\n return { ...acc, ...curr };\n }, {});\n\n const geomElement = {\n classFullName: `TestDomain:Test2dElement`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...props,\n };\n\n // 2. Insert a element for the class.\n const id = rwIModel.elements.insertElement(geomElement);\n assert.isTrue(Id64.isValidId64(id), \"insert worked\");\n rwIModel.saveChanges();\n\n // 3. Push changes to hub.\n await rwIModel.pushChanges({ description: \"insert element\", accessToken: adminToken });\n\n // 4. Update the element.\n const updatedElementProps = Object.assign(\n rwIModel.elements.getElementProps(id),\n Array(nProps).fill(undefined).map((_, i) => {\n return { [`p${i}`]: `updated_${i}` };\n }).reduce((acc, curr) => {\n return { ...acc, ...curr };\n }, {}));\n\n await rwIModel.locks.acquireLocks({ exclusive: id });\n rwIModel.elements.updateElement(updatedElementProps);\n rwIModel.saveChanges();\n\n // 5. Push changes to hub.\n await rwIModel.pushChanges({ description: \"update element\", accessToken: adminToken });\n\n await rwIModel.locks.acquireLocks({ exclusive: id });\n\n // 6. Delete the element.\n rwIModel.elements.deleteElement(id);\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"delete element\", accessToken: adminToken });\n\n const targetDir = path.join(KnownTestLocations.outputDir, rwIModelId, \"changesets\");\n const changesets = await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir });\n const reader = SqliteChangesetReader.openFile({ fileName: changesets[1].pathname, db: rwIModel, disableSchemaCheck: true });\n\n // Set ExclusiveRootClassId to NULL for overflow table to simulate the issue\n expect(rwIModel[_nativeDb].executeSql(\"UPDATE ec_Table SET ExclusiveRootClassId=NULL WHERE Name='bis_GeometricElement2d_Overflow'\")).to.be.eq(DbResult.BE_SQLITE_OK);\n\n const adaptor = new ECChangesetAdaptor(reader);\n let assertOnOverflowTable = false;\n\n const expectedInserted = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECClassId: undefined,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECInstanceId: \"\",\n $meta: {\n tables: [\"bis_GeometricElement2d_Overflow\"],\n op: \"Updated\",\n classFullName: \"BisCore:GeometricElement2d\",\n fallbackClassId: \"0x5e\",\n changeIndexes: [3],\n stage: \"New\",\n },\n };\n const expectedDeleted = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECClassId: undefined,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n ECInstanceId: \"\",\n $meta: {\n tables: [\"bis_GeometricElement2d_Overflow\"],\n op: \"Updated\",\n classFullName: \"BisCore:GeometricElement2d\",\n fallbackClassId: \"0x5e\",\n changeIndexes: [3],\n stage: \"Old\",\n },\n };\n\n while (adaptor.step()) {\n if (adaptor.op === \"Updated\" && adaptor.inserted?.$meta?.tables[0] === \"bis_GeometricElement2d_Overflow\") {\n assert.deepEqual(adaptor.inserted as any, expectedInserted);\n assert.deepEqual(adaptor.deleted as any, expectedDeleted);\n assertOnOverflowTable = true;\n }\n }\n\n assert.isTrue(assertOnOverflowTable);\n rwIModel.close();\n });\n\n function getClassIdByName(iModel: BriefcaseDb, className: string): Id64String {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return iModel.withPreparedStatement(`SELECT ECInstanceId from meta.ECClassDef where Name=?`, (stmt) => {\n stmt.bindString(1, className);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n return stmt.getValue(0).getId();\n });\n }\n\n it(\"Changeset reader / EC adaptor\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"s\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.saveChanges(\"user 1: schema changeset\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"push schema changeset\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n }\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n let totalEl = 0;\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n rwIModel.saveChanges(\"user 1: create drawing partition\");\n if (true || \"push changes\") {\n // Push the changes to the hub\n const prePushChangeSetId = rwIModel.changeset.id;\n await rwIModel.pushChanges({ description: \"user 1: create drawing partition\", accessToken: adminToken });\n const postPushChangeSetId = rwIModel.changeset.id;\n assert(!!postPushChangeSetId);\n expect(prePushChangeSetId !== postPushChangeSetId);\n }\n\n await rwIModel.locks.acquireLocks({ shared: drawingModelId });\n const insertElements = (imodel: BriefcaseDb, className: string = \"Test2dElement\", noOfElements: number = 10, userProp: (n: number) => object) => {\n for (let m = 0; m < noOfElements; ++m) {\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n const prop = userProp(++totalEl);\n // Create props\n const geomElement = {\n classFullName: `TestDomain:${className}`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...prop,\n };\n const id = imodel.elements.insertElement(geomElement);\n assert.isTrue(Id64.isValidId64(id), \"insert worked\");\n }\n };\n const generatedStr = new Array(10).join(\"x\");\n insertElements(rwIModel, \"Test2dElement\", 1, () => {\n return { s: generatedStr };\n });\n\n const updatedElements = async () => {\n await rwIModel.locks.acquireLocks({ exclusive: \"0x20000000004\" });\n const updatedElement = rwIModel.elements.getElementProps(\"0x20000000004\");\n (updatedElement as any).s = \"updated property\";\n rwIModel.elements.updateElement(updatedElement);\n rwIModel.saveChanges(\"user 1: updated data\");\n await rwIModel.pushChanges({ description: \"user 1: update property id=0x20000000004\", accessToken: adminToken });\n };\n\n rwIModel.saveChanges(\"user 1: data\");\n\n if (true || \"test local changes\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 3);\n\n assert.equal(changes[0].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[0].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[0].$meta?.op, \"Updated\");\n assert.equal(changes[0].$meta?.stage, \"New\");\n assert.isNotNull(changes[0].LastMod);\n assert.isNotNull(changes[0].GeometryGuid);\n\n assert.equal(changes[1].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[1].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[1].$meta?.op, \"Updated\");\n assert.equal(changes[1].$meta?.stage, \"Old\");\n assert.isNull(changes[1].LastMod);\n assert.isNull(changes[1].GeometryGuid);\n\n assert.equal(changes[2].ECInstanceId, \"0x20000000004\");\n assert.equal(changes[2].$meta?.classFullName, \"TestDomain:Test2dElement\");\n assert.equal(changes[2].$meta?.op, \"Inserted\");\n assert.equal(changes[2].$meta?.stage, \"New\");\n\n const el = changes.filter((x) => x.ECInstanceId === \"0x20000000004\")[0];\n assert.equal(el.Rotation, 0);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Origin, { X: 0, Y: 0 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.BBoxLow, { X: -25, Y: -25 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.BBoxHigh, { X: 15, Y: 15 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Category, { Id: \"0x20000000002\", RelECClassId: \"0x6d\" });\n assert.equal(el.s, \"xxxxxxxxx\");\n assert.isNull(el.CodeValue);\n assert.isNull(el.UserLabel);\n assert.isNull(el.JsonProperties);\n assert.instanceOf(el.GeometryStream, Uint8Array);\n assert.typeOf(el.FederationGuid, \"string\");\n assert.typeOf(el.LastMod, \"string\");\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Parent, { Id: null, RelECClassId: null });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.TypeDefinition, { Id: null, RelECClassId: null });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Category, { Id: \"0x20000000002\", RelECClassId: \"0x6d\" });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.CodeSpec, { Id: \"0x1\", RelECClassId: \"0x69\" });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.CodeScope, { Id: \"0x1\", RelECClassId: \"0x6b\" });\n\n assert.deepEqual(el.$meta, {\n tables: [\n \"bis_GeometricElement2d\",\n \"bis_Element\",\n ],\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n changeIndexes: [\n 2,\n 1,\n ],\n stage: \"New\",\n });\n }\n\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openLocalChanges({ db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openLocalChanges({ db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n\n const targetDir = path.join(KnownTestLocations.outputDir, rwIModelId, \"changesets\");\n await rwIModel.pushChanges({ description: \"schema changeset\", accessToken: adminToken });\n\n await updatedElements();\n\n const changesets = await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir });\n if (true || \"updated element\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 4);\n\n const classId: Id64String = getClassIdByName(rwIModel, \"Test2dElement\");\n\n // new value\n assert.equal(changes[2].ECInstanceId, \"0x20000000004\");\n assert.equal(changes[2].ECClassId, classId);\n assert.equal(changes[2].s, \"updated property\");\n assert.equal(changes[2].$meta?.classFullName, \"TestDomain:Test2dElement\");\n assert.equal(changes[2].$meta?.op, \"Updated\");\n assert.equal(changes[2].$meta?.stage, \"New\");\n\n // old value\n assert.equal(changes[3].ECInstanceId, \"0x20000000004\");\n assert.equal(changes[3].ECClassId, classId);\n assert.equal(changes[3].s, \"xxxxxxxxx\");\n assert.equal(changes[3].$meta?.classFullName, \"TestDomain:Test2dElement\");\n assert.equal(changes[3].$meta?.op, \"Updated\");\n assert.equal(changes[3].$meta?.stage, \"Old\");\n };\n\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[3].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[3].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n\n if (true || \"updated element when no classId\") {\n const otherDb = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 4);\n\n // new value\n assert.equal(changes[2].ECInstanceId, \"0x20000000004\");\n assert.isUndefined(changes[2].ECClassId);\n assert.isDefined(changes[2].$meta?.fallbackClassId);\n assert.equal(changes[2].$meta?.fallbackClassId, \"0x3d\");\n assert.isUndefined(changes[2].s);\n assert.equal(changes[2].$meta?.classFullName, \"BisCore:GeometricElement2d\");\n assert.equal(changes[2].$meta?.op, \"Updated\");\n assert.equal(changes[2].$meta?.stage, \"New\");\n\n // old value\n assert.equal(changes[3].ECInstanceId, \"0x20000000004\");\n assert.isUndefined(changes[3].ECClassId);\n assert.isDefined(changes[3].$meta?.fallbackClassId);\n assert.equal(changes[3].$meta?.fallbackClassId, \"0x3d\");\n assert.isUndefined(changes[3].s);\n assert.equal(changes[3].$meta?.classFullName, \"BisCore:GeometricElement2d\");\n assert.equal(changes[3].$meta?.op, \"Updated\");\n assert.equal(changes[3].$meta?.stage, \"Old\");\n };\n\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[3].pathname, db: otherDb, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[3].pathname, db: otherDb, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n\n if (true || \"test changeset file\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 3);\n\n assert.equal(changes[0].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[0].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[0].$meta?.op, \"Updated\");\n assert.equal(changes[0].$meta?.stage, \"New\");\n assert.isNotNull(changes[0].LastMod);\n assert.isNotNull(changes[0].GeometryGuid);\n\n assert.equal(changes[1].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[1].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[1].$meta?.op, \"Updated\");\n assert.equal(changes[1].$meta?.stage, \"Old\");\n assert.isNull(changes[1].LastMod);\n assert.isNull(changes[1].GeometryGuid);\n\n assert.equal(changes[2].ECInstanceId, \"0x20000000004\");\n assert.equal(changes[2].$meta?.classFullName, \"TestDomain:Test2dElement\");\n assert.equal(changes[2].$meta?.op, \"Inserted\");\n assert.equal(changes[2].$meta?.stage, \"New\");\n\n const el = changes.filter((x) => x.ECInstanceId === \"0x20000000004\")[0];\n assert.equal(el.Rotation, 0);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Origin, { X: 0, Y: 0 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.BBoxLow, { X: -25, Y: -25 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.BBoxHigh, { X: 15, Y: 15 });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Category, { Id: \"0x20000000002\", RelECClassId: \"0x6d\" });\n assert.equal(el.s, \"xxxxxxxxx\");\n assert.isNull(el.CodeValue);\n assert.isNull(el.UserLabel);\n assert.isNull(el.JsonProperties);\n assert.instanceOf(el.GeometryStream, Uint8Array);\n assert.typeOf(el.FederationGuid, \"string\");\n assert.typeOf(el.LastMod, \"string\");\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Parent, { Id: null, RelECClassId: null });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.TypeDefinition, { Id: null, RelECClassId: null });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.Category, { Id: \"0x20000000002\", RelECClassId: \"0x6d\" });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.CodeSpec, { Id: \"0x1\", RelECClassId: \"0x69\" });\n // eslint-disable-next-line @typescript-eslint/naming-convention\n assert.deepEqual(el.CodeScope, { Id: \"0x1\", RelECClassId: \"0x6b\" });\n\n assert.deepEqual(el.$meta, {\n tables: [\n \"bis_GeometricElement2d\",\n \"bis_Element\",\n ],\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n changeIndexes: [\n 2,\n 1,\n ],\n stage: \"New\",\n });\n }\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n if (true || \"test ChangesetAdaptor.acceptClass()\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 1);\n assert.equal(changes[0].$meta?.classFullName, \"TestDomain:Test2dElement\");\n };\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n adaptor.acceptClass(\"TestDomain.Test2dElement\");\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n adaptor.acceptClass(\"TestDomain.Test2dElement\");\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n if (true || \"test ChangesetAdaptor.adaptor()\") {\n const testChanges = (changes: ChangedECInstance[]) => {\n assert.equal(changes.length, 2);\n assert.equal(changes[0].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[0].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[0].$meta?.op, \"Updated\");\n assert.equal(changes[0].$meta?.stage, \"New\");\n assert.equal(changes[1].ECInstanceId, \"0x20000000001\");\n assert.equal(changes[1].$meta?.classFullName, \"BisCore:DrawingModel\");\n assert.equal(changes[1].$meta?.op, \"Updated\");\n assert.equal(changes[1].$meta?.stage, \"Old\");\n };\n if (true || \"test with InMemoryInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n adaptor.acceptOp(\"Updated\")\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createInMemoryCache());\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n\n if (true || \"test with SqliteBackedInstanceCache\") {\n using reader = SqliteChangesetReader.openFile({ fileName: changesets[2].pathname, db: rwIModel, disableSchemaCheck: true });\n using adaptor = new ECChangesetAdaptor(reader);\n adaptor.acceptOp(\"Updated\")\n using pcu = new PartialECChangeUnifier(reader.db, ECChangeUnifierCache.createSqliteBackedCache(rwIModel));\n while (adaptor.step()) {\n pcu.appendFrom(adaptor);\n }\n testChanges(Array.from(pcu.instances));\n }\n }\n rwIModel.close();\n });\n it(\"revert timeline changes\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n let nProps = 0;\n // 1. Import schema with class that span overflow table.\n const addPropertyAndImportSchema = async () => {\n await rwIModel.acquireSchemaLock();\n ++nProps;\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00.${nProps}\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n ${Array(nProps).fill(undefined).map((_, i) => `<ECProperty propertyName=\"p${i + 1}\" typeName=\"string\"/>`).join(\"\\n\")}\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n };\n await addPropertyAndImportSchema();\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // Create drawing model and category\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"setup category\", accessToken: adminToken });\n\n const createEl = async (args: { [key: string]: any }) => {\n await rwIModel.locks.acquireLocks({ exclusive: drawingModelId });\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n\n const e1 = {\n classFullName: `TestDomain:Test2dElement`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...args,\n };\n return rwIModel.elements.insertElement(e1);;\n };\n const updateEl = async (id: Id64String, args: { [key: string]: any }) => {\n await rwIModel.locks.acquireLocks({ exclusive: id });\n const updatedElementProps = Object.assign(rwIModel.elements.getElementProps(id), args);\n rwIModel.elements.updateElement(updatedElementProps);\n };\n\n const deleteEl = async (id: Id64String) => {\n await rwIModel.locks.acquireLocks({ exclusive: id });\n rwIModel.elements.deleteElement(id);\n };\n const getChanges = async () => {\n return HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir: path.join(KnownTestLocations.outputDir, rwIModelId, \"changesets\") });\n };\n\n const findEl = (id: Id64String) => {\n try {\n return rwIModel.elements.getElementProps(id);\n } catch {\n return undefined;\n }\n };\n // 2. Insert a element for the class\n const el1 = await createEl({ p1: \"test1\" });\n const el2 = await createEl({ p1: \"test2\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"insert 2 elements\" });\n\n // 3. Update the element.\n await updateEl(el1, { p1: \"test3\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"update element 1\" });\n\n // 4. Delete the element.\n await deleteEl(el2);\n const el3 = await createEl({ p1: \"test4\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"delete element 2\" });\n\n // 5. import schema and insert element 4 & update element 3\n await addPropertyAndImportSchema();\n const el4 = await createEl({ p1: \"test5\", p2: \"test6\" });\n await updateEl(el3, { p1: \"test7\", p2: \"test8\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"import schema, insert element 4 & update element 3\" });\n\n assert.isDefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isDefined(findEl(el3));\n assert.isDefined(findEl(el4));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\"]);\n // 6. Revert to timeline 2\n await rwIModel.revertAndPushChanges({ toIndex: 2, description: \"revert to timeline 2\" });\n assert.equal((await getChanges()).at(-1)!.description, \"revert to timeline 2\");\n\n assert.isUndefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isUndefined(findEl(el3));\n assert.isUndefined(findEl(el4));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\"]);\n\n await rwIModel.revertAndPushChanges({ toIndex: 6, description: \"reinstate last reverted changeset\" });\n assert.equal((await getChanges()).at(-1)!.description, \"reinstate last reverted changeset\");\n assert.isDefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isDefined(findEl(el3));\n assert.isDefined(findEl(el4));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\"]);\n\n await addPropertyAndImportSchema();\n const el5 = await createEl({ p1: \"test9\", p2: \"test10\", p3: \"test11\" });\n await updateEl(el1, { p1: \"test12\", p2: \"test13\", p3: \"test114\" });\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"import schema, insert element 5 & update element 1\" });\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\", \"p3\"]);\n\n // skip schema changes & auto generated comment\n await rwIModel.revertAndPushChanges({ toIndex: 1, skipSchemaChanges: true });\n assert.equal((await getChanges()).at(-1)!.description, \"Reverted changes from 8 to 1 (schema changes skipped)\");\n assert.isUndefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isUndefined(findEl(el3));\n assert.isUndefined(findEl(el4));\n assert.isUndefined(findEl(el5));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\", \"p3\"]);\n\n await rwIModel.revertAndPushChanges({ toIndex: 9 });\n assert.equal((await getChanges()).at(-1)!.description, \"Reverted changes from 9 to 9\");\n assert.isDefined(findEl(el1));\n assert.isUndefined(findEl(el2));\n assert.isDefined(findEl(el3));\n assert.isDefined(findEl(el4));\n assert.isDefined(findEl(el5));\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n assert.deepEqual(Object.getOwnPropertyNames(rwIModel.getMetaData(\"TestDomain:Test2dElement\").properties), [\"p1\", \"p2\", \"p3\"]);\n rwIModel.close();\n });\n it(\"openGroup() & writeToFile()\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n // 1. Import schema with class that span overflow table.\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"p1\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // Create drawing model and category\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"setup category\", accessToken: adminToken });\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n\n const e1 = {\n classFullName: `TestDomain:Test2dElement`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...{ p1: \"test1\" },\n };\n\n // 2. Insert a element for the class\n await rwIModel.locks.acquireLocks({ shared: drawingModelId });\n const e1id = rwIModel.elements.insertElement(e1);\n assert.isTrue(Id64.isValidId64(e1id), \"insert worked\");\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"insert element\", accessToken: adminToken });\n\n // 3. Update the element.\n const updatedElementProps = Object.assign(rwIModel.elements.getElementProps(e1id), { p1: \"test2\" });\n await rwIModel.locks.acquireLocks({ exclusive: e1id });\n rwIModel.elements.updateElement(updatedElementProps);\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"update element\", accessToken: adminToken });\n\n // 4. Delete the element.\n await rwIModel.locks.acquireLocks({ exclusive: e1id });\n rwIModel.elements.deleteElement(e1id);\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"delete element\", accessToken: adminToken });\n\n const targetDir = path.join(KnownTestLocations.outputDir, rwIModelId, \"changesets\");\n const changesets = (await HubMock.downloadChangesets({ iModelId: rwIModelId, targetDir })).slice(1);\n\n const testElementClassId: Id64String = getClassIdByName(rwIModel, \"Test2dElement\");\n const drawingModelClassId: Id64String = getClassIdByName(rwIModel, \"DrawingModel\");\n\n if (true || \"Grouping changeset [2,3,4] should not contain TestDomain:Test2dElement as insert+update+delete=noop\") {\n const reader = SqliteChangesetReader.openGroup({ changesetFiles: changesets.map((c) => c.pathname), db: rwIModel, disableSchemaCheck: true });\n const adaptor = new ECChangesetAdaptor(reader);\n const instances: ({ id: string, classId?: string, op: SqliteChangeOp, classFullName?: string })[] = [];\n while (adaptor.step()) {\n if (adaptor.inserted) {\n instances.push({ id: adaptor.inserted?.ECInstanceId, classId: adaptor.inserted.ECClassId, op: adaptor.op, classFullName: adaptor.inserted.$meta?.classFullName });\n } else if (adaptor.deleted) {\n instances.push({ id: adaptor.deleted?.ECInstanceId, classId: adaptor.deleted.ECClassId, op: adaptor.op, classFullName: adaptor.deleted.$meta?.classFullName });\n }\n }\n\n expect(instances.length).to.eq(1);\n expect(instances[0].id).to.eq(\"0x20000000001\");\n expect(instances[0].classId).to.eq(drawingModelClassId);\n expect(instances[0].op).to.eq(\"Updated\");\n expect(instances[0].classFullName).to.eq(\"BisCore:DrawingModel\");\n }\n\n if (true || \"Grouping changeset [3,4] should contain update+delete=delete TestDomain:Test2dElement\") {\n const reader = SqliteChangesetReader.openGroup({ changesetFiles: changesets.slice(1).map((c) => c.pathname), db: rwIModel, disableSchemaCheck: true });\n const adaptor = new ECChangesetAdaptor(reader);\n const instances: ({ id: string, classId?: string, op: SqliteChangeOp, classFullName?: string })[] = [];\n while (adaptor.step()) {\n if (adaptor.inserted) {\n instances.push({ id: adaptor.inserted?.ECInstanceId, classId: adaptor.inserted.ECClassId, op: adaptor.op, classFullName: adaptor.inserted.$meta?.classFullName });\n } else if (adaptor.deleted) {\n instances.push({ id: adaptor.deleted?.ECInstanceId, classId: adaptor.deleted.ECClassId, op: adaptor.op, classFullName: adaptor.deleted.$meta?.classFullName });\n }\n }\n expect(instances.length).to.eq(3);\n expect(instances[0]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Deleted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[1]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Deleted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[2]).deep.eq({\n id: \"0x20000000001\",\n classId: drawingModelClassId,\n op: \"Updated\",\n classFullName: \"BisCore:DrawingModel\",\n });\n }\n\n const groupCsFile = path.join(KnownTestLocations.outputDir, \"changeset_grouping.ec\");\n if (true || \"Grouping changeset [2,3] should contain insert+update=insert TestDomain:Test2dElement\") {\n const reader = SqliteChangesetReader.openGroup({ changesetFiles: changesets.slice(0, 2).map((c) => c.pathname), db: rwIModel, disableSchemaCheck: true });\n const adaptor = new ECChangesetAdaptor(reader);\n const instances: ({ id: string, classId?: string, op: SqliteChangeOp, classFullName?: string })[] = [];\n while (adaptor.step()) {\n if (adaptor.inserted) {\n instances.push({ id: adaptor.inserted?.ECInstanceId, classId: adaptor.inserted.ECClassId, op: adaptor.op, classFullName: adaptor.inserted.$meta?.classFullName });\n } else if (adaptor.deleted) {\n instances.push({ id: adaptor.deleted?.ECInstanceId, classId: adaptor.deleted.ECClassId, op: adaptor.op, classFullName: adaptor.deleted.$meta?.classFullName });\n }\n }\n expect(instances.length).to.eq(3);\n expect(instances[0]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[1]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[2]).deep.eq({\n id: \"0x20000000001\",\n classId: drawingModelClassId,\n op: \"Updated\",\n classFullName: \"BisCore:DrawingModel\",\n });\n\n reader.writeToFile({ fileName: groupCsFile, containsSchemaChanges: false, overwriteFile: true });\n }\n if (true || \"writeToFile() test\") {\n const reader = SqliteChangesetReader.openFile({ fileName: groupCsFile, db: rwIModel, disableSchemaCheck: true });\n const adaptor = new ECChangesetAdaptor(reader);\n const instances: ({ id: string, classId?: string, op: SqliteChangeOp, classFullName?: string })[] = [];\n while (adaptor.step()) {\n if (adaptor.inserted) {\n instances.push({ id: adaptor.inserted?.ECInstanceId, classId: adaptor.inserted.ECClassId, op: adaptor.op, classFullName: adaptor.inserted.$meta?.classFullName });\n } else if (adaptor.deleted) {\n instances.push({ id: adaptor.deleted?.ECInstanceId, classId: adaptor.deleted.ECClassId, op: adaptor.op, classFullName: adaptor.deleted.$meta?.classFullName });\n }\n }\n expect(instances.length).to.eq(3);\n expect(instances[0]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[1]).deep.eq({\n id: \"0x20000000004\",\n classId: testElementClassId,\n op: \"Inserted\",\n classFullName: \"TestDomain:Test2dElement\",\n });\n expect(instances[2]).deep.eq({\n id: \"0x20000000001\",\n classId: drawingModelClassId,\n op: \"Updated\",\n classFullName: \"BisCore:DrawingModel\",\n });\n }\n rwIModel.close();\n });\n\n it(\"Delete class FK constraint violation in cache table\", async () => {\n // Helper to check if TestClass exists in schema and cache table for both briefcases\n function checkClass(firstBriefcase: BriefcaseDb, isClassInFirst: boolean, secondBriefcase: BriefcaseDb, isClassInSecond: boolean) {\n const firstItems = firstBriefcase.getSchemaProps(\"TestSchema\").items;\n assert.equal(isClassInFirst, !!firstItems?.TestClass);\n\n const secondItems = secondBriefcase.getSchemaProps(\"TestSchema\").items;\n assert.equal(isClassInSecond, !!secondItems?.TestClass);\n\n const sql = `SELECT ch.classId FROM ec_cache_ClassHierarchy ch JOIN ec_Class c ON ch.classId = c.Id WHERE c.Name = 'TestClass'`;\n const firstStmt = firstBriefcase.prepareSqliteStatement(sql);\n assert.equal(firstStmt.step(), isClassInFirst ? DbResult.BE_SQLITE_ROW : DbResult.BE_SQLITE_DONE);\n firstStmt[Symbol.dispose]();\n\n const secondStmt = secondBriefcase.prepareSqliteStatement(sql);\n assert.equal(secondStmt.step(), isClassInSecond ? DbResult.BE_SQLITE_ROW : DbResult.BE_SQLITE_DONE);\n secondStmt[Symbol.dispose]();\n }\n\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n\n // Open two briefcases for the same iModel\n const [firstBriefCase, secondBriefCase] = await Promise.all([\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken }),\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken })\n ]);\n\n // Enable shared channel for both\n [firstBriefCase, secondBriefCase].forEach(briefcase => briefcase.channels.addAllowedChannel(ChannelControl.sharedChannelName));\n\n await firstBriefCase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"1.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n </ECSchema>`]);\n firstBriefCase.saveChanges(\"import initial schema\");\n\n // Push the changes to the hub\n await firstBriefCase.pushChanges({ description: \"push initial schema changeset\", accessToken: adminToken });\n\n // Sync the second briefcase with the iModel\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n\n checkClass(firstBriefCase, true, secondBriefCase, true);\n\n // Import the schema\n await firstBriefCase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"2.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n </ECSchema>`]);\n firstBriefCase.saveChanges(\"imported schema\");\n\n // Push the changeset to the hub\n await firstBriefCase.pushChanges({ description: \"Delete class major change\", accessToken: adminToken });\n\n checkClass(firstBriefCase, false, secondBriefCase, true);\n\n // Apply the latest changeset to a new briefcase\n try {\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n } catch (error: any) {\n assert.fail(`Should not have failed with the error: ${error.message}`);\n }\n\n checkClass(firstBriefCase, false, secondBriefCase, false);\n\n // Cleanup\n await Promise.all([secondBriefCase.close(), firstBriefCase.close()]);\n });\n\n\n it(\"Delete class FK constraint violation in cache table through a revert\", async () => {\n // Helper to check if TestClass exists in schema and cache table for both briefcases\n function checkClass(className: string, firstBriefcase: BriefcaseDb, isClassInFirst: boolean, secondBriefcase: BriefcaseDb, isClassInSecond: boolean) {\n assert.equal(isClassInFirst, !!firstBriefcase.getSchemaProps(\"TestSchema\").items?.[className]);\n assert.equal(isClassInSecond, !!secondBriefcase.getSchemaProps(\"TestSchema\").items?.[className]);\n\n const sql = `SELECT ch.classId FROM ec_cache_ClassHierarchy ch JOIN ec_Class c ON ch.classId = c.Id WHERE c.Name = '${className}'`;\n const firstStmt = firstBriefcase.prepareSqliteStatement(sql);\n assert.equal(firstStmt.step(), isClassInFirst ? DbResult.BE_SQLITE_ROW : DbResult.BE_SQLITE_DONE);\n firstStmt[Symbol.dispose]();\n\n const secondStmt = secondBriefcase.prepareSqliteStatement(sql);\n assert.equal(secondStmt.step(), isClassInSecond ? DbResult.BE_SQLITE_ROW : DbResult.BE_SQLITE_DONE);\n secondStmt[Symbol.dispose]();\n }\n\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n\n // Open two briefcases for the same iModel\n const [firstBriefCase, secondBriefCase] = await Promise.all([\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken }),\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken })\n ]);\n\n // Enable shared channel for both\n [firstBriefCase, secondBriefCase].forEach(briefcase => briefcase.channels.addAllowedChannel(ChannelControl.sharedChannelName));\n\n await firstBriefCase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"1.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n </ECSchema>`]);\n firstBriefCase.saveChanges(\"import initial schema\");\n\n // Push the changes to the hub\n await firstBriefCase.pushChanges({ description: \"push initial schema changeset\", accessToken: adminToken });\n // Sync the second briefcase\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n\n checkClass(\"TestClass\", firstBriefCase, true, secondBriefCase, true);\n\n // Import the schema\n await firstBriefCase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"1.0.1\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n\n <ECEntityClass typeName=\"AnotherTestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n </ECSchema>`]);\n firstBriefCase.saveChanges(\"imported schema\");\n\n // Push the changeset to the hub\n await firstBriefCase.pushChanges({ description: \"Add another class change\", accessToken: adminToken });\n // Sync the second briefcase\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n\n checkClass(\"TestClass\", firstBriefCase, true, secondBriefCase, true);\n checkClass(\"AnotherTestClass\", firstBriefCase, true, secondBriefCase, true);\n\n // Revert the latest changeset from the first briefcase\n try {\n await firstBriefCase.revertAndPushChanges({ toIndex: 2, description: \"Revert last changeset\" });\n } catch (error: any) {\n assert.fail(`Should not have failed with the error: ${error.message}`);\n }\n\n checkClass(\"TestClass\", firstBriefCase, true, secondBriefCase, true);\n checkClass(\"AnotherTestClass\", firstBriefCase, false, secondBriefCase, true);\n\n try {\n await secondBriefCase.pullChanges({ accessToken: adminToken });\n } catch (error: any) {\n assert.fail(`Should not have failed with the error: ${error.message}`);\n }\n\n checkClass(\"TestClass\", firstBriefCase, true, secondBriefCase, true);\n checkClass(\"AnotherTestClass\", firstBriefCase, false, secondBriefCase, false);\n\n // Cleanup\n await Promise.all([secondBriefCase.close(), firstBriefCase.close()]);\n });\n\n it(\"Track changeset health stats\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n\n // Open two briefcases for the same iModel\n const [firstBriefcase, secondBriefcase] = await Promise.all([\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken }),\n HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken })\n ]);\n\n [firstBriefcase, secondBriefcase].forEach(briefcase => briefcase.channels.addAllowedChannel(ChannelControl.sharedChannelName));\n\n await firstBriefcase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"1.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n </ECEntityClass>\n </ECSchema>`]);\n firstBriefcase.saveChanges(\"import initial schema\");\n\n // Enable changeset tracking for both briefcases\n await Promise.all([firstBriefcase.enableChangesetStatTracking(), secondBriefcase.enableChangesetStatTracking()]);\n\n await firstBriefcase.pushChanges({ description: \"push initial schema changeset\", accessToken: adminToken });\n await secondBriefcase.pullChanges({ accessToken: adminToken });\n\n // Schema upgrade\n await secondBriefcase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"2.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"BisCore\" version=\"1.0.0\" alias=\"bis\"/>\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEntityClass typeName=\"TestClass\">\n <BaseClass>bis:PhysicalElement</BaseClass>\n <ECProperty propertyName=\"TestProperty\" typeName=\"string\"/>\n </ECEntityClass>\n\n <ECEnumeration typeName=\"TestEnum\" backingTypeName=\"int\" isStrict=\"true\">\n <ECEnumerator name=\"Enumerator1\" value=\"1\" displayLabel=\"TestEnumerator1\"/>\n <ECEnumerator name=\"Enumerator2\" value=\"2\" displayLabel=\"TestEnumerator2\"/>\n </ECEnumeration>\n </ECSchema>`]);\n secondBriefcase.saveChanges(\"imported schema\");\n\n await secondBriefcase.pushChanges({ description: \"Added a property to TestClass and an enum\", accessToken: adminToken });\n await firstBriefcase.pullChanges({ accessToken: adminToken });\n\n // Major schema change\n await firstBriefcase.importSchemaStrings([`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" alias=\"ts\" version=\"2.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"CoreCustomAttributes\" version=\"1.0.0\" alias=\"CoreCA\" />\n\n <ECCustomAttributes>\n <DynamicSchema xmlns = 'CoreCustomAttributes.1.0.0' />\n </ECCustomAttributes>\n\n <ECEnumeration typeName=\"TestEnum\" backingTypeName=\"int\" isStrict=\"true\">\n <ECEnumerator name=\"Enumerator1\" value=\"1\" displayLabel=\"TestEnumerator1\"/>\n <ECEnumerator name=\"Enumerator2\" value=\"2\" displayLabel=\"TestEnumerator2\"/>\n </ECEnumeration>\n </ECSchema>`]);\n firstBriefcase.saveChanges(\"imported schema\");\n\n await firstBriefcase.pushChanges({ description: \"Deleted TestClass\", accessToken: adminToken });\n await secondBriefcase.pullChanges({ accessToken: adminToken });\n\n const firstBriefcaseChangesets = await firstBriefcase.getAllChangesetHealthData();\n const secondBriefcaseChangesets = await secondBriefcase.getAllChangesetHealthData();\n\n assert.equal(firstBriefcaseChangesets.length, 1);\n const firstBriefcaseChangeset = firstBriefcaseChangesets[0];\n\n expect(firstBriefcaseChangeset.uncompressedSizeBytes).to.be.greaterThan(300);\n expect(firstBriefcaseChangeset.insertedRows).to.be.greaterThanOrEqual(4);\n expect(firstBriefcaseChangeset.updatedRows).to.be.greaterThanOrEqual(1);\n expect(firstBriefcaseChangeset.deletedRows).to.be.eql(0);\n expect(firstBriefcaseChangeset.totalFullTableScans).to.be.eql(0);\n expect(firstBriefcaseChangeset.perStatementStats.length).to.be.eql(5);\n\n assert.equal(secondBriefcaseChangesets.length, 2);\n const [secondBriefcaseChangeset1, secondBriefcaseChangeset2] = secondBriefcaseChangesets;\n\n expect(secondBriefcaseChangeset1.uncompressedSizeBytes).to.be.greaterThan(40000);\n expect(secondBriefcaseChangeset1.insertedRows).to.be.greaterThanOrEqual(52);\n expect(secondBriefcaseChangeset1.updatedRows).to.be.greaterThanOrEqual(921);\n expect(secondBriefcaseChangeset1.deletedRows).to.be.eql(0);\n expect(secondBriefcaseChangeset1.totalFullTableScans).to.be.eql(0);\n expect(secondBriefcaseChangeset1.perStatementStats.length).to.be.eql(11);\n\n expect(secondBriefcaseChangeset2.uncompressedSizeBytes).to.be.greaterThan(40000);\n expect(secondBriefcaseChangeset2.insertedRows).to.be.eql(0);\n expect(secondBriefcaseChangeset2.updatedRows).to.be.greaterThanOrEqual(921);\n expect(secondBriefcaseChangeset2.deletedRows).to.be.greaterThanOrEqual(52);\n expect(secondBriefcaseChangeset2.totalFullTableScans).to.be.eql(0);\n expect(secondBriefcaseChangeset2.perStatementStats.length).to.be.eql(11);\n\n // Cleanup\n await Promise.all([secondBriefcase.close(), firstBriefcase.close()]);\n });\n it(\"openInMemory() & step()\", async () => {\n const adminToken = \"super manager token\";\n const iModelName = \"test\";\n const rwIModelId = await HubMock.createNewIModel({ iTwinId, iModelName, description: \"TestSubject\", accessToken: adminToken });\n assert.isNotEmpty(rwIModelId);\n const rwIModel = await HubWrappers.downloadAndOpenBriefcase({ iTwinId, iModelId: rwIModelId, accessToken: adminToken });\n // 1. Import schema with class that span overflow table.\n const schema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestDomain\" alias=\"ts\" version=\"01.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECSchemaReference name=\"BisCore\" version=\"01.00\" alias=\"bis\"/>\n <ECEntityClass typeName=\"Test2dElement\">\n <BaseClass>bis:GraphicalElement2d</BaseClass>\n <ECProperty propertyName=\"p1\" typeName=\"string\"/>\n </ECEntityClass>\n </ECSchema>`;\n await rwIModel.importSchemaStrings([schema]);\n rwIModel.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n // Create drawing model and category\n await rwIModel.locks.acquireLocks({ shared: IModel.dictionaryId });\n const codeProps = Code.createEmpty();\n codeProps.value = \"DrawingModel\";\n const [, drawingModelId] = IModelTestUtils.createAndInsertDrawingPartitionAndModel(rwIModel, codeProps, true);\n let drawingCategoryId = DrawingCategory.queryCategoryIdByName(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\");\n if (undefined === drawingCategoryId)\n drawingCategoryId = DrawingCategory.insert(rwIModel, IModel.dictionaryId, \"MyDrawingCategory\", new SubCategoryAppearance({ color: ColorDef.fromString(\"rgb(255,0,0)\").toJSON() }));\n\n rwIModel.saveChanges();\n await rwIModel.pushChanges({ description: \"setup category\", accessToken: adminToken });\n\n const geomArray: Arc3d[] = [\n Arc3d.createXY(Point3d.create(0, 0), 5),\n Arc3d.createXY(Point3d.create(5, 5), 2),\n Arc3d.createXY(Point3d.create(-5, -5), 20),\n ];\n\n const geometryStream: GeometryStreamProps = [];\n for (const geom of geomArray) {\n const arcData = IModelJson.Writer.toIModelJson(geom);\n geometryStream.push(arcData);\n }\n\n const e1 = {\n classFullName: `TestDomain:Test2dElement`,\n model: drawingModelId,\n category: drawingCategoryId,\n code: Code.createEmpty(),\n geom: geometryStream,\n ...{ p1: \"test1\" },\n };\n\n // 2. Insert a element for the class\n await rwIModel.locks.acquireLocks({ shared: drawingModelId });\n const e1id = rwIModel.elements.insertElement(e1);\n assert.isTrue(Id64.isValidId64(e1id), \"insert worked\");\n\n if (true) {\n const reader = SqliteChangesetReader.openInMemory({ db: rwIModel, disableSchemaCheck: true });\n const adaptor = new ChangesetECAdaptor(reader);\n const unifier = new PartialECChangeUnifier(rwIModel)\n while (adaptor.step()) {\n unifier.appendFrom(adaptor);\n }\n reader.close();\n\n // verify the inserted element's properties\n const instances = Array.from(unifier.instances);\n expect(instances.length).to.equals(1);\n const testEl = instances[0];\n expect(testEl.$meta?.op).to.equals(\"Inserted\");\n expect(testEl.$meta?.classFullName).to.equals(\"TestDomain:Test2dElement\");\n expect(testEl.$meta?.stage).to.equals(\"New\");\n expect(testEl.ECClassId).to.equals(\"0x168\");\n expect(testEl.ECInstanceId).to.equals(e1id);\n expect(testEl.Model.Id).to.equals(drawingModelId);\n expect(testEl.Category.Id).to.equals(drawingCategoryId);\n expect(testEl.Origin.X).to.equals(0);\n expect(testEl.Origin.Y).to.equals(0);\n expect(testEl.Rotation).to.equals(0);\n expect(testEl.BBoxLow.X).to.equals(-25);\n expect(testEl.BBoxLow.Y).to.equals(-25);\n expect(testEl.BBoxHigh.X).to.equals(15);\n expect(testEl.BBoxHigh.Y).to.equals(15);\n expect(testEl.p1).to.equals(\"test1\");\n }\n\n // save changes and verify the the txn\n rwIModel.saveChanges();\n\n if (true) {\n const txnId = rwIModel.txns.getLastSavedTxnProps()?.id as string;\n expect(txnId).to.not.be.undefined;\n const reader = SqliteChangesetReader.openTxn({ db: rwIModel, disableSchemaCheck: true, txnId });\n const adaptor = new ChangesetECAdaptor(reader);\n const unifier = new PartialECChangeUnifier(rwIModel)\n while (adaptor.step()) {\n unifier.appendFrom(adaptor);\n }\n reader.close();\n\n // verify the inserted element's properties\n const instances = Array.from(unifier.instances);\n expect(instances.length).to.equals(3);\n\n // DrawingModel new instance\n const drawingModelElNew = instances[0];\n expect(drawingModelElNew.$meta?.op).to.equals(\"Updated\");\n expect(drawingModelElNew.$meta?.classFullName).to.equals(\"BisCore:DrawingModel\");\n expect(drawingModelElNew.$meta?.stage).to.equals(\"New\");\n expect(drawingModelElNew.ECClassId).to.equals(\"0xaa\");\n expect(drawingModelElNew.ECInstanceId).to.equals(drawingModelId);\n expect(drawingModelElNew.LastMod).to.exist;\n expect(drawingModelElNew.GeometryGuid).to.exist;\n\n // DrawingModel old instance\n const drawingModelElOld = instances[1];\n expect(drawingModelElOld.$meta?.op).to.equals(\"Updated\");\n expect(drawingModelElOld.$meta?.classFullName).to.equals(\"BisCore:DrawingModel\");\n expect(drawingModelElOld.$meta?.stage).to.equals(\"Old\");\n expect(drawingModelElOld.ECClassId).to.equals(\"0xaa\");\n expect(drawingModelElOld.ECInstanceId).to.equals(drawingModelId);\n expect(drawingModelElOld.LastMod).to.null;\n expect(drawingModelElOld.GeometryGuid).to.null;\n\n // Test element instance\n const testEl = instances[2];\n expect(testEl.$meta?.op).to.equals(\"Inserted\");\n expect(testEl.$meta?.classFullName).to.equals(\"TestDomain:Test2dElement\");\n expect(testEl.$meta?.stage).to.equals(\"New\");\n expect(testEl.ECClassId).to.equals(\"0x168\");\n expect(testEl.ECInstanceId).to.equals(e1id);\n expect(testEl.Model.Id).to.equals(drawingModelId);\n expect(testEl.Category.Id).to.equals(drawingCategoryId);\n expect(testEl.Origin.X).to.equals(0);\n expect(testEl.Origin.Y).to.equals(0);\n expect(testEl.Rotation).to.equals(0);\n expect(testEl.BBoxLow.X).to.equals(-25);\n expect(testEl.BBoxLow.Y).to.equals(-25);\n expect(testEl.BBoxHigh.X).to.equals(15);\n expect(testEl.BBoxHigh.Y).to.equals(15);\n expect(testEl.p1).to.equals(\"test1\");\n }\n await rwIModel.pushChanges({ description: \"insert element\", accessToken: adminToken });\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-backend",
3
- "version": "5.2.0-dev.32",
3
+ "version": "5.2.0-dev.34",
4
4
  "description": "iTwin.js backend components",
5
5
  "main": "lib/cjs/core-backend.js",
6
6
  "module": "lib/esm/core-backend.js",
@@ -27,10 +27,10 @@
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@opentelemetry/api": "^1.0.4",
30
- "@itwin/core-bentley": "5.2.0-dev.32",
31
- "@itwin/ecschema-metadata": "5.2.0-dev.32",
32
- "@itwin/core-geometry": "5.2.0-dev.32",
33
- "@itwin/core-common": "5.2.0-dev.32"
30
+ "@itwin/core-bentley": "5.2.0-dev.34",
31
+ "@itwin/core-common": "5.2.0-dev.34",
32
+ "@itwin/ecschema-metadata": "5.2.0-dev.34",
33
+ "@itwin/core-geometry": "5.2.0-dev.34"
34
34
  },
35
35
  "peerDependenciesMeta": {
36
36
  "@opentelemetry/api": {
@@ -76,17 +76,17 @@
76
76
  "marked": "^14.1.3",
77
77
  "sql-formatter": "^15.4.6",
78
78
  "webpack": "^5.97.1",
79
- "@itwin/build-tools": "5.2.0-dev.32",
80
- "@itwin/core-bentley": "5.2.0-dev.32",
81
- "@itwin/ecsql-common": "5.2.0-dev.32",
82
- "@itwin/core-geometry": "5.2.0-dev.32",
83
- "@itwin/core-common": "5.2.0-dev.32",
84
- "@itwin/ecschema-locaters": "5.2.0-dev.32",
85
- "internal-tools": "3.0.0-dev.69",
86
- "@itwin/ecschema-metadata": "5.2.0-dev.32"
79
+ "@itwin/build-tools": "5.2.0-dev.34",
80
+ "@itwin/core-bentley": "5.2.0-dev.34",
81
+ "@itwin/core-common": "5.2.0-dev.34",
82
+ "@itwin/ecschema-locaters": "5.2.0-dev.34",
83
+ "@itwin/ecschema-metadata": "5.2.0-dev.34",
84
+ "@itwin/core-geometry": "5.2.0-dev.34",
85
+ "@itwin/ecsql-common": "5.2.0-dev.34",
86
+ "internal-tools": "3.0.0-dev.69"
87
87
  },
88
88
  "dependencies": {
89
- "@bentley/imodeljs-native": "5.2.16",
89
+ "@bentley/imodeljs-native": "5.2.18",
90
90
  "@itwin/cloud-agnostic-core": "^2.2.4",
91
91
  "@itwin/object-storage-azure": "^2.3.0",
92
92
  "@itwin/object-storage-core": "^2.3.0",