@itwin/core-backend 5.7.0-dev.1 → 5.7.0-dev.2
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/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +37 -14
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +1 -21
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/StashManager.d.ts +1 -2
- package/lib/cjs/StashManager.d.ts.map +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +74 -52
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +114 -26
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +37 -14
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +1 -21
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/StashManager.d.ts +1 -2
- package/lib/esm/StashManager.d.ts.map +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +74 -52
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +114 -26
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +201 -12
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +9 -9
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/package.json +14 -14
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { GuidString, Id64String, ITwinError } from "@itwin/core-bentley";
|
|
2
|
-
import { ChangesetIdWithIndex } from "@itwin/core-common";
|
|
2
|
+
import { ChangesetIdWithIndex, TxnProps } from "@itwin/core-common";
|
|
3
3
|
import { BriefcaseDb } from "./IModelDb";
|
|
4
|
-
import { TxnProps } from "./TxnManager";
|
|
5
4
|
/**
|
|
6
5
|
* Properties of a stash
|
|
7
6
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StashManager.d.ts","sourceRoot":"","sources":["../../src/StashManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,UAAU,EAAa,UAAU,EAAE,UAAU,EAAoB,MAAM,qBAAqB,CAAC;AAChH,OAAO,EAAE,oBAAoB,EAA2B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"StashManager.d.ts","sourceRoot":"","sources":["../../src/StashManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StashManager.js","sourceRoot":"","sources":["../../src/StashManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { DbResult, GuidString, Id64Array, Id64String, ITwinError, Logger, OpenMode } from \"@itwin/core-bentley\";\r\nimport { ChangesetIdWithIndex, LocalDirName, LockState } from \"@itwin/core-common\";\r\nimport { existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from \"node:fs\";\r\nimport * as path from \"node:path\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { BriefcaseDb } from \"./IModelDb\";\r\nimport { _elementWasCreated, _getHubAccess, _hubAccess, _nativeDb, _resetIModelDb } from \"./internal/Symbols\";\r\nimport { SQLiteDb } from \"./SQLiteDb\";\r\nimport { TxnProps } from \"./TxnManager\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.StashManager;\r\n\r\n/**\r\n * Properties of a stash\r\n * @internal\r\n */\r\nexport interface StashProps {\r\n /** Unique identifier for the stash */\r\n readonly id: GuidString;\r\n\r\n /** ID of the iModel being stashed */\r\n readonly iModelId: GuidString;\r\n\r\n /** ID of the briefcase being stashed */\r\n readonly briefcaseId: number;\r\n\r\n /** ISO local Timestamp of the stash */\r\n readonly timestamp: string;\r\n\r\n /** Description of the stash */\r\n readonly description: string;\r\n\r\n /** Hash of the stash */\r\n readonly hash: string;\r\n\r\n /** Parent changeset of the stash */\r\n readonly parentChangeset: ChangesetIdWithIndex;\r\n\r\n /** ID sequences for the stash */\r\n readonly idSequences: {\r\n element: Id64String;\r\n instance: Id64String;\r\n };\r\n\r\n /** Transaction properties for the stash */\r\n readonly txns: TxnProps[];\r\n\r\n /** Number of locks acquired by the stash */\r\n readonly acquiredLocks: number;\r\n}\r\n\r\n/**\r\n * Properties for creating a stash\r\n * @internal\r\n */\r\nexport interface CreateStashProps {\r\n /** Briefcase database instance */\r\n readonly db: BriefcaseDb;\r\n /** description of the stash */\r\n readonly description: string;\r\n /** discard all local changes and unless retainLocks flag is set, all locks will be released */\r\n readonly discardLocalChanges?: true;\r\n /** retains all locks after discarding local changes */\r\n readonly retainLocks?: true;\r\n}\r\n\r\n/**\r\n * Arguments for stash operations\r\n * @internal\r\n */\r\nexport interface StashArgs {\r\n readonly db: BriefcaseDb;\r\n readonly stash: Id64String | StashProps;\r\n}\r\n\r\nenum LockOrigin {\r\n Acquired = 0,\r\n NewElement = 1,\r\n Discovered = 2,\r\n};\r\n\r\n/**\r\n * An error originating from the StashManager API.\r\n * @internal\r\n */\r\nexport namespace StashError {\r\n export const scope = \"itwin-StashManager\";\r\n export type Key =\r\n \"readonly\" |\r\n \"no-file\" |\r\n \"no-stashes\" |\r\n \"invalid-stash\" |\r\n \"nothing-to-stash\" |\r\n \"unsaved-changes\" |\r\n \"pending-schema-changes\" |\r\n \"stash-not-found\";\r\n\r\n /** Instantiate and throw a StashError */\r\n export function throwError(key: Key, message: string): never {\r\n ITwinError.throwError<ITwinError>({ iTwinErrorId: { scope, key }, message });\r\n }\r\n /** Determine whether an error object is a StashError */\r\n export function isError(error: unknown, key?: Key): error is ITwinError {\r\n return ITwinError.isError<ITwinError>(error, scope, key);\r\n }\r\n}\r\n\r\n/**\r\n * Stash manager allow stash, drop, apply and merge stashes\r\n * @internal\r\n */\r\nexport class StashManager {\r\n\r\n private static readonly STASHES_ROOT_DIR_NAME: string = \".stashes\";\r\n /**\r\n * Retrieves the root folder path for stash files associated with the specified BriefcaseDb.\r\n *\r\n * @param db - The BriefcaseDb instance for which to determine the stash root folder.\r\n * @param ensureExists - If true, the stash root directory will be created if it does not already exist.\r\n * @returns The absolute path to the stash root directory.\r\n */\r\n private static getStashRootFolder(db: BriefcaseDb, ensureExists: boolean): LocalDirName {\r\n if (!db.isOpen || db.isReadonly)\r\n StashError.throwError(\"readonly\", \"Database is not open or is readonly\");\r\n\r\n if (!existsSync(db[_nativeDb].getFilePath())) {\r\n StashError.throwError(\"no-file\", \"Database file does not exist\");\r\n }\r\n\r\n const stashDir = path.join(path.dirname(db[_nativeDb].getFilePath()), this.STASHES_ROOT_DIR_NAME, `${db.briefcaseId}`);\r\n if (ensureExists && !existsSync(stashDir)) {\r\n mkdirSync(stashDir, { recursive: true });\r\n }\r\n return stashDir;\r\n }\r\n\r\n /**\r\n * Retrieves the stash ID from the provided arguments.\r\n *\r\n * If the `stash` property of `args` is a string, it returns the string in lowercase.\r\n * If the `stash` property is an object, it returns the `id` property of the object in lowercase.\r\n *\r\n * @param args - The arguments containing the stash information, which can be either a string or an object with an `id` property.\r\n * @returns The stash ID as a lowercase string.\r\n */\r\n private static getStashId(args: StashArgs) {\r\n return (typeof args.stash === \"string\" ? args.stash : args.stash.id).toLowerCase();\r\n }\r\n\r\n /**\r\n * Retrieves the file path to the stash file associated with the provided arguments.\r\n *\r\n * @param args - The arguments required to identify the stash, including the database reference.\r\n * @returns The absolute path to the stash file.\r\n */\r\n private static getStashFilePath(args: StashArgs) {\r\n const stashRoot = this.getStashRootFolder(args.db, false);\r\n if (!existsSync(stashRoot)) {\r\n StashError.throwError(\"no-stashes\", \"No stashes exist for this briefcase\");\r\n }\r\n\r\n const stashFilePath = path.join(stashRoot, `${this.getStashId(args)}.stash`);\r\n if (!existsSync(stashFilePath)) {\r\n StashError.throwError(\"invalid-stash\", \"Invalid stash\");\r\n }\r\n return stashFilePath;\r\n }\r\n\r\n /**\r\n * Queries the stash database for lock IDs matching the specified state and origin.\r\n *\r\n * @param args - The arguments required to access the stash database.\r\n * @param state - The lock state to filter by.\r\n * @param origin - The lock origin to filter by.\r\n * @returns An array of lock IDs (`Id64Array`) that match the given state and origin.\r\n */\r\n private static queryLocks(args: StashArgs, state: LockState, origin: LockOrigin): Id64Array {\r\n return this.withStash(args, (stashDb) => {\r\n const query = `SELECT JSON_GROUP_ARRAY(FORMAT('0x%x', Id)) FROM [locks] WHERE State = ${state} AND origin = ${origin}`;\r\n return stashDb.withPreparedSqliteStatement(query, (stmt) => {\r\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n return JSON.parse(stmt.getValueString(0)) as Id64Array;\r\n }\r\n return [];\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Acquire locks for the specified stash. If this fail then stash should not be applied.\r\n * @param args The stash arguments.\r\n */\r\n private static async acquireLocks(args: StashArgs) {\r\n const shared = this.queryLocks(args, LockState.Shared, LockOrigin.Acquired);\r\n await args.db.locks.acquireLocks({ shared });\r\n\r\n const exclusive = this.queryLocks(args, LockState.Exclusive, LockOrigin.Acquired);\r\n await args.db.locks.acquireLocks({ exclusive });\r\n\r\n const newElements = this.queryLocks(args, LockState.Shared, LockOrigin.NewElement);\r\n for (const id of newElements) {\r\n if (!args.db.locks.holdsExclusiveLock(id)) {\r\n args.db.locks[_elementWasCreated](id);\r\n }\r\n }\r\n }\r\n /**\r\n * Creates a stash of changes for the specified briefcase.\r\n *\r\n * This method generates a stash in the stash root directory for the given briefcase, using the provided description and iModelId.\r\n * Optionally, it can reset the briefcase by releasing all locks after stashing.\r\n *\r\n * @param args - The properties required to create a stash, including the briefcase, description, iModelId, and an optional resetBriefcase flag.\r\n * @returns A promise that resolves to the properties of the created stash.\r\n */\r\n public static async stash(args: CreateStashProps): Promise<StashProps> {\r\n if (!args.db.txns.hasPendingTxns) {\r\n StashError.throwError(\"nothing-to-stash\", \"Nothing to stash\");\r\n }\r\n\r\n if (args.db.txns.hasUnsavedChanges) {\r\n StashError.throwError(\"unsaved-changes\", \"Unsaved changes exist\");\r\n }\r\n\r\n if (args.db.txns.hasPendingSchemaChanges) {\r\n StashError.throwError(\"pending-schema-changes\", \"Pending schema changeset. Stashing is not currently supported for schema changes\");\r\n }\r\n\r\n const stashRootDir = this.getStashRootFolder(args.db, true);\r\n const iModelId = args.db.iModelId;\r\n const stash = args.db[_nativeDb].stashChanges({ stashRootDir, description: args.description, iModelId }) as StashProps;\r\n if (args.discardLocalChanges) {\r\n await args.db.discardChanges({ retainLocks: args.retainLocks });\r\n }\r\n\r\n Logger.logInfo(loggerCategory, `Stashed changes`, () => stash);\r\n return stash;\r\n }\r\n\r\n /**\r\n * Retrieves the stash properties from the database for the given arguments.\r\n *\r\n * @param args - The arguments required to locate and access the stash.\r\n * @returns The stash file properties if found; otherwise, `undefined`.\r\n */\r\n public static tryGetStash(args: StashArgs): StashProps | undefined {\r\n try {\r\n return this.getStash(args);\r\n } catch (error: any) {\r\n Logger.logError(loggerCategory, `Error getting stash with ${this.getStashId(args)}: ${error.message}`);\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Retrieves the stash properties from the database using the provided arguments.\r\n *\r\n * @param args - The arguments required to access the stash.\r\n * @returns The stash properties parsed from the database.\r\n */\r\n public static getStash(args: StashArgs): StashProps {\r\n return this.withStash(args, (stashDb) => {\r\n const stashProps = stashDb.withPreparedSqliteStatement(\"SELECT [val] FROM [be_Local] WHERE [name]='$stash_info'\", (stmt) => {\r\n if (stmt.step() !== DbResult.BE_SQLITE_ROW)\r\n StashError.throwError(\"invalid-stash\", \"Invalid stash\");\r\n return JSON.parse(stmt.getValueString(0)) as StashProps;\r\n });\r\n return stashProps;\r\n });\r\n }\r\n\r\n /**\r\n * Executes a callback function with a read-only SQLite database connection to a stash file.\r\n *\r\n * @typeParam T - The return type of the callback function.\r\n * @param args - Arguments required to determine the stash file path.\r\n * @param callback - A function that receives an open {@link SQLiteDb} instance connected to the stash file.\r\n * @returns The value returned by the callback function.\r\n */\r\n private static withStash<T>(args: StashArgs, callback: (stashDb: SQLiteDb) => T): T {\r\n const stashFile = this.getStashFilePath(args);\r\n if (!existsSync(stashFile)) {\r\n StashError.throwError(\"invalid-stash\", \"Invalid stash\");\r\n }\r\n\r\n const stashDb = new SQLiteDb();\r\n stashDb.openDb(stashFile, OpenMode.Readonly);\r\n try {\r\n return callback(stashDb);\r\n } finally {\r\n stashDb.closeDb();\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves all stash files associated with the specified {@link BriefcaseDb}.\r\n * @param db - The {@link BriefcaseDb} instance for which to retrieve stash files.\r\n * @returns An array of `StashProps` representing the found stash files, sorted by timestamp.\r\n */\r\n public static getStashes(db: BriefcaseDb): StashProps[] {\r\n const stashes: StashProps[] = [];\r\n const stashDir = this.getStashRootFolder(db, false);\r\n if (!existsSync(stashDir)) {\r\n return stashes;\r\n }\r\n readdirSync(stashDir).filter((file) => {\r\n const filePath = path.join(stashDir, file);\r\n if (existsSync(filePath) && statSync(filePath).isFile() && file.endsWith(\".stash\")) {\r\n const id = file.slice(0, -path.extname(file).length)\r\n const stash = this.tryGetStash({ db, stash: id });\r\n if (stash) {\r\n stashes.push(stash);\r\n }\r\n }\r\n });\r\n stashes.sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp));\r\n return stashes;\r\n }\r\n\r\n /**\r\n * Deletes the stash file associated with the specified stash ID or properties from the given {@link BriefcaseDb}.\r\n *\r\n * @param db - The {@link BriefcaseDb} instance from which the stash should be dropped.\r\n * @param stashId - The unique identifier (GuidString) or properties (StashProps) of the stash to be deleted.\r\n * @returns Returns `true` if the stash file was successfully deleted, otherwise returns `false`.\r\n */\r\n public static dropStash(args: StashArgs): boolean {\r\n try {\r\n const stashFile = this.getStashFilePath(args);\r\n unlinkSync(stashFile);\r\n return true;\r\n } catch (error: any) {\r\n Logger.logError(loggerCategory, `Error dropping stash: ${error}`);\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Removes all stashes associated with the specified {@link BriefcaseDb}.\r\n *\r\n * @param db - The {@link BriefcaseDb} instance from which all stashes will be removed.\r\n */\r\n public static dropAllStashes(db: BriefcaseDb): void {\r\n this.getStashes(db).forEach((stash) => {\r\n this.dropStash({ db, stash });\r\n });\r\n }\r\n\r\n /**\r\n * Queries the hub for the changeset information associated with the given stash.\r\n *\r\n * @param args - The arguments including the stash properties.\r\n * @returns A promise resolving to the changeset ID and index.\r\n */\r\n private static async queryChangeset(args: StashArgs & { stash: StashProps }): Promise<ChangesetIdWithIndex> {\r\n return IModelHost[_hubAccess].queryChangeset({\r\n iModelId: args.stash.iModelId,\r\n changeset: args.stash.parentChangeset,\r\n accessToken: await IModelHost.getAccessToken()\r\n });\r\n }\r\n /**\r\n * Restores the specified stash to the given {@link BriefcaseDb}. This operation will discard any local changes made to db and reverse the tip to the state of the stash and then apply stash. This will restore the undo stack.\r\n *\r\n * @param args - The arguments including the target database and stash properties.\r\n */\r\n public static async restore(args: StashArgs): Promise<void> {\r\n const { db } = args;\r\n Logger.logInfo(loggerCategory, `Restoring stash: ${this.getStashId(args)}`);\r\n\r\n const stash = this.tryGetStash(args);\r\n if (!stash) {\r\n StashError.throwError(\"stash-not-found\", `Stash not found ${this.getStashId(args)}`);\r\n }\r\n\r\n if (db.txns.hasUnsavedChanges) {\r\n StashError.throwError(\"unsaved-changes\", `Unsaved changes are present.`);\r\n }\r\n\r\n if (db.iModelId !== stash.iModelId) {\r\n StashError.throwError(\"invalid-stash\", `Stash does not belong to this iModel`);\r\n }\r\n\r\n if (db.briefcaseId !== stash.briefcaseId) {\r\n StashError.throwError(\"invalid-stash\", `Stash does not belong to this briefcase`);\r\n }\r\n\r\n const stashFile = this.getStashFilePath({ db, stash });\r\n // we need to retain lock that overlapped with stash locks instead of all locks\r\n await db.discardChanges({ retainLocks: true });\r\n await this.acquireLocks(args);\r\n if (db.changeset.id !== stash.parentChangeset.id) {\r\n // Changeset ID mismatch\r\n Logger.logWarning(loggerCategory, \"Changeset ID mismatch\");\r\n const stashChangeset = await this.queryChangeset({ db, stash });\r\n await BriefcaseManager.pullAndApplyChangesets(db, { toIndex: stashChangeset.index });\r\n }\r\n\r\n db[_nativeDb].stashRestore(stashFile);\r\n db[_resetIModelDb]();\r\n db.saveChanges();\r\n Logger.logInfo(loggerCategory, `Restored stash: ${this.getStashId(args)}`);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"StashManager.js","sourceRoot":"","sources":["../../src/StashManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { DbResult, GuidString, Id64Array, Id64String, ITwinError, Logger, OpenMode } from \"@itwin/core-bentley\";\r\nimport { ChangesetIdWithIndex, LocalDirName, LockState, TxnProps } from \"@itwin/core-common\";\r\nimport { existsSync, mkdirSync, readdirSync, statSync, unlinkSync } from \"node:fs\";\r\nimport * as path from \"node:path\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { BriefcaseDb } from \"./IModelDb\";\r\nimport { _elementWasCreated, _getHubAccess, _hubAccess, _nativeDb, _resetIModelDb } from \"./internal/Symbols\";\r\nimport { SQLiteDb } from \"./SQLiteDb\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.StashManager;\r\n\r\n/**\r\n * Properties of a stash\r\n * @internal\r\n */\r\nexport interface StashProps {\r\n /** Unique identifier for the stash */\r\n readonly id: GuidString;\r\n\r\n /** ID of the iModel being stashed */\r\n readonly iModelId: GuidString;\r\n\r\n /** ID of the briefcase being stashed */\r\n readonly briefcaseId: number;\r\n\r\n /** ISO local Timestamp of the stash */\r\n readonly timestamp: string;\r\n\r\n /** Description of the stash */\r\n readonly description: string;\r\n\r\n /** Hash of the stash */\r\n readonly hash: string;\r\n\r\n /** Parent changeset of the stash */\r\n readonly parentChangeset: ChangesetIdWithIndex;\r\n\r\n /** ID sequences for the stash */\r\n readonly idSequences: {\r\n element: Id64String;\r\n instance: Id64String;\r\n };\r\n\r\n /** Transaction properties for the stash */\r\n readonly txns: TxnProps[];\r\n\r\n /** Number of locks acquired by the stash */\r\n readonly acquiredLocks: number;\r\n}\r\n\r\n/**\r\n * Properties for creating a stash\r\n * @internal\r\n */\r\nexport interface CreateStashProps {\r\n /** Briefcase database instance */\r\n readonly db: BriefcaseDb;\r\n /** description of the stash */\r\n readonly description: string;\r\n /** discard all local changes and unless retainLocks flag is set, all locks will be released */\r\n readonly discardLocalChanges?: true;\r\n /** retains all locks after discarding local changes */\r\n readonly retainLocks?: true;\r\n}\r\n\r\n/**\r\n * Arguments for stash operations\r\n * @internal\r\n */\r\nexport interface StashArgs {\r\n readonly db: BriefcaseDb;\r\n readonly stash: Id64String | StashProps;\r\n}\r\n\r\nenum LockOrigin {\r\n Acquired = 0,\r\n NewElement = 1,\r\n Discovered = 2,\r\n};\r\n\r\n/**\r\n * An error originating from the StashManager API.\r\n * @internal\r\n */\r\nexport namespace StashError {\r\n export const scope = \"itwin-StashManager\";\r\n export type Key =\r\n \"readonly\" |\r\n \"no-file\" |\r\n \"no-stashes\" |\r\n \"invalid-stash\" |\r\n \"nothing-to-stash\" |\r\n \"unsaved-changes\" |\r\n \"pending-schema-changes\" |\r\n \"stash-not-found\";\r\n\r\n /** Instantiate and throw a StashError */\r\n export function throwError(key: Key, message: string): never {\r\n ITwinError.throwError<ITwinError>({ iTwinErrorId: { scope, key }, message });\r\n }\r\n /** Determine whether an error object is a StashError */\r\n export function isError(error: unknown, key?: Key): error is ITwinError {\r\n return ITwinError.isError<ITwinError>(error, scope, key);\r\n }\r\n}\r\n\r\n/**\r\n * Stash manager allow stash, drop, apply and merge stashes\r\n * @internal\r\n */\r\nexport class StashManager {\r\n\r\n private static readonly STASHES_ROOT_DIR_NAME: string = \".stashes\";\r\n /**\r\n * Retrieves the root folder path for stash files associated with the specified BriefcaseDb.\r\n *\r\n * @param db - The BriefcaseDb instance for which to determine the stash root folder.\r\n * @param ensureExists - If true, the stash root directory will be created if it does not already exist.\r\n * @returns The absolute path to the stash root directory.\r\n */\r\n private static getStashRootFolder(db: BriefcaseDb, ensureExists: boolean): LocalDirName {\r\n if (!db.isOpen || db.isReadonly)\r\n StashError.throwError(\"readonly\", \"Database is not open or is readonly\");\r\n\r\n if (!existsSync(db[_nativeDb].getFilePath())) {\r\n StashError.throwError(\"no-file\", \"Database file does not exist\");\r\n }\r\n\r\n const stashDir = path.join(path.dirname(db[_nativeDb].getFilePath()), this.STASHES_ROOT_DIR_NAME, `${db.briefcaseId}`);\r\n if (ensureExists && !existsSync(stashDir)) {\r\n mkdirSync(stashDir, { recursive: true });\r\n }\r\n return stashDir;\r\n }\r\n\r\n /**\r\n * Retrieves the stash ID from the provided arguments.\r\n *\r\n * If the `stash` property of `args` is a string, it returns the string in lowercase.\r\n * If the `stash` property is an object, it returns the `id` property of the object in lowercase.\r\n *\r\n * @param args - The arguments containing the stash information, which can be either a string or an object with an `id` property.\r\n * @returns The stash ID as a lowercase string.\r\n */\r\n private static getStashId(args: StashArgs) {\r\n return (typeof args.stash === \"string\" ? args.stash : args.stash.id).toLowerCase();\r\n }\r\n\r\n /**\r\n * Retrieves the file path to the stash file associated with the provided arguments.\r\n *\r\n * @param args - The arguments required to identify the stash, including the database reference.\r\n * @returns The absolute path to the stash file.\r\n */\r\n private static getStashFilePath(args: StashArgs) {\r\n const stashRoot = this.getStashRootFolder(args.db, false);\r\n if (!existsSync(stashRoot)) {\r\n StashError.throwError(\"no-stashes\", \"No stashes exist for this briefcase\");\r\n }\r\n\r\n const stashFilePath = path.join(stashRoot, `${this.getStashId(args)}.stash`);\r\n if (!existsSync(stashFilePath)) {\r\n StashError.throwError(\"invalid-stash\", \"Invalid stash\");\r\n }\r\n return stashFilePath;\r\n }\r\n\r\n /**\r\n * Queries the stash database for lock IDs matching the specified state and origin.\r\n *\r\n * @param args - The arguments required to access the stash database.\r\n * @param state - The lock state to filter by.\r\n * @param origin - The lock origin to filter by.\r\n * @returns An array of lock IDs (`Id64Array`) that match the given state and origin.\r\n */\r\n private static queryLocks(args: StashArgs, state: LockState, origin: LockOrigin): Id64Array {\r\n return this.withStash(args, (stashDb) => {\r\n const query = `SELECT JSON_GROUP_ARRAY(FORMAT('0x%x', Id)) FROM [locks] WHERE State = ${state} AND origin = ${origin}`;\r\n return stashDb.withPreparedSqliteStatement(query, (stmt) => {\r\n if (stmt.step() === DbResult.BE_SQLITE_ROW) {\r\n return JSON.parse(stmt.getValueString(0)) as Id64Array;\r\n }\r\n return [];\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Acquire locks for the specified stash. If this fail then stash should not be applied.\r\n * @param args The stash arguments.\r\n */\r\n private static async acquireLocks(args: StashArgs) {\r\n const shared = this.queryLocks(args, LockState.Shared, LockOrigin.Acquired);\r\n await args.db.locks.acquireLocks({ shared });\r\n\r\n const exclusive = this.queryLocks(args, LockState.Exclusive, LockOrigin.Acquired);\r\n await args.db.locks.acquireLocks({ exclusive });\r\n\r\n const newElements = this.queryLocks(args, LockState.Shared, LockOrigin.NewElement);\r\n for (const id of newElements) {\r\n if (!args.db.locks.holdsExclusiveLock(id)) {\r\n args.db.locks[_elementWasCreated](id);\r\n }\r\n }\r\n }\r\n /**\r\n * Creates a stash of changes for the specified briefcase.\r\n *\r\n * This method generates a stash in the stash root directory for the given briefcase, using the provided description and iModelId.\r\n * Optionally, it can reset the briefcase by releasing all locks after stashing.\r\n *\r\n * @param args - The properties required to create a stash, including the briefcase, description, iModelId, and an optional resetBriefcase flag.\r\n * @returns A promise that resolves to the properties of the created stash.\r\n */\r\n public static async stash(args: CreateStashProps): Promise<StashProps> {\r\n if (!args.db.txns.hasPendingTxns) {\r\n StashError.throwError(\"nothing-to-stash\", \"Nothing to stash\");\r\n }\r\n\r\n if (args.db.txns.hasUnsavedChanges) {\r\n StashError.throwError(\"unsaved-changes\", \"Unsaved changes exist\");\r\n }\r\n\r\n if (args.db.txns.hasPendingSchemaChanges) {\r\n StashError.throwError(\"pending-schema-changes\", \"Pending schema changeset. Stashing is not currently supported for schema changes\");\r\n }\r\n\r\n const stashRootDir = this.getStashRootFolder(args.db, true);\r\n const iModelId = args.db.iModelId;\r\n const stash = args.db[_nativeDb].stashChanges({ stashRootDir, description: args.description, iModelId }) as StashProps;\r\n if (args.discardLocalChanges) {\r\n await args.db.discardChanges({ retainLocks: args.retainLocks });\r\n }\r\n\r\n Logger.logInfo(loggerCategory, `Stashed changes`, () => stash);\r\n return stash;\r\n }\r\n\r\n /**\r\n * Retrieves the stash properties from the database for the given arguments.\r\n *\r\n * @param args - The arguments required to locate and access the stash.\r\n * @returns The stash file properties if found; otherwise, `undefined`.\r\n */\r\n public static tryGetStash(args: StashArgs): StashProps | undefined {\r\n try {\r\n return this.getStash(args);\r\n } catch (error: any) {\r\n Logger.logError(loggerCategory, `Error getting stash with ${this.getStashId(args)}: ${error.message}`);\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Retrieves the stash properties from the database using the provided arguments.\r\n *\r\n * @param args - The arguments required to access the stash.\r\n * @returns The stash properties parsed from the database.\r\n */\r\n public static getStash(args: StashArgs): StashProps {\r\n return this.withStash(args, (stashDb) => {\r\n const stashProps = stashDb.withPreparedSqliteStatement(\"SELECT [val] FROM [be_Local] WHERE [name]='$stash_info'\", (stmt) => {\r\n if (stmt.step() !== DbResult.BE_SQLITE_ROW)\r\n StashError.throwError(\"invalid-stash\", \"Invalid stash\");\r\n return JSON.parse(stmt.getValueString(0)) as StashProps;\r\n });\r\n return stashProps;\r\n });\r\n }\r\n\r\n /**\r\n * Executes a callback function with a read-only SQLite database connection to a stash file.\r\n *\r\n * @typeParam T - The return type of the callback function.\r\n * @param args - Arguments required to determine the stash file path.\r\n * @param callback - A function that receives an open {@link SQLiteDb} instance connected to the stash file.\r\n * @returns The value returned by the callback function.\r\n */\r\n private static withStash<T>(args: StashArgs, callback: (stashDb: SQLiteDb) => T): T {\r\n const stashFile = this.getStashFilePath(args);\r\n if (!existsSync(stashFile)) {\r\n StashError.throwError(\"invalid-stash\", \"Invalid stash\");\r\n }\r\n\r\n const stashDb = new SQLiteDb();\r\n stashDb.openDb(stashFile, OpenMode.Readonly);\r\n try {\r\n return callback(stashDb);\r\n } finally {\r\n stashDb.closeDb();\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves all stash files associated with the specified {@link BriefcaseDb}.\r\n * @param db - The {@link BriefcaseDb} instance for which to retrieve stash files.\r\n * @returns An array of `StashProps` representing the found stash files, sorted by timestamp.\r\n */\r\n public static getStashes(db: BriefcaseDb): StashProps[] {\r\n const stashes: StashProps[] = [];\r\n const stashDir = this.getStashRootFolder(db, false);\r\n if (!existsSync(stashDir)) {\r\n return stashes;\r\n }\r\n readdirSync(stashDir).filter((file) => {\r\n const filePath = path.join(stashDir, file);\r\n if (existsSync(filePath) && statSync(filePath).isFile() && file.endsWith(\".stash\")) {\r\n const id = file.slice(0, -path.extname(file).length)\r\n const stash = this.tryGetStash({ db, stash: id });\r\n if (stash) {\r\n stashes.push(stash);\r\n }\r\n }\r\n });\r\n stashes.sort((a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp));\r\n return stashes;\r\n }\r\n\r\n /**\r\n * Deletes the stash file associated with the specified stash ID or properties from the given {@link BriefcaseDb}.\r\n *\r\n * @param db - The {@link BriefcaseDb} instance from which the stash should be dropped.\r\n * @param stashId - The unique identifier (GuidString) or properties (StashProps) of the stash to be deleted.\r\n * @returns Returns `true` if the stash file was successfully deleted, otherwise returns `false`.\r\n */\r\n public static dropStash(args: StashArgs): boolean {\r\n try {\r\n const stashFile = this.getStashFilePath(args);\r\n unlinkSync(stashFile);\r\n return true;\r\n } catch (error: any) {\r\n Logger.logError(loggerCategory, `Error dropping stash: ${error}`);\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Removes all stashes associated with the specified {@link BriefcaseDb}.\r\n *\r\n * @param db - The {@link BriefcaseDb} instance from which all stashes will be removed.\r\n */\r\n public static dropAllStashes(db: BriefcaseDb): void {\r\n this.getStashes(db).forEach((stash) => {\r\n this.dropStash({ db, stash });\r\n });\r\n }\r\n\r\n /**\r\n * Queries the hub for the changeset information associated with the given stash.\r\n *\r\n * @param args - The arguments including the stash properties.\r\n * @returns A promise resolving to the changeset ID and index.\r\n */\r\n private static async queryChangeset(args: StashArgs & { stash: StashProps }): Promise<ChangesetIdWithIndex> {\r\n return IModelHost[_hubAccess].queryChangeset({\r\n iModelId: args.stash.iModelId,\r\n changeset: args.stash.parentChangeset,\r\n accessToken: await IModelHost.getAccessToken()\r\n });\r\n }\r\n /**\r\n * Restores the specified stash to the given {@link BriefcaseDb}. This operation will discard any local changes made to db and reverse the tip to the state of the stash and then apply stash. This will restore the undo stack.\r\n *\r\n * @param args - The arguments including the target database and stash properties.\r\n */\r\n public static async restore(args: StashArgs): Promise<void> {\r\n const { db } = args;\r\n Logger.logInfo(loggerCategory, `Restoring stash: ${this.getStashId(args)}`);\r\n\r\n const stash = this.tryGetStash(args);\r\n if (!stash) {\r\n StashError.throwError(\"stash-not-found\", `Stash not found ${this.getStashId(args)}`);\r\n }\r\n\r\n if (db.txns.hasUnsavedChanges) {\r\n StashError.throwError(\"unsaved-changes\", `Unsaved changes are present.`);\r\n }\r\n\r\n if (db.iModelId !== stash.iModelId) {\r\n StashError.throwError(\"invalid-stash\", `Stash does not belong to this iModel`);\r\n }\r\n\r\n if (db.briefcaseId !== stash.briefcaseId) {\r\n StashError.throwError(\"invalid-stash\", `Stash does not belong to this briefcase`);\r\n }\r\n\r\n const stashFile = this.getStashFilePath({ db, stash });\r\n // we need to retain lock that overlapped with stash locks instead of all locks\r\n await db.discardChanges({ retainLocks: true });\r\n await this.acquireLocks(args);\r\n if (db.changeset.id !== stash.parentChangeset.id) {\r\n // Changeset ID mismatch\r\n Logger.logWarning(loggerCategory, \"Changeset ID mismatch\");\r\n const stashChangeset = await this.queryChangeset({ db, stash });\r\n await BriefcaseManager.pullAndApplyChangesets(db, { toIndex: stashChangeset.index });\r\n }\r\n\r\n db[_nativeDb].stashRestore(stashFile);\r\n db[_resetIModelDb]();\r\n db.saveChanges();\r\n Logger.logInfo(loggerCategory, `Restored stash: ${this.getStashId(args)}`);\r\n }\r\n}\r\n"]}
|
package/lib/esm/TxnManager.d.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* @module iModels
|
|
3
3
|
*/
|
|
4
4
|
import { BeEvent, DbConflictResolution, DbResult, Id64String, IModelStatus } from "@itwin/core-bentley";
|
|
5
|
-
import { ChangesetIndexAndId, EntityIdAndClassIdIterable, ModelGeometryChangesProps, ModelIdAndGeometryGuid } from "@itwin/core-common";
|
|
6
|
-
import { BriefcaseDb,
|
|
5
|
+
import { ChangesetIdWithIndex, ChangesetIndexAndId, ChangesetProps, EntityIdAndClassIdIterable, ModelGeometryChangesProps, ModelIdAndGeometryGuid, TxnProps } from "@itwin/core-common";
|
|
6
|
+
import { BriefcaseDb, StandaloneDb } from "./IModelDb";
|
|
7
7
|
import { RelationshipProps } from "./Relationship";
|
|
8
8
|
import { DbRebaseChangesetConflictArgs, RebaseChangesetConflictArgs } from "./internal/ChangesetConflictArgs";
|
|
9
9
|
/** A string that identifies a Txn.
|
|
@@ -57,41 +57,11 @@ export interface ChangeInstanceKey {
|
|
|
57
57
|
}
|
|
58
58
|
/** Strictly for tests. @internal */
|
|
59
59
|
export declare function setMaxEntitiesPerEvent(max: number): number;
|
|
60
|
-
/**
|
|
61
|
-
* @alpha
|
|
62
|
-
* Transaction types
|
|
63
|
-
*/
|
|
64
|
-
export type TxnType = "Data" | "ECSchema" | "Ddl";
|
|
65
60
|
/**
|
|
66
61
|
* @alpha
|
|
67
62
|
* Transaction modes
|
|
68
63
|
*/
|
|
69
64
|
export type TxnMode = "direct" | "indirect";
|
|
70
|
-
/**
|
|
71
|
-
* @alpha
|
|
72
|
-
* Represents the properties of a transaction within the transaction manager.
|
|
73
|
-
*
|
|
74
|
-
* @property id - The unique identifier for the transaction.
|
|
75
|
-
* @property sessionId - The identifier of the session to which the transaction belongs.
|
|
76
|
-
* @property nextId - (Optional) The identifier of the next transaction in the sequence.
|
|
77
|
-
* @property prevId - (Optional) The identifier of the previous transaction in the sequence.
|
|
78
|
-
* @property props - The arguments or properties associated with the save changes operation.
|
|
79
|
-
* @property type - The type of transaction, which can be "Data", "ECSchema", or "Ddl".
|
|
80
|
-
* @property reversed - Indicates whether the transaction has been reversed.
|
|
81
|
-
* @property grouped - Indicates whether the transaction is grouped with others.
|
|
82
|
-
* @property timestamp - The timestamp when the transaction was created.
|
|
83
|
-
*/
|
|
84
|
-
export interface TxnProps {
|
|
85
|
-
id: TxnIdString;
|
|
86
|
-
sessionId: number;
|
|
87
|
-
nextId?: TxnIdString;
|
|
88
|
-
prevId?: TxnIdString;
|
|
89
|
-
props: SaveChangesArgs;
|
|
90
|
-
type: TxnType;
|
|
91
|
-
reversed: boolean;
|
|
92
|
-
grouped: boolean;
|
|
93
|
-
timestamp: string;
|
|
94
|
-
}
|
|
95
65
|
/**
|
|
96
66
|
* Manages the process of merging and rebasing local changes (transactions) in a [[BriefcaseDb]] or [[StandaloneDb]].
|
|
97
67
|
*
|
|
@@ -114,6 +84,78 @@ export declare class RebaseManager {
|
|
|
114
84
|
private _conflictHandlers?;
|
|
115
85
|
private _customHandler?;
|
|
116
86
|
private _aborting;
|
|
87
|
+
/** Event raised before pull merge process begins.
|
|
88
|
+
* @alpha
|
|
89
|
+
*/
|
|
90
|
+
readonly onPullMergeBegin: BeEvent<(changeset: ChangesetIdWithIndex) => void>;
|
|
91
|
+
/** Event raised before a rebase operation begins.
|
|
92
|
+
* @alpha
|
|
93
|
+
*/
|
|
94
|
+
readonly onRebaseBegin: BeEvent<(txns: TxnProps[]) => void>;
|
|
95
|
+
/** Event raised before a transaction is rebased.
|
|
96
|
+
* @alpha
|
|
97
|
+
*/
|
|
98
|
+
readonly onRebaseTxnBegin: BeEvent<(txnProps: TxnProps) => void>;
|
|
99
|
+
/** Event raised after a transaction is rebased.
|
|
100
|
+
* @alpha
|
|
101
|
+
*/
|
|
102
|
+
readonly onRebaseTxnEnd: BeEvent<(txnProps: TxnProps) => void>;
|
|
103
|
+
/** Event raised after a rebase operation ends.
|
|
104
|
+
* @alpha
|
|
105
|
+
*/
|
|
106
|
+
readonly onRebaseEnd: BeEvent<(txns: TxnProps[]) => void>;
|
|
107
|
+
/** Event raised after pull merge process ends.
|
|
108
|
+
* @alpha
|
|
109
|
+
*/
|
|
110
|
+
readonly onPullMergeEnd: BeEvent<(changeset: ChangesetIdWithIndex) => void>;
|
|
111
|
+
/** Event raised before applying incoming changes.
|
|
112
|
+
* @alpha
|
|
113
|
+
*/
|
|
114
|
+
readonly onApplyIncomingChangesBegin: BeEvent<(changesets: ChangesetProps[]) => void>;
|
|
115
|
+
/** Event raised after applying incoming changes.
|
|
116
|
+
* @alpha
|
|
117
|
+
*/
|
|
118
|
+
readonly onApplyIncomingChangesEnd: BeEvent<(changes: ChangesetProps[]) => void>;
|
|
119
|
+
/** Event raised before reversing local changes.
|
|
120
|
+
* @alpha
|
|
121
|
+
*/
|
|
122
|
+
readonly onReverseLocalChangesBegin: BeEvent<() => void>;
|
|
123
|
+
/** Event raised after reversing local changes.
|
|
124
|
+
* @alpha
|
|
125
|
+
*/
|
|
126
|
+
readonly onReverseLocalChangesEnd: BeEvent<(txns: TxnProps[]) => void>;
|
|
127
|
+
/** Event raised before downloading changesets.
|
|
128
|
+
* @alpha
|
|
129
|
+
*/
|
|
130
|
+
readonly onDownloadChangesetsBegin: BeEvent<() => void>;
|
|
131
|
+
/** Event raised after downloading changesets.
|
|
132
|
+
* @alpha
|
|
133
|
+
*/
|
|
134
|
+
readonly onDownloadChangesetsEnd: BeEvent<() => void>;
|
|
135
|
+
/** @internal */
|
|
136
|
+
notifyPullMergeBegin(changeset: ChangesetIdWithIndex): void;
|
|
137
|
+
/** @internal */
|
|
138
|
+
notifyPullMergeEnd(changeset: ChangesetIdWithIndex): void;
|
|
139
|
+
/** @internal */
|
|
140
|
+
notifyApplyIncomingChangesBegin(changes: ChangesetProps[]): void;
|
|
141
|
+
/** @internal */
|
|
142
|
+
notifyApplyIncomingChangesEnd(changes: ChangesetProps[]): void;
|
|
143
|
+
/** @internal */
|
|
144
|
+
notifyReverseLocalChangesBegin(): void;
|
|
145
|
+
/** @internal */
|
|
146
|
+
notifyReverseLocalChangesEnd(txns: TxnProps[]): void;
|
|
147
|
+
/** @internal */
|
|
148
|
+
notifyDownloadChangesetsBegin(): void;
|
|
149
|
+
/** @internal */
|
|
150
|
+
notifyDownloadChangesetsEnd(): void;
|
|
151
|
+
/** @internal */
|
|
152
|
+
notifyRebaseBegin(txns: TxnProps[]): void;
|
|
153
|
+
/** @internal */
|
|
154
|
+
notifyRebaseEnd(txns: TxnProps[]): void;
|
|
155
|
+
/** @internal */
|
|
156
|
+
notifyRebaseTxnBegin(txnProps: TxnProps): void;
|
|
157
|
+
/** @internal */
|
|
158
|
+
notifyRebaseTxnEnd(txnProps: TxnProps): void;
|
|
117
159
|
constructor(_iModel: BriefcaseDb | StandaloneDb);
|
|
118
160
|
/**
|
|
119
161
|
* Resumes the rebase process for the current iModel, applying any pending local changes
|
|
@@ -355,26 +397,6 @@ export declare class TxnManager {
|
|
|
355
397
|
* @see [[onReplayExternalTxns]] for the event raised before the changes are applied.
|
|
356
398
|
*/
|
|
357
399
|
readonly onReplayedExternalTxns: BeEvent<() => void>;
|
|
358
|
-
/**
|
|
359
|
-
* @alpha
|
|
360
|
-
* Event raised when a rebase transaction begins.
|
|
361
|
-
*/
|
|
362
|
-
readonly onRebaseTxnBegin: BeEvent<(txn: TxnProps) => void>;
|
|
363
|
-
/**
|
|
364
|
-
* @alpha
|
|
365
|
-
* Event raised when a rebase transaction ends.
|
|
366
|
-
*/
|
|
367
|
-
readonly onRebaseTxnEnd: BeEvent<(txn: TxnProps) => void>;
|
|
368
|
-
/**
|
|
369
|
-
* @alpha
|
|
370
|
-
* Event raised when a rebase begins.
|
|
371
|
-
*/
|
|
372
|
-
readonly onRebaseBegin: BeEvent<(txns: TxnIdString[]) => void>;
|
|
373
|
-
/**
|
|
374
|
-
* @alpha
|
|
375
|
-
* Event raised when a rebase ends.
|
|
376
|
-
*/
|
|
377
|
-
readonly onRebaseEnd: BeEvent<() => void>;
|
|
378
400
|
/** Event raised after changes are pulled from iModelHub.
|
|
379
401
|
* @see [[BriefcaseDb.pullChanges]].
|
|
380
402
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TxnManager.d.ts","sourceRoot":"","sources":["../../src/TxnManager.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EACG,OAAO,EAAmD,oBAAoB,EAAE,QAAQ,EAAa,UAAU,EAAE,YAAY,EACtI,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAe,yBAAyB,EAAE,sBAAsB,EAA4D,MAAM,oBAAoB,CAAC;AAE/
|
|
1
|
+
{"version":3,"file":"TxnManager.d.ts","sourceRoot":"","sources":["../../src/TxnManager.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/TxnManager.js
CHANGED
|
@@ -215,6 +215,114 @@ export class RebaseManager {
|
|
|
215
215
|
_conflictHandlers;
|
|
216
216
|
_customHandler;
|
|
217
217
|
_aborting = false;
|
|
218
|
+
/** Event raised before pull merge process begins.
|
|
219
|
+
* @alpha
|
|
220
|
+
*/
|
|
221
|
+
onPullMergeBegin = new BeEvent();
|
|
222
|
+
/** Event raised before a rebase operation begins.
|
|
223
|
+
* @alpha
|
|
224
|
+
*/
|
|
225
|
+
onRebaseBegin = new BeEvent();
|
|
226
|
+
/** Event raised before a transaction is rebased.
|
|
227
|
+
* @alpha
|
|
228
|
+
*/
|
|
229
|
+
onRebaseTxnBegin = new BeEvent();
|
|
230
|
+
/** Event raised after a transaction is rebased.
|
|
231
|
+
* @alpha
|
|
232
|
+
*/
|
|
233
|
+
onRebaseTxnEnd = new BeEvent();
|
|
234
|
+
/** Event raised after a rebase operation ends.
|
|
235
|
+
* @alpha
|
|
236
|
+
*/
|
|
237
|
+
onRebaseEnd = new BeEvent();
|
|
238
|
+
/** Event raised after pull merge process ends.
|
|
239
|
+
* @alpha
|
|
240
|
+
*/
|
|
241
|
+
onPullMergeEnd = new BeEvent();
|
|
242
|
+
/** Event raised before applying incoming changes.
|
|
243
|
+
* @alpha
|
|
244
|
+
*/
|
|
245
|
+
onApplyIncomingChangesBegin = new BeEvent();
|
|
246
|
+
/** Event raised after applying incoming changes.
|
|
247
|
+
* @alpha
|
|
248
|
+
*/
|
|
249
|
+
onApplyIncomingChangesEnd = new BeEvent();
|
|
250
|
+
/** Event raised before reversing local changes.
|
|
251
|
+
* @alpha
|
|
252
|
+
*/
|
|
253
|
+
onReverseLocalChangesBegin = new BeEvent();
|
|
254
|
+
/** Event raised after reversing local changes.
|
|
255
|
+
* @alpha
|
|
256
|
+
*/
|
|
257
|
+
onReverseLocalChangesEnd = new BeEvent();
|
|
258
|
+
/** Event raised before downloading changesets.
|
|
259
|
+
* @alpha
|
|
260
|
+
*/
|
|
261
|
+
onDownloadChangesetsBegin = new BeEvent();
|
|
262
|
+
/** Event raised after downloading changesets.
|
|
263
|
+
* @alpha
|
|
264
|
+
*/
|
|
265
|
+
onDownloadChangesetsEnd = new BeEvent();
|
|
266
|
+
/** @internal */
|
|
267
|
+
notifyPullMergeBegin(changeset) {
|
|
268
|
+
this.onPullMergeBegin.raiseEvent(changeset);
|
|
269
|
+
IpcHost.notifyTxns(this._iModel, "notifyPullMergeBegin", changeset);
|
|
270
|
+
}
|
|
271
|
+
/** @internal */
|
|
272
|
+
notifyPullMergeEnd(changeset) {
|
|
273
|
+
this.onPullMergeEnd.raiseEvent(changeset);
|
|
274
|
+
IpcHost.notifyTxns(this._iModel, "notifyPullMergeEnd", changeset);
|
|
275
|
+
}
|
|
276
|
+
/** @internal */
|
|
277
|
+
notifyApplyIncomingChangesBegin(changes) {
|
|
278
|
+
this.onApplyIncomingChangesBegin.raiseEvent(changes);
|
|
279
|
+
IpcHost.notifyTxns(this._iModel, "notifyApplyIncomingChangesBegin", changes);
|
|
280
|
+
}
|
|
281
|
+
/** @internal */
|
|
282
|
+
notifyApplyIncomingChangesEnd(changes) {
|
|
283
|
+
this.onApplyIncomingChangesEnd.raiseEvent(changes);
|
|
284
|
+
IpcHost.notifyTxns(this._iModel, "notifyApplyIncomingChangesEnd", changes);
|
|
285
|
+
}
|
|
286
|
+
/** @internal */
|
|
287
|
+
notifyReverseLocalChangesBegin() {
|
|
288
|
+
this.onReverseLocalChangesBegin.raiseEvent();
|
|
289
|
+
IpcHost.notifyTxns(this._iModel, "notifyReverseLocalChangesBegin");
|
|
290
|
+
}
|
|
291
|
+
/** @internal */
|
|
292
|
+
notifyReverseLocalChangesEnd(txns) {
|
|
293
|
+
this.onReverseLocalChangesEnd.raiseEvent(txns);
|
|
294
|
+
IpcHost.notifyTxns(this._iModel, "notifyReverseLocalChangesEnd", txns);
|
|
295
|
+
}
|
|
296
|
+
/** @internal */
|
|
297
|
+
notifyDownloadChangesetsBegin() {
|
|
298
|
+
this.onDownloadChangesetsBegin.raiseEvent();
|
|
299
|
+
IpcHost.notifyTxns(this._iModel, "notifyDownloadChangesetsBegin");
|
|
300
|
+
}
|
|
301
|
+
/** @internal */
|
|
302
|
+
notifyDownloadChangesetsEnd() {
|
|
303
|
+
this.onDownloadChangesetsEnd.raiseEvent();
|
|
304
|
+
IpcHost.notifyTxns(this._iModel, "notifyDownloadChangesetsEnd");
|
|
305
|
+
}
|
|
306
|
+
/** @internal */
|
|
307
|
+
notifyRebaseBegin(txns) {
|
|
308
|
+
this.onRebaseBegin.raiseEvent(txns);
|
|
309
|
+
IpcHost.notifyTxns(this._iModel, "notifyRebaseBegin", txns);
|
|
310
|
+
}
|
|
311
|
+
/** @internal */
|
|
312
|
+
notifyRebaseEnd(txns) {
|
|
313
|
+
this.onRebaseEnd.raiseEvent(txns);
|
|
314
|
+
IpcHost.notifyTxns(this._iModel, "notifyRebaseEnd", txns);
|
|
315
|
+
}
|
|
316
|
+
/** @internal */
|
|
317
|
+
notifyRebaseTxnBegin(txnProps) {
|
|
318
|
+
this.onRebaseTxnBegin.raiseEvent(txnProps);
|
|
319
|
+
IpcHost.notifyTxns(this._iModel, "notifyRebaseTxnBegin", txnProps);
|
|
320
|
+
}
|
|
321
|
+
/** @internal */
|
|
322
|
+
notifyRebaseTxnEnd(txnProps) {
|
|
323
|
+
this.onRebaseTxnEnd.raiseEvent(txnProps);
|
|
324
|
+
IpcHost.notifyTxns(this._iModel, "notifyRebaseTxnEnd", txnProps);
|
|
325
|
+
}
|
|
218
326
|
constructor(_iModel) {
|
|
219
327
|
this._iModel = _iModel;
|
|
220
328
|
}
|
|
@@ -242,14 +350,15 @@ export class RebaseManager {
|
|
|
242
350
|
const txns = this._iModel.txns;
|
|
243
351
|
try {
|
|
244
352
|
const reversedTxns = nativeDb.pullMergeRebaseBegin();
|
|
245
|
-
txns.
|
|
353
|
+
const reversedTxnProps = reversedTxns.map((_) => txns.getTxnProps(_)).filter((_) => _ !== undefined);
|
|
354
|
+
this.notifyRebaseBegin(reversedTxnProps);
|
|
246
355
|
let txnId = nativeDb.pullMergeRebaseNext();
|
|
247
356
|
while (txnId) {
|
|
248
357
|
const txnProps = txns.getTxnProps(txnId);
|
|
249
358
|
if (!txnProps) {
|
|
250
359
|
throw new Error(`Transaction ${txnId} not found`);
|
|
251
360
|
}
|
|
252
|
-
|
|
361
|
+
this.notifyRebaseTxnBegin(txnProps);
|
|
253
362
|
Logger.logInfo(BackendLoggerCategory.IModelDb, `Rebasing local changes for transaction ${txnId}`);
|
|
254
363
|
const shouldReinstate = this._customHandler?.shouldReinstate(txnProps) ?? true;
|
|
255
364
|
if (shouldReinstate) {
|
|
@@ -260,24 +369,23 @@ export class RebaseManager {
|
|
|
260
369
|
await this._customHandler.recompute(txnProps);
|
|
261
370
|
}
|
|
262
371
|
nativeDb.pullMergeRebaseUpdateTxn();
|
|
263
|
-
|
|
372
|
+
this.notifyRebaseTxnEnd(txnProps);
|
|
264
373
|
txnId = nativeDb.pullMergeRebaseNext();
|
|
265
374
|
}
|
|
266
375
|
nativeDb.pullMergeRebaseEnd();
|
|
376
|
+
this.notifyRebaseEnd(reversedTxnProps);
|
|
267
377
|
if (!nativeDb.isReadonly) {
|
|
268
378
|
nativeDb.saveChanges("Merge.");
|
|
269
379
|
}
|
|
270
380
|
if (BriefcaseManager.containsRestorePoint(this._iModel, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME)) {
|
|
271
381
|
BriefcaseManager.dropRestorePoint(this._iModel, BriefcaseManager.PULL_MERGE_RESTORE_POINT_NAME);
|
|
272
382
|
}
|
|
383
|
+
this.notifyPullMergeEnd(this._iModel.changeset);
|
|
273
384
|
}
|
|
274
385
|
catch (err) {
|
|
275
386
|
nativeDb.pullMergeRebaseAbortTxn();
|
|
276
387
|
throw err;
|
|
277
388
|
}
|
|
278
|
-
finally {
|
|
279
|
-
txns.onRebaseEnd.raiseEvent();
|
|
280
|
-
}
|
|
281
389
|
}
|
|
282
390
|
/**
|
|
283
391
|
* Determines whether the current transaction can be aborted.
|
|
@@ -717,26 +825,6 @@ export class TxnManager {
|
|
|
717
825
|
* @see [[onReplayExternalTxns]] for the event raised before the changes are applied.
|
|
718
826
|
*/
|
|
719
827
|
onReplayedExternalTxns = new BeEvent();
|
|
720
|
-
/**
|
|
721
|
-
* @alpha
|
|
722
|
-
* Event raised when a rebase transaction begins.
|
|
723
|
-
*/
|
|
724
|
-
onRebaseTxnBegin = new BeEvent();
|
|
725
|
-
/**
|
|
726
|
-
* @alpha
|
|
727
|
-
* Event raised when a rebase transaction ends.
|
|
728
|
-
*/
|
|
729
|
-
onRebaseTxnEnd = new BeEvent();
|
|
730
|
-
/**
|
|
731
|
-
* @alpha
|
|
732
|
-
* Event raised when a rebase begins.
|
|
733
|
-
*/
|
|
734
|
-
onRebaseBegin = new BeEvent();
|
|
735
|
-
/**
|
|
736
|
-
* @alpha
|
|
737
|
-
* Event raised when a rebase ends.
|
|
738
|
-
*/
|
|
739
|
-
onRebaseEnd = new BeEvent();
|
|
740
828
|
/** Event raised after changes are pulled from iModelHub.
|
|
741
829
|
* @see [[BriefcaseDb.pullChanges]].
|
|
742
830
|
*/
|