@itwin/core-backend 5.6.0-dev.1 → 5.6.0-dev.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/lib/cjs/ChannelControl.d.ts +29 -0
  3. package/lib/cjs/ChannelControl.d.ts.map +1 -1
  4. package/lib/cjs/ChannelControl.js.map +1 -1
  5. package/lib/cjs/IModelDb.d.ts +152 -16
  6. package/lib/cjs/IModelDb.d.ts.map +1 -1
  7. package/lib/cjs/IModelDb.js +163 -76
  8. package/lib/cjs/IModelDb.js.map +1 -1
  9. package/lib/cjs/SqliteChangesetReader.d.ts +5 -0
  10. package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
  11. package/lib/cjs/SqliteChangesetReader.js +7 -0
  12. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  13. package/lib/cjs/internal/ChannelAdmin.d.ts +2 -1
  14. package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
  15. package/lib/cjs/internal/ChannelAdmin.js +23 -0
  16. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  17. package/lib/esm/ChannelControl.d.ts +29 -0
  18. package/lib/esm/ChannelControl.d.ts.map +1 -1
  19. package/lib/esm/ChannelControl.js.map +1 -1
  20. package/lib/esm/IModelDb.d.ts +152 -16
  21. package/lib/esm/IModelDb.d.ts.map +1 -1
  22. package/lib/esm/IModelDb.js +162 -75
  23. package/lib/esm/IModelDb.js.map +1 -1
  24. package/lib/esm/SqliteChangesetReader.d.ts +5 -0
  25. package/lib/esm/SqliteChangesetReader.d.ts.map +1 -1
  26. package/lib/esm/SqliteChangesetReader.js +7 -0
  27. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  28. package/lib/esm/internal/ChannelAdmin.d.ts +2 -1
  29. package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
  30. package/lib/esm/internal/ChannelAdmin.js +23 -0
  31. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  32. package/lib/esm/test/hubaccess/Rebase.test.js +98 -1
  33. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  34. package/lib/esm/test/schema/SchemaImportCallbacks.test.d.ts +2 -0
  35. package/lib/esm/test/schema/SchemaImportCallbacks.test.d.ts.map +1 -0
  36. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +916 -0
  37. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -0
  38. package/package.json +13 -13
@@ -281,6 +281,11 @@ export declare class SqliteChangesetReader implements Disposable {
281
281
  * @beta
282
282
  */
283
283
  [Symbol.dispose](): void;
284
+ /**
285
+ * Get Data Definition Language changes
286
+ * @beta
287
+ */
288
+ getDdlChanges(): string | undefined;
284
289
  }
285
290
  export {};
286
291
  //# sourceMappingURL=SqliteChangesetReader.d.ts.map
@@ -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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"}
@@ -347,6 +347,13 @@ class SqliteChangesetReader {
347
347
  [Symbol.dispose]() {
348
348
  this.close();
349
349
  }
350
+ /**
351
+ * Get Data Definition Language changes
352
+ * @beta
353
+ */
354
+ getDdlChanges() {
355
+ return this._nativeReader.getDdlChanges();
356
+ }
350
357
  }
351
358
  exports.SqliteChangesetReader = SqliteChangesetReader;
352
359
  //# sourceMappingURL=SqliteChangesetReader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SqliteChangesetReader.js","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module SQLiteDb\r\n */\r\nimport { DbChangeStage, DbOpcode, DbResult, DbValueType, Id64String } from \"@itwin/core-bentley\";\r\nimport { ECDb } from \"./ECDb\";\r\nimport { IModelDb } from \"./IModelDb\";\r\nimport { IModelNative } from \"./internal/NativePlatform\";\r\nimport { _nativeDb } from \"./internal/Symbols\";\r\n\r\n/** Changed value type\r\n * @beta\r\n*/\r\ntype SqliteValue = Uint8Array | number | string | null | undefined;\r\n\r\n/** Array of changed values\r\n * @beta\r\n*/\r\ntype SqliteValueArray = SqliteValue[];\r\n/**\r\n * Format option when converting change from array to column/value object.\r\n * @beta\r\n */\r\nexport interface ChangeFormatArgs {\r\n /** include table name */\r\n includeTableName?: true;\r\n /** include op code */\r\n includeOpCode?: true;\r\n /** include null columns */\r\n includeNullColumns?: true;\r\n /** include value version */\r\n includeStage?: true;\r\n /** include primary key in update change */\r\n includePrimaryKeyInUpdateNew?: true;\r\n}\r\n\r\n/** Operation that cause the change\r\n * @beta\r\n*/\r\nexport type SqliteChangeOp = \"Inserted\" | \"Updated\" | \"Deleted\";\r\n\r\n/** Stage is version of value that needed to be read\r\n * @beta\r\n*/\r\nexport type SqliteValueStage = \"Old\" | \"New\";\r\n\r\n/** Db from which schema will be read. It should be from timeline to which changeset belong.\r\n * @beta\r\n*/\r\nexport type AnyDb = IModelDb | ECDb;\r\n\r\n/** Arg to open a changeset file from disk\r\n * @beta\r\n*/\r\nexport interface SqliteChangesetReaderArgs {\r\n /** db from which schema will be read. It should be at or ahead of the latest changeset being opened.*/\r\n readonly db: AnyDb;\r\n /** invert the changeset operations */\r\n readonly invert?: true;\r\n /** do not check if column of change match db schema instead ignore addition columns */\r\n readonly disableSchemaCheck?: true;\r\n}\r\n/**\r\n * Represent sqlite change.\r\n * @beta\r\n */\r\nexport interface SqliteChange {\r\n /** name of table */\r\n $table?: string;\r\n /** SQLite operation that created this change */\r\n $op?: SqliteChangeOp;\r\n /** version of data in change. */\r\n $stage?: SqliteValueStage;\r\n /** columns in change */\r\n [key: string]: any;\r\n}\r\n/**\r\n * Read raw sqlite changeset from disk and enumerate changes.\r\n * It also optionally let you format change with schema from\r\n * a db provided.\r\n * @beta\r\n */\r\nexport class SqliteChangesetReader implements Disposable {\r\n private readonly _nativeReader = new IModelNative.platform.ChangesetReader();\r\n private _schemaCache = new Map<string, string[]>();\r\n private _disableSchemaCheck = false;\r\n private _changeIndex = 0;\r\n protected constructor(\r\n /** db from where sql schema will be read */\r\n public readonly db: AnyDb,\r\n ) { }\r\n\r\n /**\r\n * Open changeset file from disk\r\n * @param args fileName of changeset reader and other options.\r\n * @returns SqliteChangesetReader instance\r\n */\r\n public static openFile(args: { readonly fileName: string } & SqliteChangesetReaderArgs): SqliteChangesetReader {\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openFile(args.fileName, args.invert ?? false);\r\n return reader;\r\n }\r\n /**\r\n * Group changeset file into single changeset and open that changeset.\r\n * @param args - The arguments for opening the changeset group. Requires an open db.\r\n * @returns The SqliteChangesetReader instance.\r\n */\r\n public static openGroup(args: { readonly changesetFiles: string[] } & SqliteChangesetReaderArgs): SqliteChangesetReader {\r\n if (args.changesetFiles.length === 0) {\r\n throw new Error(\"changesetFiles must contain at least one file.\");\r\n }\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openGroup(args.changesetFiles, args.db[_nativeDb], args.invert ?? false);\r\n return reader;\r\n }\r\n /**\r\n * Open txn change in iModel.\r\n * @param args iModel and other options.\r\n * @returns SqliteChangesetReader instance\r\n */\r\n public static openTxn(args: { txnId: Id64String } & SqliteChangesetReaderArgs): SqliteChangesetReader {\r\n if (args.db instanceof ECDb) {\r\n throw new Error(\"ECDb does not support openTxn\");\r\n }\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openTxn(args.db[_nativeDb], args.txnId, args.invert ?? false);\r\n return reader;\r\n }\r\n /**\r\n * Open in-memory changes for the given iModel.\r\n * @param args - The arguments for opening in-memory changes.\r\n * @returns SqliteChangesetReader instance\r\n */\r\n public static openInMemory(args: SqliteChangesetReaderArgs & { db: IModelDb }): SqliteChangesetReader {\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openInMemoryChanges(args.db[_nativeDb], args.invert ?? false);\r\n return reader;\r\n }\r\n /**\r\n * Writes the changeset to a file.\r\n * @note can be use with openGroup() or openLocalChanges() to persist changeset.\r\n * @param args - The arguments for writing to the file.\r\n * @param args.fileName - The name of the file to write to.\r\n * @param args.containsSchemaChanges - Indicates whether the changeset contains schema changes.\r\n * @param args.overwriteFile - Indicates whether to override the file if it already exists. Default is false.\r\n */\r\n public writeToFile(args: { fileName: string, containsSchemaChanges: boolean, overwriteFile?: boolean }): void {\r\n this._nativeReader.writeToFile(args.fileName, args.containsSchemaChanges, args.overwriteFile ?? false);\r\n }\r\n /**\r\n * Open local changes in iModel.\r\n * @param args iModel and other options.\r\n * @param args.db must be of type IModelDb\r\n * @returns SqliteChangesetReader instance\r\n */\r\n public static openLocalChanges(args: Omit<SqliteChangesetReaderArgs, \"db\"> & { db: IModelDb, includeInMemoryChanges?: true }): SqliteChangesetReader {\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openLocalChanges(args.db[_nativeDb], args.includeInMemoryChanges ?? false, args.invert ?? false);\r\n return reader;\r\n }\r\n /** check if schema check is disabled or not */\r\n public get disableSchemaCheck(): boolean { return this._disableSchemaCheck; }\r\n /** Move to next change in changeset\r\n * @returns true if there is current change false if reader is end of changeset.\r\n * @beta\r\n */\r\n public step(): boolean {\r\n if (this._nativeReader.step()) {\r\n this._changeIndex++;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** Check if reader current on a row\r\n * @beta\r\n */\r\n public get hasRow(): boolean {\r\n return this._nativeReader.hasRow();\r\n }\r\n /** Check if its current change is indirect\r\n * @beta\r\n */\r\n public get isIndirect(): boolean {\r\n return this._nativeReader.isIndirectChange();\r\n }\r\n /** Get count of columns in current change\r\n * @beta\r\n */\r\n public get columnCount(): number {\r\n return this._nativeReader.getColumnCount();\r\n }\r\n /** Get operation that caused the change\r\n * @beta\r\n */\r\n public get op(): SqliteChangeOp {\r\n if (this._nativeReader.getOpCode() === DbOpcode.Insert)\r\n return \"Inserted\";\r\n\r\n if (this._nativeReader.getOpCode() === DbOpcode.Delete)\r\n return \"Deleted\";\r\n\r\n return \"Updated\";\r\n }\r\n /** Get primary key value array\r\n * @beta\r\n */\r\n public get primaryKeyValues(): SqliteValueArray {\r\n return this._nativeReader.getPrimaryKeys();\r\n }\r\n /** Get primary key columns.\r\n * @note To this to work db arg must be set when opening changeset file.\r\n * @beta\r\n */\r\n public getPrimaryKeyColumnNames(): string[] {\r\n const cols = this.getColumnNames(this.tableName);\r\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\r\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\r\n\r\n return this._nativeReader.getPrimaryKeyColumnIndexes().map((i) => cols[i]);\r\n }\r\n /** Get current change table.\r\n * @beta\r\n */\r\n public get tableName(): string {\r\n return this._nativeReader.getTableName();\r\n }\r\n /**\r\n * Get changed binary value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\r\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType;\r\n }\r\n\r\n /**\r\n * Get changed binary value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueBinary(columnIndex: number, stage: SqliteValueStage): Uint8Array | null | undefined {\r\n return this._nativeReader.getColumnValueBinary(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get changed double value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueDouble(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\r\n return this._nativeReader.getColumnValueDouble(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get changed Id value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueId(columnIndex: number, stage: SqliteValueStage): Id64String | null | undefined {\r\n return this._nativeReader.getColumnValueId(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get changed integer value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueInteger(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\r\n return this._nativeReader.getColumnValueInteger(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get changed text value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueText(columnIndex: number, stage: SqliteValueStage): string | null | undefined {\r\n return this._nativeReader.getColumnValueText(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Check if change value is null\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns true if value is null\r\n * @beta\r\n */\r\n public isColumnValueNull(columnIndex: number, stage: SqliteValueStage): boolean | undefined {\r\n return this._nativeReader.isColumnValueNull(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get change value type\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns change value type\r\n * @beta\r\n */\r\n public getColumnValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\r\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType | undefined;\r\n }\r\n\r\n /**\r\n * Get changed value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValue(columnIndex: number, stage: SqliteValueStage): SqliteValue {\r\n return this._nativeReader.getColumnValue(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n /**\r\n * Get all changed value in current change as array\r\n * @param stage old or new values for current change.\r\n * @returns array of values.\r\n * @beta\r\n */\r\n public getChangeValuesArray(stage: SqliteValueStage): SqliteValueArray | undefined {\r\n return this._nativeReader.getRow(stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n /**\r\n * Get change as object and format its content.\r\n * @param stage old or new value for current change.\r\n * @param args change format options\r\n * @returns return object or undefined\r\n * @beta\r\n */\r\n public getChangeValuesObject(stage: SqliteValueStage, args: ChangeFormatArgs = {}): SqliteChange | undefined {\r\n const cols = this.getColumnNames(this.tableName);\r\n const row = this.getChangeValuesArray(stage);\r\n if (!row)\r\n return undefined;\r\n process.env;\r\n const minLen = Math.min(cols.length, row.length);\r\n\r\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\r\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\r\n\r\n const out: SqliteChange = {};\r\n if (args.includeTableName) {\r\n out.$table = this.tableName;\r\n }\r\n if (args.includeOpCode) {\r\n out.$op = this.op;\r\n }\r\n if (args.includeStage) {\r\n out.$stage = stage;\r\n }\r\n\r\n if (args.includePrimaryKeyInUpdateNew && this.op === \"Updated\" && stage === \"New\") {\r\n const pkNames = this.getPrimaryKeyColumnNames();\r\n const pkValues = this.primaryKeyValues;\r\n pkNames.forEach((v, i) => {\r\n out[v] = pkValues[i];\r\n });\r\n }\r\n const isNullOrUndefined = (val: SqliteValue) => typeof val === \"undefined\";\r\n\r\n for (let i = 0; i < minLen; ++i) {\r\n const columnValue = row[i];\r\n const columnName = cols[i];\r\n if (!args.includeNullColumns && isNullOrUndefined(columnValue))\r\n continue;\r\n\r\n out[columnName] = columnValue;\r\n }\r\n return out;\r\n }\r\n /**\r\n * Get list of column for a table. This function also caches the result.\r\n * @note To this to work db arg must be set when opening changeset file.\r\n * @param tableName name of the table for which columns are requested.\r\n * @returns columns of table.\r\n * @beta\r\n */\r\n public getColumnNames(tableName: string): string[] {\r\n const columns = this._schemaCache.get(tableName);\r\n if (columns)\r\n return columns;\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT [name] FROM PRAGMA_TABLE_INFO(?) ORDER BY [cid]\", (stmt) => {\r\n stmt.bindString(1, tableName);\r\n const tblCols: string[] = [];\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n tblCols.push(stmt.getValueString(0));\r\n }\r\n this._schemaCache.set(tableName, tblCols);\r\n return tblCols;\r\n });\r\n }\r\n /** index of current change\r\n * @beta\r\n */\r\n public get changeIndex() { return this._changeIndex; }\r\n /**\r\n * Close changeset\r\n * @beta\r\n */\r\n public close() {\r\n this._changeIndex = 0;\r\n this._nativeReader.close();\r\n }\r\n /**\r\n * Dispose this object\r\n * @beta\r\n */\r\n public [Symbol.dispose](): void {\r\n this.close();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"SqliteChangesetReader.js","sourceRoot":"","sources":["../../src/SqliteChangesetReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module SQLiteDb\r\n */\r\nimport { DbChangeStage, DbOpcode, DbResult, DbValueType, Id64String } from \"@itwin/core-bentley\";\r\nimport { ECDb } from \"./ECDb\";\r\nimport { IModelDb } from \"./IModelDb\";\r\nimport { IModelNative } from \"./internal/NativePlatform\";\r\nimport { _nativeDb } from \"./internal/Symbols\";\r\n\r\n/** Changed value type\r\n * @beta\r\n*/\r\ntype SqliteValue = Uint8Array | number | string | null | undefined;\r\n\r\n/** Array of changed values\r\n * @beta\r\n*/\r\ntype SqliteValueArray = SqliteValue[];\r\n/**\r\n * Format option when converting change from array to column/value object.\r\n * @beta\r\n */\r\nexport interface ChangeFormatArgs {\r\n /** include table name */\r\n includeTableName?: true;\r\n /** include op code */\r\n includeOpCode?: true;\r\n /** include null columns */\r\n includeNullColumns?: true;\r\n /** include value version */\r\n includeStage?: true;\r\n /** include primary key in update change */\r\n includePrimaryKeyInUpdateNew?: true;\r\n}\r\n\r\n/** Operation that cause the change\r\n * @beta\r\n*/\r\nexport type SqliteChangeOp = \"Inserted\" | \"Updated\" | \"Deleted\";\r\n\r\n/** Stage is version of value that needed to be read\r\n * @beta\r\n*/\r\nexport type SqliteValueStage = \"Old\" | \"New\";\r\n\r\n/** Db from which schema will be read. It should be from timeline to which changeset belong.\r\n * @beta\r\n*/\r\nexport type AnyDb = IModelDb | ECDb;\r\n\r\n/** Arg to open a changeset file from disk\r\n * @beta\r\n*/\r\nexport interface SqliteChangesetReaderArgs {\r\n /** db from which schema will be read. It should be at or ahead of the latest changeset being opened.*/\r\n readonly db: AnyDb;\r\n /** invert the changeset operations */\r\n readonly invert?: true;\r\n /** do not check if column of change match db schema instead ignore addition columns */\r\n readonly disableSchemaCheck?: true;\r\n}\r\n/**\r\n * Represent sqlite change.\r\n * @beta\r\n */\r\nexport interface SqliteChange {\r\n /** name of table */\r\n $table?: string;\r\n /** SQLite operation that created this change */\r\n $op?: SqliteChangeOp;\r\n /** version of data in change. */\r\n $stage?: SqliteValueStage;\r\n /** columns in change */\r\n [key: string]: any;\r\n}\r\n/**\r\n * Read raw sqlite changeset from disk and enumerate changes.\r\n * It also optionally let you format change with schema from\r\n * a db provided.\r\n * @beta\r\n */\r\nexport class SqliteChangesetReader implements Disposable {\r\n private readonly _nativeReader = new IModelNative.platform.ChangesetReader();\r\n private _schemaCache = new Map<string, string[]>();\r\n private _disableSchemaCheck = false;\r\n private _changeIndex = 0;\r\n protected constructor(\r\n /** db from where sql schema will be read */\r\n public readonly db: AnyDb,\r\n ) { }\r\n\r\n /**\r\n * Open changeset file from disk\r\n * @param args fileName of changeset reader and other options.\r\n * @returns SqliteChangesetReader instance\r\n */\r\n public static openFile(args: { readonly fileName: string } & SqliteChangesetReaderArgs): SqliteChangesetReader {\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openFile(args.fileName, args.invert ?? false);\r\n return reader;\r\n }\r\n /**\r\n * Group changeset file into single changeset and open that changeset.\r\n * @param args - The arguments for opening the changeset group. Requires an open db.\r\n * @returns The SqliteChangesetReader instance.\r\n */\r\n public static openGroup(args: { readonly changesetFiles: string[] } & SqliteChangesetReaderArgs): SqliteChangesetReader {\r\n if (args.changesetFiles.length === 0) {\r\n throw new Error(\"changesetFiles must contain at least one file.\");\r\n }\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openGroup(args.changesetFiles, args.db[_nativeDb], args.invert ?? false);\r\n return reader;\r\n }\r\n /**\r\n * Open txn change in iModel.\r\n * @param args iModel and other options.\r\n * @returns SqliteChangesetReader instance\r\n */\r\n public static openTxn(args: { txnId: Id64String } & SqliteChangesetReaderArgs): SqliteChangesetReader {\r\n if (args.db instanceof ECDb) {\r\n throw new Error(\"ECDb does not support openTxn\");\r\n }\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openTxn(args.db[_nativeDb], args.txnId, args.invert ?? false);\r\n return reader;\r\n }\r\n /**\r\n * Open in-memory changes for the given iModel.\r\n * @param args - The arguments for opening in-memory changes.\r\n * @returns SqliteChangesetReader instance\r\n */\r\n public static openInMemory(args: SqliteChangesetReaderArgs & { db: IModelDb }): SqliteChangesetReader {\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openInMemoryChanges(args.db[_nativeDb], args.invert ?? false);\r\n return reader;\r\n }\r\n /**\r\n * Writes the changeset to a file.\r\n * @note can be use with openGroup() or openLocalChanges() to persist changeset.\r\n * @param args - The arguments for writing to the file.\r\n * @param args.fileName - The name of the file to write to.\r\n * @param args.containsSchemaChanges - Indicates whether the changeset contains schema changes.\r\n * @param args.overwriteFile - Indicates whether to override the file if it already exists. Default is false.\r\n */\r\n public writeToFile(args: { fileName: string, containsSchemaChanges: boolean, overwriteFile?: boolean }): void {\r\n this._nativeReader.writeToFile(args.fileName, args.containsSchemaChanges, args.overwriteFile ?? false);\r\n }\r\n /**\r\n * Open local changes in iModel.\r\n * @param args iModel and other options.\r\n * @param args.db must be of type IModelDb\r\n * @returns SqliteChangesetReader instance\r\n */\r\n public static openLocalChanges(args: Omit<SqliteChangesetReaderArgs, \"db\"> & { db: IModelDb, includeInMemoryChanges?: true }): SqliteChangesetReader {\r\n const reader = new SqliteChangesetReader(args.db);\r\n reader._disableSchemaCheck = args.disableSchemaCheck ?? false;\r\n reader._nativeReader.openLocalChanges(args.db[_nativeDb], args.includeInMemoryChanges ?? false, args.invert ?? false);\r\n return reader;\r\n }\r\n /** check if schema check is disabled or not */\r\n public get disableSchemaCheck(): boolean { return this._disableSchemaCheck; }\r\n /** Move to next change in changeset\r\n * @returns true if there is current change false if reader is end of changeset.\r\n * @beta\r\n */\r\n public step(): boolean {\r\n if (this._nativeReader.step()) {\r\n this._changeIndex++;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /** Check if reader current on a row\r\n * @beta\r\n */\r\n public get hasRow(): boolean {\r\n return this._nativeReader.hasRow();\r\n }\r\n /** Check if its current change is indirect\r\n * @beta\r\n */\r\n public get isIndirect(): boolean {\r\n return this._nativeReader.isIndirectChange();\r\n }\r\n /** Get count of columns in current change\r\n * @beta\r\n */\r\n public get columnCount(): number {\r\n return this._nativeReader.getColumnCount();\r\n }\r\n /** Get operation that caused the change\r\n * @beta\r\n */\r\n public get op(): SqliteChangeOp {\r\n if (this._nativeReader.getOpCode() === DbOpcode.Insert)\r\n return \"Inserted\";\r\n\r\n if (this._nativeReader.getOpCode() === DbOpcode.Delete)\r\n return \"Deleted\";\r\n\r\n return \"Updated\";\r\n }\r\n /** Get primary key value array\r\n * @beta\r\n */\r\n public get primaryKeyValues(): SqliteValueArray {\r\n return this._nativeReader.getPrimaryKeys();\r\n }\r\n /** Get primary key columns.\r\n * @note To this to work db arg must be set when opening changeset file.\r\n * @beta\r\n */\r\n public getPrimaryKeyColumnNames(): string[] {\r\n const cols = this.getColumnNames(this.tableName);\r\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\r\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\r\n\r\n return this._nativeReader.getPrimaryKeyColumnIndexes().map((i) => cols[i]);\r\n }\r\n /** Get current change table.\r\n * @beta\r\n */\r\n public get tableName(): string {\r\n return this._nativeReader.getTableName();\r\n }\r\n /**\r\n * Get changed binary value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\r\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType;\r\n }\r\n\r\n /**\r\n * Get changed binary value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueBinary(columnIndex: number, stage: SqliteValueStage): Uint8Array | null | undefined {\r\n return this._nativeReader.getColumnValueBinary(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get changed double value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueDouble(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\r\n return this._nativeReader.getColumnValueDouble(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get changed Id value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueId(columnIndex: number, stage: SqliteValueStage): Id64String | null | undefined {\r\n return this._nativeReader.getColumnValueId(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get changed integer value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueInteger(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\r\n return this._nativeReader.getColumnValueInteger(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get changed text value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValueText(columnIndex: number, stage: SqliteValueStage): string | null | undefined {\r\n return this._nativeReader.getColumnValueText(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Check if change value is null\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns true if value is null\r\n * @beta\r\n */\r\n public isColumnValueNull(columnIndex: number, stage: SqliteValueStage): boolean | undefined {\r\n return this._nativeReader.isColumnValueNull(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n\r\n /**\r\n * Get change value type\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns change value type\r\n * @beta\r\n */\r\n public getColumnValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | undefined {\r\n return this._nativeReader.getColumnValueType(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old) as DbValueType | undefined;\r\n }\r\n\r\n /**\r\n * Get changed value for a column\r\n * @param columnIndex index of column in current change\r\n * @param stage old or new value for change.\r\n * @returns value for changed column\r\n * @beta\r\n */\r\n public getChangeValue(columnIndex: number, stage: SqliteValueStage): SqliteValue {\r\n return this._nativeReader.getColumnValue(columnIndex, stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n /**\r\n * Get all changed value in current change as array\r\n * @param stage old or new values for current change.\r\n * @returns array of values.\r\n * @beta\r\n */\r\n public getChangeValuesArray(stage: SqliteValueStage): SqliteValueArray | undefined {\r\n return this._nativeReader.getRow(stage === \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n /**\r\n * Get change as object and format its content.\r\n * @param stage old or new value for current change.\r\n * @param args change format options\r\n * @returns return object or undefined\r\n * @beta\r\n */\r\n public getChangeValuesObject(stage: SqliteValueStage, args: ChangeFormatArgs = {}): SqliteChange | undefined {\r\n const cols = this.getColumnNames(this.tableName);\r\n const row = this.getChangeValuesArray(stage);\r\n if (!row)\r\n return undefined;\r\n process.env;\r\n const minLen = Math.min(cols.length, row.length);\r\n\r\n if (!this._disableSchemaCheck && cols.length !== this.columnCount)\r\n throw new Error(`changeset table ${this.tableName} columns count does not match db declared table. ${this.columnCount} <> ${cols.length}`);\r\n\r\n const out: SqliteChange = {};\r\n if (args.includeTableName) {\r\n out.$table = this.tableName;\r\n }\r\n if (args.includeOpCode) {\r\n out.$op = this.op;\r\n }\r\n if (args.includeStage) {\r\n out.$stage = stage;\r\n }\r\n\r\n if (args.includePrimaryKeyInUpdateNew && this.op === \"Updated\" && stage === \"New\") {\r\n const pkNames = this.getPrimaryKeyColumnNames();\r\n const pkValues = this.primaryKeyValues;\r\n pkNames.forEach((v, i) => {\r\n out[v] = pkValues[i];\r\n });\r\n }\r\n const isNullOrUndefined = (val: SqliteValue) => typeof val === \"undefined\";\r\n\r\n for (let i = 0; i < minLen; ++i) {\r\n const columnValue = row[i];\r\n const columnName = cols[i];\r\n if (!args.includeNullColumns && isNullOrUndefined(columnValue))\r\n continue;\r\n\r\n out[columnName] = columnValue;\r\n }\r\n return out;\r\n }\r\n /**\r\n * Get list of column for a table. This function also caches the result.\r\n * @note To this to work db arg must be set when opening changeset file.\r\n * @param tableName name of the table for which columns are requested.\r\n * @returns columns of table.\r\n * @beta\r\n */\r\n public getColumnNames(tableName: string): string[] {\r\n const columns = this._schemaCache.get(tableName);\r\n if (columns)\r\n return columns;\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT [name] FROM PRAGMA_TABLE_INFO(?) ORDER BY [cid]\", (stmt) => {\r\n stmt.bindString(1, tableName);\r\n const tblCols: string[] = [];\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n tblCols.push(stmt.getValueString(0));\r\n }\r\n this._schemaCache.set(tableName, tblCols);\r\n return tblCols;\r\n });\r\n }\r\n /** index of current change\r\n * @beta\r\n */\r\n public get changeIndex() { return this._changeIndex; }\r\n /**\r\n * Close changeset\r\n * @beta\r\n */\r\n public close() {\r\n this._changeIndex = 0;\r\n this._nativeReader.close();\r\n }\r\n /**\r\n * Dispose this object\r\n * @beta\r\n */\r\n public [Symbol.dispose](): void {\r\n this.close();\r\n }\r\n /**\r\n * Get Data Definition Language changes\r\n * @beta\r\n */\r\n public getDdlChanges(): string | undefined {\r\n return this._nativeReader.getDdlChanges();\r\n }\r\n}\r\n"]}
@@ -2,7 +2,7 @@
2
2
  * @module Elements
3
3
  */
4
4
  import { Id64String } from "@itwin/core-bentley";
5
- import { ChannelControl, ChannelKey } from "../ChannelControl";
5
+ import { ChannelControl, ChannelKey, ChannelUpgradeOptions } from "../ChannelControl";
6
6
  import { IModelDb } from "../IModelDb";
7
7
  import { _implementationProhibited, _verifyChannel } from "./Symbols";
8
8
  declare class ChannelAdmin implements ChannelControl {
@@ -28,6 +28,7 @@ declare class ChannelAdmin implements ChannelControl {
28
28
  description?: string;
29
29
  }): Id64String;
30
30
  queryChannelRoot(channelKey: ChannelKey): Id64String | undefined;
31
+ upgradeChannel(options: ChannelUpgradeOptions, iModel: IModelDb, data?: any): Promise<void>;
31
32
  }
32
33
  export declare function createChannelControl(iModel: IModelDb): ChannelAdmin;
33
34
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelAdmin.d.ts","sourceRoot":"","sources":["../../../src/internal/ChannelAdmin.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAY,UAAU,EAAgB,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,OAAO,EAAE,yBAAyB,EAAa,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjF,cAAM,YAAa,YAAW,cAAc;IAQvB,OAAO,CAAC,OAAO;IAPlC,gBAAuB,gBAAgB,2BAA2B;IAElE,SAAgB,CAAC,yBAAyB,CAAC,YAAa;IACxD,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,aAAa,CAAqC;gBAE/B,OAAO,EAAE,QAAQ;IAMrC,iBAAiB,CAAC,UAAU,EAAE,UAAU;IAKxC,oBAAoB,CAAC,UAAU,EAAE,UAAU;IAK3C,aAAa,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IA6BhD,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAmB3C,eAAe,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE;IAmBvE,oBAAoB,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAC;QAAC,eAAe,CAAC,EAAE,UAAU,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU;IAY3I,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS;CAoBxE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,YAAY,CAEnE"}
1
+ {"version":3,"file":"ChannelAdmin.d.ts","sourceRoot":"","sources":["../../../src/internal/ChannelAdmin.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAY,UAAU,EAAgB,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAyB,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE7G,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,OAAO,EAAE,yBAAyB,EAAa,cAAc,EAAE,MAAM,WAAW,CAAC;AAGjF,cAAM,YAAa,YAAW,cAAc;IAQvB,OAAO,CAAC,OAAO;IAPlC,gBAAuB,gBAAgB,2BAA2B;IAElE,SAAgB,CAAC,yBAAyB,CAAC,YAAa;IACxD,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,aAAa,CAAqC;gBAE/B,OAAO,EAAE,QAAQ;IAMrC,iBAAiB,CAAC,UAAU,EAAE,UAAU;IAKxC,oBAAoB,CAAC,UAAU,EAAE,UAAU;IAK3C,aAAa,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IA6BhD,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAmB3C,eAAe,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE;IAmBvE,oBAAoB,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAC;QAAC,eAAe,CAAC,EAAE,UAAU,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU;IAY3I,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS;IAqB1D,cAAc,CAAC,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAyBzG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,YAAY,CAEnE"}
@@ -15,6 +15,7 @@ const Element_1 = require("../Element");
15
15
  const IModelHost_1 = require("../IModelHost");
16
16
  const NavigationRelationship_1 = require("../NavigationRelationship");
17
17
  const Symbols_1 = require("./Symbols");
18
+ const semver = require("semver");
18
19
  class ChannelAdmin {
19
20
  _iModel;
20
21
  static channelClassName = "bis:ChannelRootAspect";
@@ -120,6 +121,28 @@ class ChannelAdmin {
120
121
  return undefined;
121
122
  }
122
123
  }
124
+ async upgradeChannel(options, iModel, data) {
125
+ // Validations
126
+ if (!this._allowedChannels.has(options.channelKey))
127
+ core_common_1.ChannelControlError.throwError("not-allowed", `Channel ${options.channelKey} is not allowed`, options.channelKey);
128
+ if (semver.gte(options.fromVersion, options.toVersion))
129
+ core_common_1.ChannelControlError.throwError("not-allowed", `Upgrading channel ${options.channelKey} from ${options.fromVersion} to ${options.toVersion} is not allowed`, options.channelKey);
130
+ if (!this.queryChannelRoot(options.channelKey) && options.channelKey !== ChannelControl_1.ChannelControl.sharedChannelName)
131
+ core_common_1.ChannelControlError.throwError("not-allowed", `Channel ${options.channelKey} not found`, options.channelKey);
132
+ const context = {
133
+ iModel,
134
+ channelKey: options.channelKey,
135
+ fromVersion: options.fromVersion,
136
+ toVersion: options.toVersion,
137
+ data,
138
+ };
139
+ try {
140
+ await options.callback(context);
141
+ }
142
+ catch (error) {
143
+ core_common_1.ChannelControlError.throwError(error, "channel-upgrade-failed", `Channel ${options.channelKey} upgrade failed: ${error.message}`);
144
+ }
145
+ }
123
146
  }
124
147
  function createChannelControl(iModel) {
125
148
  return new ChannelAdmin(iModel);
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelAdmin.js","sourceRoot":"","sources":["../../../src/internal/ChannelAdmin.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\n\r\nimport { DbResult, Id64String, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { ChannelControlError, ChannelRootAspectProps, IModel, IModelError } from \"@itwin/core-common\";\r\nimport { ChannelControl, ChannelKey } from \"../ChannelControl\";\r\nimport { Subject } from \"../Element\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { ElementOwnsChannelRootAspect } from \"../NavigationRelationship\";\r\nimport { _implementationProhibited, _nativeDb, _verifyChannel } from \"./Symbols\";\r\n\r\nclass ChannelAdmin implements ChannelControl {\r\n public static readonly channelClassName = \"bis:ChannelRootAspect\";\r\n\r\n public readonly [_implementationProhibited] = undefined;\r\n private _allowedChannels = new Set<ChannelKey>();\r\n private _allowedModels = new Set<Id64String>();\r\n private _deniedModels = new Map<Id64String, ChannelKey>();\r\n\r\n public constructor(private _iModel: IModelDb) {\r\n // for backwards compatibility, allow the shared channel unless explicitly turned off in IModelHostOptions.\r\n if (IModelHost.configuration?.allowSharedChannel !== false)\r\n this._allowedChannels.add(ChannelControl.sharedChannelName);\r\n }\r\n\r\n public addAllowedChannel(channelKey: ChannelKey) {\r\n this._allowedChannels.add(channelKey);\r\n this._deniedModels.clear();\r\n }\r\n\r\n public removeAllowedChannel(channelKey: ChannelKey) {\r\n this._allowedChannels.delete(channelKey);\r\n this._allowedModels.clear();\r\n }\r\n\r\n public getChannelKey(elementId: Id64String): ChannelKey {\r\n if (elementId === IModel.rootSubjectId)\r\n return ChannelControl.sharedChannelName;\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const channel = this._iModel.withPreparedStatement(`SELECT Owner FROM ${ChannelAdmin.channelClassName} WHERE Element.Id=?`, (stmt) => {\r\n stmt.bindId(1, elementId);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getString() : undefined;\r\n });\r\n\r\n if (channel !== undefined)\r\n return channel;\r\n } catch {\r\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\r\n // In that case all data in such iModel is assumed to be in the shared channel.\r\n return ChannelControl.sharedChannelName;\r\n }\r\n\r\n const parentId = this._iModel.withPreparedSqliteStatement(\"SELECT ParentId,ModelId FROM bis_Element WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"Element does not exist\");\r\n return stmt.getValueId(0) ?? stmt.getValueId(1); // if parent is undefined, use modelId\r\n });\r\n\r\n return this.getChannelKey(parentId);\r\n }\r\n\r\n public [_verifyChannel](modelId: Id64String): void {\r\n // Note: indirect changes are permitted to change any channel\r\n if (this._allowedModels.has(modelId) || this._iModel[_nativeDb].getTxnMode() === \"indirect\")\r\n return;\r\n\r\n const deniedChannel = this._deniedModels.get(modelId);\r\n if (undefined !== deniedChannel)\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${deniedChannel} is not allowed`, deniedChannel);\r\n\r\n const channel = this.getChannelKey(modelId);\r\n if (this._allowedChannels.has(channel)) {\r\n this._allowedModels.add(modelId);\r\n return;\r\n }\r\n\r\n this._deniedModels.set(modelId, channel);\r\n return this[_verifyChannel](modelId);\r\n }\r\n\r\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey }) {\r\n const channelKey = this.getChannelKey(args.elementId);\r\n if (ChannelControl.sharedChannelName !== channelKey)\r\n ChannelControlError.throwError(\"may-not-nest\", `Channel ${channelKey} may not nest`, channelKey);\r\n\r\n if (this.queryChannelRoot(args.channelKey) !== undefined)\r\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, channelKey);\r\n\r\n const props: ChannelRootAspectProps = {\r\n classFullName: ChannelAdmin.channelClassName,\r\n element: {\r\n id: args.elementId,\r\n relClassName: ElementOwnsChannelRootAspect.classFullName,\r\n },\r\n owner: args.channelKey,\r\n };\r\n this._iModel.elements.insertAspect(props);\r\n }\r\n\r\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string }): Id64String {\r\n // Check if channelKey already exists before inserting Subject.\r\n // makeChannelRoot will check that again, but at that point the new Subject is already inserted.\r\n // Prefer to check twice instead of deleting the Subject in the latter option.\r\n if (this.queryChannelRoot(args.channelKey) !== undefined)\r\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, args.channelKey);\r\n\r\n const elementId = Subject.insert(this._iModel, args.parentSubjectId ?? IModel.rootSubjectId, args.subjectName, args.description);\r\n this.makeChannelRoot({ elementId, channelKey: args.channelKey });\r\n return elementId;\r\n }\r\n\r\n public queryChannelRoot(channelKey: ChannelKey): Id64String | undefined {\r\n if (channelKey === ChannelControl.sharedChannelName)\r\n // RootSubject acts as the ChannelRoot element of the shared channel\r\n return IModel.rootSubjectId;\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const channelRoot = this._iModel.withPreparedStatement(`SELECT Element.Id FROM ${ChannelAdmin.channelClassName} WHERE Owner=?`, (stmt) => {\r\n stmt.bindString(1, channelKey);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getId() : undefined;\r\n });\r\n\r\n return channelRoot;\r\n } catch {\r\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\r\n // In that case all data in such iModel is assumed to be in the shared channel.\r\n return undefined;\r\n }\r\n\r\n }\r\n}\r\n\r\nexport function createChannelControl(iModel: IModelDb): ChannelAdmin {\r\n return new ChannelAdmin(iModel);\r\n}\r\n"]}
1
+ {"version":3,"file":"ChannelAdmin.js","sourceRoot":"","sources":["../../../src/internal/ChannelAdmin.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\n\r\nimport { DbResult, Id64String, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { ChannelControlError, ChannelRootAspectProps, IModel, IModelError } from \"@itwin/core-common\";\r\nimport { ChannelControl, ChannelKey, ChannelUpgradeContext, ChannelUpgradeOptions } from \"../ChannelControl\";\r\nimport { Subject } from \"../Element\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { ElementOwnsChannelRootAspect } from \"../NavigationRelationship\";\r\nimport { _implementationProhibited, _nativeDb, _verifyChannel } from \"./Symbols\";\r\nimport * as semver from \"semver\";\r\n\r\nclass ChannelAdmin implements ChannelControl {\r\n public static readonly channelClassName = \"bis:ChannelRootAspect\";\r\n\r\n public readonly [_implementationProhibited] = undefined;\r\n private _allowedChannels = new Set<ChannelKey>();\r\n private _allowedModels = new Set<Id64String>();\r\n private _deniedModels = new Map<Id64String, ChannelKey>();\r\n\r\n public constructor(private _iModel: IModelDb) {\r\n // for backwards compatibility, allow the shared channel unless explicitly turned off in IModelHostOptions.\r\n if (IModelHost.configuration?.allowSharedChannel !== false)\r\n this._allowedChannels.add(ChannelControl.sharedChannelName);\r\n }\r\n\r\n public addAllowedChannel(channelKey: ChannelKey) {\r\n this._allowedChannels.add(channelKey);\r\n this._deniedModels.clear();\r\n }\r\n\r\n public removeAllowedChannel(channelKey: ChannelKey) {\r\n this._allowedChannels.delete(channelKey);\r\n this._allowedModels.clear();\r\n }\r\n\r\n public getChannelKey(elementId: Id64String): ChannelKey {\r\n if (elementId === IModel.rootSubjectId)\r\n return ChannelControl.sharedChannelName;\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const channel = this._iModel.withPreparedStatement(`SELECT Owner FROM ${ChannelAdmin.channelClassName} WHERE Element.Id=?`, (stmt) => {\r\n stmt.bindId(1, elementId);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getString() : undefined;\r\n });\r\n\r\n if (channel !== undefined)\r\n return channel;\r\n } catch {\r\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\r\n // In that case all data in such iModel is assumed to be in the shared channel.\r\n return ChannelControl.sharedChannelName;\r\n }\r\n\r\n const parentId = this._iModel.withPreparedSqliteStatement(\"SELECT ParentId,ModelId FROM bis_Element WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"Element does not exist\");\r\n return stmt.getValueId(0) ?? stmt.getValueId(1); // if parent is undefined, use modelId\r\n });\r\n\r\n return this.getChannelKey(parentId);\r\n }\r\n\r\n public [_verifyChannel](modelId: Id64String): void {\r\n // Note: indirect changes are permitted to change any channel\r\n if (this._allowedModels.has(modelId) || this._iModel[_nativeDb].getTxnMode() === \"indirect\")\r\n return;\r\n\r\n const deniedChannel = this._deniedModels.get(modelId);\r\n if (undefined !== deniedChannel)\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${deniedChannel} is not allowed`, deniedChannel);\r\n\r\n const channel = this.getChannelKey(modelId);\r\n if (this._allowedChannels.has(channel)) {\r\n this._allowedModels.add(modelId);\r\n return;\r\n }\r\n\r\n this._deniedModels.set(modelId, channel);\r\n return this[_verifyChannel](modelId);\r\n }\r\n\r\n public makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey }) {\r\n const channelKey = this.getChannelKey(args.elementId);\r\n if (ChannelControl.sharedChannelName !== channelKey)\r\n ChannelControlError.throwError(\"may-not-nest\", `Channel ${channelKey} may not nest`, channelKey);\r\n\r\n if (this.queryChannelRoot(args.channelKey) !== undefined)\r\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, channelKey);\r\n\r\n const props: ChannelRootAspectProps = {\r\n classFullName: ChannelAdmin.channelClassName,\r\n element: {\r\n id: args.elementId,\r\n relClassName: ElementOwnsChannelRootAspect.classFullName,\r\n },\r\n owner: args.channelKey,\r\n };\r\n this._iModel.elements.insertAspect(props);\r\n }\r\n\r\n public insertChannelSubject(args: { subjectName: string, channelKey: ChannelKey, parentSubjectId?: Id64String, description?: string }): Id64String {\r\n // Check if channelKey already exists before inserting Subject.\r\n // makeChannelRoot will check that again, but at that point the new Subject is already inserted.\r\n // Prefer to check twice instead of deleting the Subject in the latter option.\r\n if (this.queryChannelRoot(args.channelKey) !== undefined)\r\n ChannelControlError.throwError(\"root-exists\", `Channel ${args.channelKey} root already exist`, args.channelKey);\r\n\r\n const elementId = Subject.insert(this._iModel, args.parentSubjectId ?? IModel.rootSubjectId, args.subjectName, args.description);\r\n this.makeChannelRoot({ elementId, channelKey: args.channelKey });\r\n return elementId;\r\n }\r\n\r\n public queryChannelRoot(channelKey: ChannelKey): Id64String | undefined {\r\n if (channelKey === ChannelControl.sharedChannelName)\r\n // RootSubject acts as the ChannelRoot element of the shared channel\r\n return IModel.rootSubjectId;\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n const channelRoot = this._iModel.withPreparedStatement(`SELECT Element.Id FROM ${ChannelAdmin.channelClassName} WHERE Owner=?`, (stmt) => {\r\n stmt.bindString(1, channelKey);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValue(0).getId() : undefined;\r\n });\r\n\r\n return channelRoot;\r\n } catch {\r\n // Exception happens if the iModel is too old: ChannelRootAspect class not present in the BisCore schema (older than v1.0.10).\r\n // In that case all data in such iModel is assumed to be in the shared channel.\r\n return undefined;\r\n }\r\n\r\n }\r\n\r\n public async upgradeChannel(options: ChannelUpgradeOptions, iModel: IModelDb, data?: any): Promise<void> {\r\n // Validations\r\n if (!this._allowedChannels.has(options.channelKey))\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} is not allowed`, options.channelKey);\r\n\r\n if (semver.gte(options.fromVersion, options.toVersion))\r\n ChannelControlError.throwError(\"not-allowed\", `Upgrading channel ${options.channelKey} from ${options.fromVersion} to ${options.toVersion} is not allowed`, options.channelKey);\r\n\r\n if (!this.queryChannelRoot(options.channelKey) && options.channelKey !== ChannelControl.sharedChannelName)\r\n ChannelControlError.throwError(\"not-allowed\", `Channel ${options.channelKey} not found`, options.channelKey);\r\n\r\n const context: ChannelUpgradeContext = {\r\n iModel,\r\n channelKey: options.channelKey,\r\n fromVersion: options.fromVersion,\r\n toVersion: options.toVersion,\r\n data,\r\n };\r\n\r\n try {\r\n await options.callback(context);\r\n } catch (error: any) {\r\n ChannelControlError.throwError(error, \"channel-upgrade-failed\", `Channel ${options.channelKey} upgrade failed: ${error.message}`);\r\n }\r\n }\r\n}\r\n\r\nexport function createChannelControl(iModel: IModelDb): ChannelAdmin {\r\n return new ChannelAdmin(iModel);\r\n}\r\n"]}
@@ -3,10 +3,34 @@
3
3
  */
4
4
  import { Id64String } from "@itwin/core-bentley";
5
5
  import { _implementationProhibited, _verifyChannel } from "./internal/Symbols";
6
+ import { IModelDb } from "./IModelDb";
6
7
  /** The key for a channel. Used for "allowed channels" in [[ChannelControl]]
7
8
  * @beta
8
9
  */
9
10
  export type ChannelKey = string;
11
+ /**
12
+ * Context provided to the channel upgrade callback.
13
+ * @beta
14
+ */
15
+ export interface ChannelUpgradeContext<T = any> {
16
+ iModel: IModelDb;
17
+ channelKey: string;
18
+ fromVersion: string;
19
+ toVersion: string;
20
+ /** Optional data to be used during the upgrade */
21
+ data?: T;
22
+ }
23
+ /**
24
+ * Options for upgrading a channel before schema import.
25
+ * The framework will automatically populate the context with iModel and data.
26
+ * @beta
27
+ */
28
+ export interface ChannelUpgradeOptions<T = any> {
29
+ channelKey: string;
30
+ fromVersion: string;
31
+ toVersion: string;
32
+ callback: (context: ChannelUpgradeContext<T>) => Promise<void>;
33
+ }
10
34
  /**
11
35
  * Controls which channels of an iModel are permitted for write operations. An implementation of this interface is
12
36
  * available via [[IModelDb.channels]].
@@ -59,6 +83,11 @@ export interface ChannelControl {
59
83
  queryChannelRoot(channelKey: ChannelKey): Id64String | undefined;
60
84
  /** @internal */
61
85
  [_verifyChannel]: (modelId: Id64String) => void;
86
+ /**
87
+ * Upgrade a channel to a new version.
88
+ * @beta
89
+ */
90
+ upgradeChannel(options: ChannelUpgradeOptions, iModel: IModelDb, data?: any): Promise<void>;
62
91
  }
63
92
  /** @beta */
64
93
  export declare namespace ChannelControl {
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelControl.d.ts","sourceRoot":"","sources":["../../src/ChannelControl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,QAAQ,CAAC,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAE9C;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAChD;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACnD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACjD;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/E;;;OAGG;IACH,oBAAoB,CAAC,IAAI,EAAE;QACzB,0CAA0C;QAC1C,WAAW,EAAE,MAAM,CAAC;QACpB,kGAAkG;QAClG,UAAU,EAAE,UAAU,CAAC;QACvB,oFAAoF;QACpF,eAAe,CAAC,EAAE,UAAU,CAAC;QAC7B,4CAA4C;QAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,UAAU,CAAC;IACf;;;;;OAKG;IACH,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAEjE,gBAAgB;IAChB,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;CACjD;AAED,YAAY;AACZ,yBAAiB,cAAc,CAAC;IAC9B,wGAAwG;IACjG,MAAM,iBAAiB,WAAW,CAAC;CAC3C"}
1
+ {"version":3,"file":"ChannelControl.d.ts","sourceRoot":"","sources":["../../src/ChannelControl.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,GAAG;IAC5C,MAAM,EAAE,QAAQ,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,IAAI,CAAC,EAAE,CAAC,CAAC;CACV;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,GAAG;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB;IAChB,QAAQ,CAAC,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC;IAE9C;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAChD;;OAEG;IACH,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACnD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;IACjD;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,UAAU,CAAC;QAAC,UAAU,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAC/E;;;OAGG;IACH,oBAAoB,CAAC,IAAI,EAAE;QACzB,0CAA0C;QAC1C,WAAW,EAAE,MAAM,CAAC;QACpB,kGAAkG;QAClG,UAAU,EAAE,UAAU,CAAC;QACvB,oFAAoF;QACpF,eAAe,CAAC,EAAE,UAAU,CAAC;QAC7B,4CAA4C;QAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,UAAU,CAAC;IACf;;;;;OAKG;IACH,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAEjE,gBAAgB;IAChB,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAEhD;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7F;AAED,YAAY;AACZ,yBAAiB,cAAc,CAAC;IAC9B,wGAAwG;IACjG,MAAM,iBAAiB,WAAW,CAAC;CAC3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelControl.js","sourceRoot":"","sources":["../../src/ChannelControl.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA4D/E,YAAY;AACZ,MAAM,KAAW,cAAc,CAG9B;AAHD,WAAiB,cAAc;IAC7B,wGAAwG;IAC3F,gCAAiB,GAAG,QAAQ,CAAC;AAC5C,CAAC,EAHgB,cAAc,KAAd,cAAc,QAG9B","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\n\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { _implementationProhibited, _verifyChannel } from \"./internal/Symbols\";\r\n\r\n/** The key for a channel. Used for \"allowed channels\" in [[ChannelControl]]\r\n * @beta\r\n */\r\nexport type ChannelKey = string;\r\n\r\n/**\r\n * Controls which channels of an iModel are permitted for write operations. An implementation of this interface is\r\n * available via [[IModelDb.channels]].\r\n * @see [Working With Channels]($docs/learning/backend/Channel.md) for details\r\n * @beta\r\n */\r\nexport interface ChannelControl {\r\n /** @internal */\r\n readonly [_implementationProhibited]: unknown;\r\n\r\n /** Add a new channel to the list of allowed channels of the [[IModelDb]] for this session.\r\n * @param channelKey The key for the channel to become editable in this session.\r\n */\r\n addAllowedChannel(channelKey: ChannelKey): void;\r\n /** Remove a channel from the list of allowed channels of the [[IModelDb]] for this session.\r\n * @param channelKey The key of the channel that should no longer be editable in this session.\r\n */\r\n removeAllowedChannel(channelKey: ChannelKey): void;\r\n /** Get the channelKey of the channel for an element by ElementId.\r\n * @throws if the element does not exist\r\n */\r\n getChannelKey(elementId: Id64String): ChannelKey;\r\n /** Make an existing element a new Channel root.\r\n * @throws if the element is already in a channel different than the shared channel, or if\r\n * there is already another channelRoot element for the specified channelKey\r\n */\r\n makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey }): void;\r\n /** Insert a new Subject element that is a Channel Root in this iModel.\r\n * @returns the ElementId of the new Subject element.\r\n * @note if the parentSubject element is already in a channel, this will add the Subject element and then throw an error without making it a Channel root.\r\n */\r\n insertChannelSubject(args: {\r\n /** The name of the new Subject element */\r\n subjectName: string;\r\n /** The channel key for the new [[Subject]]. This is the string to pass to [[addAllowedChannel]]*/\r\n channelKey: ChannelKey;\r\n /** the Id of the parent of the new Subject. Default is [[IModel.rootSubjectId]]. */\r\n parentSubjectId?: Id64String;\r\n /** Optional description for new Subject. */\r\n description?: string;\r\n }): Id64String;\r\n /**\r\n * Queries for the element Id acting as the ChannelRoot for a given channelKey, if any\r\n * @param channelKey The key for the channel to query for\r\n * @returns The element Id of the ChannelRoot element of the specified Channel key, or undefined if\r\n * there is no ChannelRoot for it\r\n */\r\n queryChannelRoot(channelKey: ChannelKey): Id64String | undefined;\r\n\r\n /** @internal */\r\n [_verifyChannel]: (modelId: Id64String) => void;\r\n}\r\n\r\n/** @beta */\r\nexport namespace ChannelControl {\r\n /** the name of the special \"shared\" channel holding information that is editable by any application. */\r\n export const sharedChannelName = \"shared\";\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"ChannelControl.js","sourceRoot":"","sources":["../../src/ChannelControl.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA4F/E,YAAY;AACZ,MAAM,KAAW,cAAc,CAG9B;AAHD,WAAiB,cAAc;IAC7B,wGAAwG;IAC3F,gCAAiB,GAAG,QAAQ,CAAC;AAC5C,CAAC,EAHgB,cAAc,KAAd,cAAc,QAG9B","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Elements\r\n */\r\n\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { _implementationProhibited, _verifyChannel } from \"./internal/Symbols\";\r\nimport { IModelDb } from \"./IModelDb\";\r\n\r\n/** The key for a channel. Used for \"allowed channels\" in [[ChannelControl]]\r\n * @beta\r\n */\r\nexport type ChannelKey = string;\r\n\r\n/**\r\n * Context provided to the channel upgrade callback.\r\n * @beta\r\n */\r\nexport interface ChannelUpgradeContext<T = any> {\r\n iModel: IModelDb;\r\n channelKey: string;\r\n fromVersion: string;\r\n toVersion: string;\r\n /** Optional data to be used during the upgrade */\r\n data?: T;\r\n}\r\n\r\n/**\r\n * Options for upgrading a channel before schema import.\r\n * The framework will automatically populate the context with iModel and data.\r\n * @beta\r\n */\r\nexport interface ChannelUpgradeOptions<T = any> {\r\n channelKey: string;\r\n fromVersion: string;\r\n toVersion: string;\r\n callback: (context: ChannelUpgradeContext<T>) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Controls which channels of an iModel are permitted for write operations. An implementation of this interface is\r\n * available via [[IModelDb.channels]].\r\n * @see [Working With Channels]($docs/learning/backend/Channel.md) for details\r\n * @beta\r\n */\r\nexport interface ChannelControl {\r\n /** @internal */\r\n readonly [_implementationProhibited]: unknown;\r\n\r\n /** Add a new channel to the list of allowed channels of the [[IModelDb]] for this session.\r\n * @param channelKey The key for the channel to become editable in this session.\r\n */\r\n addAllowedChannel(channelKey: ChannelKey): void;\r\n /** Remove a channel from the list of allowed channels of the [[IModelDb]] for this session.\r\n * @param channelKey The key of the channel that should no longer be editable in this session.\r\n */\r\n removeAllowedChannel(channelKey: ChannelKey): void;\r\n /** Get the channelKey of the channel for an element by ElementId.\r\n * @throws if the element does not exist\r\n */\r\n getChannelKey(elementId: Id64String): ChannelKey;\r\n /** Make an existing element a new Channel root.\r\n * @throws if the element is already in a channel different than the shared channel, or if\r\n * there is already another channelRoot element for the specified channelKey\r\n */\r\n makeChannelRoot(args: { elementId: Id64String, channelKey: ChannelKey }): void;\r\n /** Insert a new Subject element that is a Channel Root in this iModel.\r\n * @returns the ElementId of the new Subject element.\r\n * @note if the parentSubject element is already in a channel, this will add the Subject element and then throw an error without making it a Channel root.\r\n */\r\n insertChannelSubject(args: {\r\n /** The name of the new Subject element */\r\n subjectName: string;\r\n /** The channel key for the new [[Subject]]. This is the string to pass to [[addAllowedChannel]]*/\r\n channelKey: ChannelKey;\r\n /** the Id of the parent of the new Subject. Default is [[IModel.rootSubjectId]]. */\r\n parentSubjectId?: Id64String;\r\n /** Optional description for new Subject. */\r\n description?: string;\r\n }): Id64String;\r\n /**\r\n * Queries for the element Id acting as the ChannelRoot for a given channelKey, if any\r\n * @param channelKey The key for the channel to query for\r\n * @returns The element Id of the ChannelRoot element of the specified Channel key, or undefined if\r\n * there is no ChannelRoot for it\r\n */\r\n queryChannelRoot(channelKey: ChannelKey): Id64String | undefined;\r\n\r\n /** @internal */\r\n [_verifyChannel]: (modelId: Id64String) => void;\r\n\r\n /**\r\n * Upgrade a channel to a new version.\r\n * @beta\r\n */\r\n upgradeChannel(options: ChannelUpgradeOptions, iModel: IModelDb, data?: any): Promise<void>;\r\n}\r\n\r\n/** @beta */\r\nexport namespace ChannelControl {\r\n /** the name of the special \"shared\" channel holding information that is editable by any application. */\r\n export const sharedChannelName = \"shared\";\r\n}\r\n\r\n"]}
@@ -6,7 +6,7 @@ import { AccessToken, BeEvent, BentleyStatus, DbResult, GuidString, Id64Arg, Id6
6
6
  import { AxisAlignedBox3d, BRepGeometryCreate, BriefcaseId, ChangesetHealthStats, ChangesetIdWithIndex, Code, CodeProps, CreateEmptySnapshotIModelProps, CreateEmptyStandaloneIModelProps, CreateSnapshotIModelProps, EcefLocation, ECSchemaProps, ECSqlReader, ElementAspectProps, ElementGeometryCacheOperationRequestProps, ElementGeometryCacheRequestProps, ElementGeometryCacheResponseProps, ElementGeometryRequest, ElementGraphicsRequestProps, ElementLoadProps, ElementProps, EntityMetaData, EntityProps, EntityQueryParams, FilePropertyProps, FontMap, GeoCoordinatesRequestProps, GeoCoordinatesResponseProps, GeometryContainmentRequestProps, GeometryContainmentResponseProps, IModel, IModelCoordinatesRequestProps, IModelCoordinatesResponseProps, IModelTileTreeProps, LocalFileName, MassPropertiesRequestProps, MassPropertiesResponseProps, ModelExtentsProps, ModelProps, OpenBriefcaseProps, OpenCheckpointArgs, OpenSqliteArgs, PropertyCallback, QueryBinder, QueryOptions, SchemaState, SnapRequestProps, SnapResponseProps, SnapshotOpenOptions, SubCategoryResultRow, TextureData, TextureLoadProps, ThumbnailProps, UpgradeOptions, ViewDefinitionProps, ViewIdString, ViewQueryParams, ViewStateLoadProps, ViewStateProps } from "@itwin/core-common";
7
7
  import { Range3d } from "@itwin/core-geometry";
8
8
  import { PullChangesArgs, PushChangesArgs, RevertChangesArgs } from "./BriefcaseManager";
9
- import { ChannelControl } from "./ChannelControl";
9
+ import { ChannelControl, ChannelUpgradeOptions } from "./ChannelControl";
10
10
  import { CheckpointProps } from "./CheckpointManager";
11
11
  import { EntityJsClassMap, MetaDataRegistry } from "./ClassRegistry";
12
12
  import { CloudSqlite } from "./CloudSqlite";
@@ -106,13 +106,34 @@ export interface ComputedProjectExtents {
106
106
  * Options for the importing of schemas
107
107
  * @public
108
108
  */
109
- export interface SchemaImportOptions {
109
+ export interface SchemaImportOptions<T = any> {
110
110
  /**
111
111
  * An [[ECSchemaXmlContext]] to use instead of building a default one.
112
112
  * This can be useful in rare cases where custom schema location logic is necessary
113
113
  * @internal
114
114
  */
115
115
  ecSchemaXmlContext?: ECSchemaXmlContext;
116
+ /**
117
+ * Optional callbacks for pre/post schema import operations.
118
+ * @beta
119
+ */
120
+ schemaImportCallbacks?: SchemaImportCallbacks;
121
+ /**
122
+ * Optional.
123
+ * Called before any schema import operations.
124
+ *
125
+ * Use this to prepare the channel for schema changes.
126
+ * This is where you should perform channel-specific upgrades that the schema import/upgrade might depend on.
127
+ *
128
+ * @note User is responsible to acquiring the necessary locks before performing the channel upgrades.
129
+ * @beta
130
+ */
131
+ channelUpgrade?: ChannelUpgradeOptions;
132
+ /**
133
+ * Optional application-specific data to be used by the channel upgrade or the schema import callbacks.
134
+ * @beta
135
+ */
136
+ data?: T;
116
137
  }
117
138
  /** @internal */
118
139
  export declare enum BriefcaseLocalValue {
@@ -157,6 +178,95 @@ export interface InlineGeometryPartsResult {
157
178
  /** The number of candidate parts that were successfully deleted after inlining. */
158
179
  numPartsDeleted: number;
159
180
  }
181
+ /**
182
+ * Strategy for transforming data during schema import.
183
+ * @beta
184
+ */
185
+ export declare enum DataTransformationStrategy {
186
+ /** No data transformation will be performed after schema import. */
187
+ None = "None",
188
+ /** Data transformation will be performed using a temporary snapshot created before schema import.
189
+ * Useful for complex transformations requiring full read access to complete pre-import state for lazy conversion.
190
+ * Note: Creates a complete copy of the briefcase file, which may be large.
191
+ */
192
+ Snapshot = "Snapshot",
193
+ /** Data transformation will be performed using in-memory cached data created before schema import.
194
+ * Useful for lightweight transformations involving limited data.
195
+ */
196
+ InMemory = "InMemory"
197
+ }
198
+ /**
199
+ * Context provided to the beforeImport callback.
200
+ * @beta
201
+ */
202
+ export interface PreImportContext<T = any> {
203
+ /** The iModel being modified */
204
+ iModel: IModelDb;
205
+ /** Schemas about to be imported */
206
+ schemaData: LocalFileName[] | string[];
207
+ /** Optional user-provided data for pre-import operations */
208
+ data?: T;
209
+ }
210
+ /**
211
+ * Result of the pre-import callback.
212
+ * @beta
213
+ */
214
+ export interface PreImportCallbackResult<T = any> {
215
+ transformStrategy: DataTransformationStrategy;
216
+ /** Optional cached data for in-memory strategy */
217
+ cachedData?: T;
218
+ }
219
+ /**
220
+ * Resources available for after schema import data transformation.
221
+ * @beta
222
+ */
223
+ export interface DataTransformationResources extends PreImportCallbackResult {
224
+ /** Optional snapshot for snapshot strategy */
225
+ snapshot?: SnapshotDb;
226
+ }
227
+ /**
228
+ * Context provided to the afterImport callback.
229
+ * @beta
230
+ */
231
+ export interface PostImportContext<T = any> {
232
+ /** The iModel being modified */
233
+ iModel: IModelDb;
234
+ /** Resources for data transformation */
235
+ resources: DataTransformationResources;
236
+ /** Optional user-provided data for post-import operations */
237
+ data?: T;
238
+ }
239
+ /**
240
+ * Callbacks for schema import operations.
241
+ * @beta
242
+ */
243
+ export interface SchemaImportCallbacks<T = any> {
244
+ /**
245
+ * Will be executed before schemas are imported but after channel upgrades.
246
+ * Use this to make any pre import changes to the iModel or use it to cache data or create snapshots for data transformation after the schema import/upgrade.
247
+ *
248
+ * @note User is responsible to acquiring the necessary locks before making any changes.
249
+ *
250
+ * @returns Strategy and optional cached data for transformation
251
+ */
252
+ preSchemaImportCallback?: (context: PreImportContext) => Promise<PreImportCallbackResult<T>>;
253
+ /**
254
+ * Will be executed after schemas are imported, while schema lock is still held.
255
+ * Use this to transform data to match the new schema.
256
+ *
257
+ * @note Schema lock is already held after doing a schema import. No lock acquisition is necessary by the user.
258
+ *
259
+ * @throws If transformation fails, any changes done after the schema import are abandoned and snapshot is cleared.
260
+ */
261
+ postSchemaImportCallback?: (context: PostImportContext) => Promise<void>;
262
+ }
263
+ /** Options for closing an iModelDb.
264
+ * @public
265
+ */
266
+ export interface CloseIModelArgs {
267
+ /** Runs the Sqlite vacuum and analyze commands before closing to defragment the database and update query optimizer statistics */
268
+ optimize?: boolean;
269
+ }
160
270
  /** An iModel database file. The database file can either be a briefcase or a snapshot.
161
271
  * @see [Accessing iModels]($docs/learning/backend/AccessingIModels.md)
162
272
  * @see [About IModelDb]($docs/learning/backend/IModelDb.md)
@@ -258,11 +368,8 @@ export declare abstract class IModelDb extends IModel {
258
368
  * @note There are some reserve tablespace names that cannot be used. They are 'main', 'schema_sync_db', 'ecchange' & 'temp'
259
369
  * @param fileName IModel file name
260
370
  * @param alias identifier for the attached file. This identifier is used to access schema from the attached file. e.g. if alias is 'abc' then schema can be accessed using 'abc.MySchema.MyClass'
261
- *
262
- * *Example:*
263
- * ``` ts
264
- * [[include:IModelDb_attachDb.code]]
265
- * ```
371
+ * @example
372
+ * [[include:IModelDb_attachDb.code]]
266
373
  */
267
374
  attachDb(fileName: string, alias: string): void;
268
375
  /**
@@ -270,14 +377,34 @@ export declare abstract class IModelDb extends IModel {
270
377
  * @note There are some reserve tablespace names that cannot be used. They are 'main', 'schema_sync_db', 'ecchange' & 'temp'
271
378
  * @param alias identifer that was used in the call to [[attachDb]]
272
379
  *
273
- * *Example:*
274
- * ``` ts
275
- * [[include:IModelDb_attachDb.code]]
276
- * ```
380
+ * @example [[include:IModelDb_attachDb.code]]
381
+ *
277
382
  */
278
383
  detachDb(alias: string): void;
279
- /** Close this IModel, if it is currently open, and save changes if it was opened in ReadWrite mode. */
280
- close(): void;
384
+ /** Close this IModel, if it is currently open, and save changes if it was opened in ReadWrite mode.
385
+ * @param options Options for closing the iModel.
386
+ */
387
+ close(options?: CloseIModelArgs): void;
388
+ /** Optimize this iModel by vacuuming, and analyzing.
389
+ *
390
+ * @note This operation requires exclusive access to the database and may take some time on large files.
391
+ * @beta
392
+ */
393
+ optimize(): void;
394
+ /**
395
+ * Vacuum the model to reclaim space and defragment.
396
+ * @throws [[IModelError]] if the iModel is not open or is read-only.
397
+ * @beta
398
+ */
399
+ vacuum(): void;
400
+ /**
401
+ * Update SQLite query optimizer statistics for this iModel.
402
+ * This helps SQLite choose better query plans.
403
+ *
404
+ * @throws [[IModelError]] if the iModel is not open or is read-only.
405
+ * @beta
406
+ */
407
+ analyze(): void;
281
408
  /** @internal */
282
409
  refreshContainerForRpc(_userAccessToken: AccessToken): Promise<void>;
283
410
  /** Event called when the iModel is about to be closed. */
@@ -485,6 +612,14 @@ export declare abstract class IModelDb extends IModel {
485
612
  * @alpha
486
613
  */
487
614
  dropSchemas(schemaNames: string[]): Promise<void>;
615
+ /** Helper to clean up snapshot resources safely
616
+ * @internal
617
+ */
618
+ private cleanupSnapshot;
619
+ private preSchemaImportCallback;
620
+ private postSchemaImportCallback;
621
+ /** Shared implementation for importing schemas from file or string. */
622
+ private importSchemasInternal;
488
623
  /** Import an ECSchema. On success, the schema definition is stored in the iModel.
489
624
  * This method is asynchronous (must be awaited) because, in the case where this IModelDb is a briefcase, this method first obtains the schema lock from the iModel server.
490
625
  * You must import a schema into an iModel before you can insert instances of the classes in that schema. See [[Element]]
@@ -495,20 +630,21 @@ export declare abstract class IModelDb extends IModel {
495
630
  * - You can use NativeLoggerCategory to turn on the native logs. You can also control [what exactly is logged by the loggers](https://www.itwinjs.org/learning/common/logging/#controlling-what-is-logged).
496
631
  * - See [Schema Versioning]($docs/bis/guide/schema-evolution/schema-versioning-and-generations.md) for more information on acceptable changes to schemas.
497
632
  * @note This method should not be called from {TxnManager.withIndirectTxnModeAsync} or {RebaseHandler.recompute}.
498
- * @see querySchemaVersion
633
+ * @see querySchemaVersion
499
634
  */
500
635
  importSchemas(schemaFileNames: LocalFileName[], options?: SchemaImportOptions): Promise<void>;
501
636
  /** Import ECSchema(s) serialized to XML. On success, the schema definition is stored in the iModel.
502
637
  * This method is asynchronous (must be awaited) because, in the case where this IModelDb is a briefcase, this method first obtains the schema lock from the iModel server.
503
638
  * You must import a schema into an iModel before you can insert instances of the classes in that schema. See [[Element]]
504
639
  * @param serializedXmlSchemas The xml string(s) created from a serialized ECSchema.
640
+ * @param {SchemaImportOptions} options - options during schema import.
505
641
  * @throws [[IModelError]] if the schema lock cannot be obtained or there is a problem importing the schema.
506
642
  * @note Changes are saved if importSchemaStrings is successful and abandoned if not successful.
507
643
  * @note This method should not be called from {TxnManager.withIndirectTxnModeAsync} or {RebaseHandler.recompute}.
508
644
  * @see querySchemaVersion
509
645
  * @alpha
510
646
  */
511
- importSchemaStrings(serializedXmlSchemas: string[]): Promise<void>;
647
+ importSchemaStrings(serializedXmlSchemas: string[], options?: SchemaImportOptions): Promise<void>;
512
648
  /** Find an opened instance of any subclass of IModelDb, by filename
513
649
  * @note this method returns an IModelDb if the filename is open for *any* subclass of IModelDb
514
650
  */
@@ -1366,7 +1502,7 @@ export declare class BriefcaseDb extends IModelDb {
1366
1502
  * @note This method should not be called from {TxnManager.withIndirectTxnModeAsync} or {RebaseHandler.recompute}.
1367
1503
  */
1368
1504
  pushChanges(arg: PushChangesArgs): Promise<void>;
1369
- close(): void;
1505
+ close(options?: CloseIModelArgs): void;
1370
1506
  }
1371
1507
  /** A *snapshot* iModel database file that is used for archival and data transfer purposes.
1372
1508
  * @see [Snapshot iModels]($docs/learning/backend/AccessingIModels.md#snapshot-imodels)