@itwin/core-backend 5.0.0-dev.7 → 5.0.0-dev.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -1
- package/lib/cjs/BackendHubAccess.d.ts +13 -22
- package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
- package/lib/cjs/BackendHubAccess.js +2 -0
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BisCoreSchema.d.ts.map +1 -1
- package/lib/cjs/BisCoreSchema.js +2 -0
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BlobContainerService.d.ts +4 -4
- package/lib/cjs/BlobContainerService.d.ts.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts +10 -0
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +63 -20
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/Category.js +6 -1
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.d.ts.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +90 -22
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.d.ts +3 -3
- package/lib/cjs/ChangedElementsDb.d.ts.map +1 -1
- package/lib/cjs/ChangedElementsDb.js +8 -7
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts +3 -3
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +31 -19
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/CheckpointManager.d.ts.map +1 -1
- package/lib/cjs/CheckpointManager.js +15 -12
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +8 -18
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +2 -1
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js +15 -8
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.d.ts +2 -0
- package/lib/cjs/CodeService.d.ts.map +1 -1
- package/lib/cjs/CodeService.js +4 -0
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.js +3 -2
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js +7 -6
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.js +16 -16
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.js +2 -0
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +3 -9
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +10 -9
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.js +1 -0
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlStatement.d.ts +4 -2
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +13 -4
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/Element.d.ts +1 -9
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +122 -31
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.js +24 -0
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.js +13 -12
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.d.ts +18 -0
- package/lib/cjs/Entity.d.ts.map +1 -1
- package/lib/cjs/Entity.js +53 -16
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/ExportGraphics.js +4 -0
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.js +22 -0
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/FontFile.d.ts +68 -0
- package/lib/cjs/FontFile.d.ts.map +1 -0
- package/lib/cjs/FontFile.js +36 -0
- package/lib/cjs/FontFile.js.map +1 -0
- package/lib/cjs/GeoCoordConfig.js +8 -8
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +6 -3
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/HubMock.d.ts +1 -1
- package/lib/cjs/HubMock.d.ts.map +1 -1
- package/lib/cjs/HubMock.js +9 -5
- package/lib/cjs/HubMock.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +98 -15
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +185 -81
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelDbFonts.d.ts +54 -0
- package/lib/cjs/IModelDbFonts.d.ts.map +1 -0
- package/lib/cjs/IModelDbFonts.js +11 -0
- package/lib/cjs/IModelDbFonts.js.map +1 -0
- package/lib/cjs/IModelElementCloneContext.d.ts +2 -0
- package/lib/cjs/IModelElementCloneContext.d.ts.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js +11 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +14 -14
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +75 -42
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelJsFs.d.ts.map +1 -1
- package/lib/cjs/IModelJsFs.js +17 -1
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/ImageSourceConversion.d.ts +49 -0
- package/lib/cjs/ImageSourceConversion.d.ts.map +1 -0
- package/lib/cjs/ImageSourceConversion.js +37 -0
- package/lib/cjs/ImageSourceConversion.js.map +1 -0
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +8 -8
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LocalHub.js +8 -2
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js +5 -6
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/Material.js +40 -0
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.d.ts +1 -1
- package/lib/cjs/Model.d.ts.map +1 -1
- package/lib/cjs/Model.js +27 -2
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js +5 -3
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js +6 -3
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js +25 -25
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.d.ts +2 -3
- package/lib/cjs/PromiseMemoizer.d.ts.map +1 -1
- package/lib/cjs/PromiseMemoizer.js +12 -5
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.js +1 -4
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +13 -1
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/SQLiteDb.d.ts +6 -4
- package/lib/cjs/SQLiteDb.d.ts.map +1 -1
- package/lib/cjs/SQLiteDb.js +74 -15
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.d.ts +6 -0
- package/lib/cjs/Schema.d.ts.map +1 -1
- package/lib/cjs/Schema.js +12 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/SchemaSync.js +1 -4
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SheetIndex.js +6 -0
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.d.ts +11 -3
- package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js +21 -5
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SqliteStatement.d.ts +4 -2
- package/lib/cjs/SqliteStatement.d.ts.map +1 -1
- package/lib/cjs/SqliteStatement.js +13 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/TextAnnotationLayout.d.ts +6 -3
- package/lib/cjs/TextAnnotationLayout.d.ts.map +1 -1
- package/lib/cjs/TextAnnotationLayout.js +30 -12
- package/lib/cjs/TextAnnotationLayout.js.map +1 -1
- package/lib/cjs/Texture.js +3 -0
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js +6 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +43 -1
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +218 -55
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +6 -6
- package/lib/cjs/ViewDefinition.d.ts.map +1 -1
- package/lib/cjs/ViewDefinition.js +81 -26
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.d.ts +0 -1
- package/lib/cjs/ViewStateHydrator.d.ts.map +1 -1
- package/lib/cjs/ViewStateHydrator.js +1 -11
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.js +3 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +7 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +7 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js +1 -1
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.d.ts +40 -2
- package/lib/cjs/internal/ChangesetConflictArgs.d.ts.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js +101 -0
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js +7 -7
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.d.ts +34 -0
- package/lib/cjs/internal/FontFileImpl.d.ts.map +1 -0
- package/lib/cjs/internal/FontFileImpl.js +143 -0
- package/lib/cjs/internal/FontFileImpl.js.map +1 -0
- package/lib/cjs/internal/IModelDbFontsImpl.d.ts +7 -0
- package/lib/cjs/internal/IModelDbFontsImpl.d.ts.map +1 -0
- package/lib/cjs/internal/IModelDbFontsImpl.js +186 -0
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -0
- package/lib/cjs/internal/NoLocks.js +2 -5
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.d.ts.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js +6 -6
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.d.ts +7 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +8 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js +6 -9
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js +8 -12
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +22 -17
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js +1 -4
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/cjs/rpc/multipart.d.ts.map +1 -1
- package/lib/cjs/rpc/multipart.js +2 -1
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js +2 -2
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/request.d.ts.map +1 -1
- package/lib/cjs/rpc/web/request.js +2 -1
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +4 -2
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +5 -3
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +4 -3
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/package.json +22 -19
package/lib/cjs/TileStorage.js
CHANGED
|
@@ -16,10 +16,15 @@ const IModelHost_1 = require("./IModelHost");
|
|
|
16
16
|
* @beta
|
|
17
17
|
*/
|
|
18
18
|
class TileStorage {
|
|
19
|
+
/**
|
|
20
|
+
* Allows using the underlying `ServerStorage` API directly.
|
|
21
|
+
* @see https://github.com/iTwin/object-storage/
|
|
22
|
+
*/
|
|
23
|
+
storage;
|
|
19
24
|
constructor(storage) {
|
|
20
|
-
this._initializedIModels = new Set();
|
|
21
25
|
this.storage = storage;
|
|
22
26
|
}
|
|
27
|
+
_initializedIModels = new Set();
|
|
23
28
|
/**
|
|
24
29
|
* Ensures any required cloud storage resources for a specific iModel are ready to use.
|
|
25
30
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TileStorage.js","sourceRoot":"","sources":["../../src/TileStorage.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\nimport { gunzip, gzip } from \"zlib\";\r\nimport { promisify } from \"util\";\r\nimport { Metadata, ObjectReference, ServerStorage, TransferConfig } from \"@itwin/object-storage-core\";\r\nimport { getTileObjectReference } from \"@itwin/core-common\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { IModelHost } from \"./IModelHost\";\r\n\r\n/**\r\n * Identifies a tile in cloud tile cache.\r\n * @beta\r\n */\r\nexport interface TileId {\r\n treeId: string;\r\n contentId: string;\r\n guid: string;\r\n}\r\n\r\n/**\r\n * Facilitates interaction with cloud tile cache.\r\n * @beta\r\n */\r\nexport class TileStorage {\r\n /**\r\n * Allows using the underlying `ServerStorage` API directly.\r\n * @see https://github.com/iTwin/object-storage/\r\n */\r\n public readonly storage: ServerStorage;\r\n\r\n public constructor(storage: ServerStorage) {\r\n this.storage = storage;\r\n }\r\n\r\n private _initializedIModels: Set<string> = new Set();\r\n\r\n /**\r\n * Ensures any required cloud storage resources for a specific iModel are ready to use.\r\n */\r\n public async initialize(iModelId: string): Promise<void> {\r\n if (this._initializedIModels.has(iModelId))\r\n return;\r\n if (!(await this.storage.baseDirectoryExists({ baseDirectory: iModelId }))) {\r\n try {\r\n await this.storage.createBaseDirectory({ baseDirectory: iModelId });\r\n } catch (e: any) {\r\n // Ignore 409 errors. This is what Azure blob storage returns when the container already exists.\r\n // Usually this means multiple backends tried to initialize tile storage at the same time.\r\n if(e.statusCode !== 409)\r\n throw e;\r\n }\r\n }\r\n this._initializedIModels.add(iModelId);\r\n }\r\n\r\n /**\r\n * Returns config that can be used by frontends to download tiles\r\n * @param iModelId Id of the iModel\r\n * @param expiresInSeconds Optional number of seconds until the download URL expires. Defaults to expiring exactly at midnight of next Sunday to enable persistent client-side caching.\r\n * It is recommended to set this to a shorter period when using S3-compatible storage - an exact expiry date cannot be ensured due to limitations in their API.\r\n * @see [TileStorage]($frontend)\r\n */\r\n public async getDownloadConfig(iModelId: string, expiresInSeconds?: number): Promise<TransferConfig> {\r\n try {\r\n if (expiresInSeconds !== undefined)\r\n return await this.storage.getDownloadConfig({ baseDirectory: iModelId }, { expiresInSeconds });\r\n const expiresOn = new Date();\r\n expiresOn.setDate(expiresOn.getDate() + (7 - expiresOn.getDay())); // next Sunday\r\n expiresOn.setHours(0, 0, 0, 0); // exactly at midnight\r\n return await this.storage.getDownloadConfig({ baseDirectory: iModelId }, { expiresOn });\r\n } catch (err) {\r\n this.logException(\"Failed to get download config\", err);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Uploads a tile to the cloud cache.\r\n */\r\n public async uploadTile(iModelId: string, changesetId: string, treeId: string, contentId: string, content: Uint8Array, guid?: string, metadata?: Metadata): Promise<void> {\r\n try {\r\n await this.storage.upload(\r\n getTileObjectReference(iModelId, changesetId, treeId, contentId, guid),\r\n Buffer.from(IModelHost.compressCachedTiles ? await promisify(gzip)(content.buffer) : content.buffer),\r\n metadata,\r\n IModelHost.compressCachedTiles ? { contentEncoding: \"gzip\" } : undefined,\r\n );\r\n } catch (err) {\r\n this.logException(\"Failed to upload tile\", err);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Downloads a tile from the cloud cache.\r\n */\r\n public async downloadTile(iModelId: string, changesetId: string, treeId: string, contentId: string, guid?: string): Promise<Uint8Array> {\r\n try {\r\n const buffer = await this.storage.download(\r\n getTileObjectReference(iModelId, changesetId, treeId, contentId, guid),\r\n \"buffer\",\r\n );\r\n return IModelHost.compressCachedTiles ? await promisify(gunzip)(buffer) : buffer;\r\n } catch (err) {\r\n this.logException(\"Failed to download tile\", err);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Returns an async iterator of all tiles that are found in the cloud cache.\r\n */\r\n public async *getCachedTilesGenerator(iModelId: string): AsyncGenerator<TileId> {\r\n const iterator = this.getCachedTilePages(iModelId);\r\n for await (const page of iterator) {\r\n for (const tile of page) {\r\n yield tile;\r\n }\r\n }\r\n }\r\n\r\n private async *getCachedTilePages(iModelId: string): AsyncGenerator<TileId[]> {\r\n const iterator = this.storage.getListObjectsPagedIterator({ baseDirectory: iModelId }, 500);\r\n let prevPage: IteratorResult<ObjectReference[], any> | undefined;\r\n do {\r\n // initiate loading the next page\r\n const page = iterator.next();\r\n // process results from the previous page\r\n if (prevPage)\r\n yield this.convertPage(prevPage.value);\r\n // finish loading the next page\r\n prevPage = await page;\r\n } while (!prevPage.done);\r\n }\r\n\r\n private convertPage(page: ObjectReference[]): TileId[] {\r\n return page\r\n .map((objectReference) => ({\r\n parts: objectReference.relativeDirectory?.split(\"/\") ?? [\"\"],\r\n objectName: objectReference.objectName,\r\n }))\r\n .filter(({ parts, objectName }) => {\r\n if (parts[0] !== \"tiles\")\r\n return false;\r\n if (parts.length !== 3) {\r\n Logger.logWarning(BackendLoggerCategory.IModelTileStorage, \"Malformed tile id found in tile cache: {tileId}\", { tileId: [...parts, objectName].join(\"/\") });\r\n return false;\r\n }\r\n return true;\r\n }).map(({ parts, objectName }) => {\r\n // relativeDirectory = tiles/<treeId>/<guid>\r\n // objectName = <contentId>\r\n return {\r\n treeId: parts[1],\r\n contentId: objectName,\r\n guid: parts[2],\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Returns a list of all tiles that are found in the cloud cache.\r\n */\r\n public async getCachedTiles(iModelId: string): Promise<TileId[]> {\r\n const results: TileId[] = [];\r\n for await (const page of this.getCachedTilePages(iModelId)) {\r\n results.push(...page);\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Returns a boolean indicating whether a tile exists in the cloud cache\r\n */\r\n public async isTileCached(iModelId: string, changesetId: string, treeId: string, contentId: string, guid?: string): Promise<boolean> {\r\n return this.storage.objectExists(getTileObjectReference(iModelId, changesetId, treeId, contentId, guid));\r\n }\r\n\r\n private logException(message: string, err: unknown): void {\r\n Logger.logException(\r\n BackendLoggerCategory.IModelTileStorage,\r\n err,\r\n (category, msg, errorMetadata) => Logger.logError(category, `${message}: {errorMessage}`, { ...errorMetadata, errorMessage: msg }),\r\n );\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"TileStorage.js","sourceRoot":"","sources":["../../src/TileStorage.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\nimport { gunzip, gzip } from \"zlib\";\r\nimport { promisify } from \"util\";\r\nimport { Metadata, ObjectReference, ServerStorage, TransferConfig } from \"@itwin/object-storage-core\";\r\nimport { getTileObjectReference } from \"@itwin/core-common\";\r\nimport { Logger } from \"@itwin/core-bentley\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { IModelHost } from \"./IModelHost\";\r\n\r\n/**\r\n * Identifies a tile in cloud tile cache.\r\n * @beta\r\n */\r\nexport interface TileId {\r\n treeId: string;\r\n contentId: string;\r\n guid: string;\r\n}\r\n\r\n/**\r\n * Facilitates interaction with cloud tile cache.\r\n * @beta\r\n */\r\nexport class TileStorage {\r\n /**\r\n * Allows using the underlying `ServerStorage` API directly.\r\n * @see https://github.com/iTwin/object-storage/\r\n */\r\n public readonly storage: ServerStorage;\r\n\r\n public constructor(storage: ServerStorage) {\r\n this.storage = storage;\r\n }\r\n\r\n private _initializedIModels: Set<string> = new Set();\r\n\r\n /**\r\n * Ensures any required cloud storage resources for a specific iModel are ready to use.\r\n */\r\n public async initialize(iModelId: string): Promise<void> {\r\n if (this._initializedIModels.has(iModelId))\r\n return;\r\n if (!(await this.storage.baseDirectoryExists({ baseDirectory: iModelId }))) {\r\n try {\r\n await this.storage.createBaseDirectory({ baseDirectory: iModelId });\r\n } catch (e: any) {\r\n // Ignore 409 errors. This is what Azure blob storage returns when the container already exists.\r\n // Usually this means multiple backends tried to initialize tile storage at the same time.\r\n if(e.statusCode !== 409)\r\n throw e;\r\n }\r\n }\r\n this._initializedIModels.add(iModelId);\r\n }\r\n\r\n /**\r\n * Returns config that can be used by frontends to download tiles\r\n * @param iModelId Id of the iModel\r\n * @param expiresInSeconds Optional number of seconds until the download URL expires. Defaults to expiring exactly at midnight of next Sunday to enable persistent client-side caching.\r\n * It is recommended to set this to a shorter period when using S3-compatible storage - an exact expiry date cannot be ensured due to limitations in their API.\r\n * @see [TileStorage]($frontend)\r\n */\r\n public async getDownloadConfig(iModelId: string, expiresInSeconds?: number): Promise<TransferConfig> {\r\n try {\r\n if (expiresInSeconds !== undefined)\r\n return await this.storage.getDownloadConfig({ baseDirectory: iModelId }, { expiresInSeconds });\r\n const expiresOn = new Date();\r\n expiresOn.setDate(expiresOn.getDate() + (7 - expiresOn.getDay())); // next Sunday\r\n expiresOn.setHours(0, 0, 0, 0); // exactly at midnight\r\n return await this.storage.getDownloadConfig({ baseDirectory: iModelId }, { expiresOn });\r\n } catch (err) {\r\n this.logException(\"Failed to get download config\", err);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Uploads a tile to the cloud cache.\r\n */\r\n public async uploadTile(iModelId: string, changesetId: string, treeId: string, contentId: string, content: Uint8Array, guid?: string, metadata?: Metadata): Promise<void> {\r\n try {\r\n await this.storage.upload(\r\n getTileObjectReference(iModelId, changesetId, treeId, contentId, guid),\r\n Buffer.from(IModelHost.compressCachedTiles ? await promisify(gzip)(content.buffer) : content.buffer),\r\n metadata,\r\n IModelHost.compressCachedTiles ? { contentEncoding: \"gzip\" } : undefined,\r\n );\r\n } catch (err) {\r\n this.logException(\"Failed to upload tile\", err);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Downloads a tile from the cloud cache.\r\n */\r\n public async downloadTile(iModelId: string, changesetId: string, treeId: string, contentId: string, guid?: string): Promise<Uint8Array> {\r\n try {\r\n const buffer = await this.storage.download(\r\n getTileObjectReference(iModelId, changesetId, treeId, contentId, guid),\r\n \"buffer\",\r\n );\r\n return IModelHost.compressCachedTiles ? await promisify(gunzip)(buffer) : buffer;\r\n } catch (err) {\r\n this.logException(\"Failed to download tile\", err);\r\n throw err;\r\n }\r\n }\r\n\r\n /**\r\n * Returns an async iterator of all tiles that are found in the cloud cache.\r\n */\r\n public async *getCachedTilesGenerator(iModelId: string): AsyncGenerator<TileId> {\r\n const iterator = this.getCachedTilePages(iModelId);\r\n for await (const page of iterator) {\r\n for (const tile of page) {\r\n yield tile;\r\n }\r\n }\r\n }\r\n\r\n private async *getCachedTilePages(iModelId: string): AsyncGenerator<TileId[]> {\r\n const iterator = this.storage.getListObjectsPagedIterator({ baseDirectory: iModelId }, 500);\r\n let prevPage: IteratorResult<ObjectReference[], any> | undefined;\r\n do {\r\n // initiate loading the next page\r\n const page = iterator.next();\r\n // process results from the previous page\r\n if (prevPage)\r\n yield this.convertPage(prevPage.value);\r\n // finish loading the next page\r\n prevPage = await page;\r\n } while (!prevPage.done);\r\n }\r\n\r\n private convertPage(page: ObjectReference[]): TileId[] {\r\n return page\r\n .map((objectReference) => ({\r\n parts: objectReference.relativeDirectory?.split(\"/\") ?? [\"\"],\r\n objectName: objectReference.objectName,\r\n }))\r\n .filter(({ parts, objectName }) => {\r\n if (parts[0] !== \"tiles\")\r\n return false;\r\n if (parts.length !== 3) {\r\n Logger.logWarning(BackendLoggerCategory.IModelTileStorage, \"Malformed tile id found in tile cache: {tileId}\", { tileId: [...parts, objectName].join(\"/\") });\r\n return false;\r\n }\r\n return true;\r\n }).map(({ parts, objectName }) => {\r\n // relativeDirectory = tiles/<treeId>/<guid>\r\n // objectName = <contentId>\r\n return {\r\n treeId: parts[1],\r\n contentId: objectName,\r\n guid: parts[2],\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * Returns a list of all tiles that are found in the cloud cache.\r\n */\r\n public async getCachedTiles(iModelId: string): Promise<TileId[]> {\r\n const results: TileId[] = [];\r\n for await (const page of this.getCachedTilePages(iModelId)) {\r\n results.push(...page);\r\n }\r\n return results;\r\n }\r\n\r\n /**\r\n * Returns a boolean indicating whether a tile exists in the cloud cache\r\n */\r\n public async isTileCached(iModelId: string, changesetId: string, treeId: string, contentId: string, guid?: string): Promise<boolean> {\r\n return this.storage.objectExists(getTileObjectReference(iModelId, changesetId, treeId, contentId, guid));\r\n }\r\n\r\n private logException(message: string, err: unknown): void {\r\n Logger.logException(\r\n BackendLoggerCategory.IModelTileStorage,\r\n err,\r\n (category, msg, errorMetadata) => Logger.logError(category, `${message}: {errorMessage}`, { ...errorMetadata, errorMessage: msg }),\r\n );\r\n }\r\n}\r\n"]}
|
package/lib/cjs/TxnManager.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/** @packageDocumentation
|
|
2
2
|
* @module iModels
|
|
3
3
|
*/
|
|
4
|
-
import { BeEvent, DbResult, Id64String, IModelStatus } from "@itwin/core-bentley";
|
|
4
|
+
import { BeEvent, DbConflictResolution, DbResult, Id64String, IModelStatus } from "@itwin/core-bentley";
|
|
5
5
|
import { EntityIdAndClassIdIterable, ModelGeometryChangesProps, ModelIdAndGeometryGuid } from "@itwin/core-common";
|
|
6
6
|
import { BriefcaseDb, StandaloneDb } from "./IModelDb";
|
|
7
7
|
import { RelationshipProps } from "./Relationship";
|
|
8
|
+
import { DbRebaseChangesetConflictArgs, RebaseChangesetConflictArgs, TxnArgs } from "./internal/ChangesetConflictArgs";
|
|
8
9
|
/** A string that identifies a Txn.
|
|
9
10
|
* @public
|
|
10
11
|
*/
|
|
@@ -56,6 +57,23 @@ export interface ChangeInstanceKey {
|
|
|
56
57
|
}
|
|
57
58
|
/** Strictly for tests. @internal */
|
|
58
59
|
export declare function setMaxEntitiesPerEvent(max: number): number;
|
|
60
|
+
/**
|
|
61
|
+
* @internal
|
|
62
|
+
* Manages conflict resolution during a merge operation.
|
|
63
|
+
*/
|
|
64
|
+
export declare class ChangeMergeManager {
|
|
65
|
+
private _iModel;
|
|
66
|
+
private _conflictHandlers?;
|
|
67
|
+
constructor(_iModel: BriefcaseDb | StandaloneDb);
|
|
68
|
+
resume(): void;
|
|
69
|
+
inProgress(): boolean;
|
|
70
|
+
onConflict(args: RebaseChangesetConflictArgs): DbConflictResolution | undefined;
|
|
71
|
+
addConflictHandler(args: {
|
|
72
|
+
id: string;
|
|
73
|
+
handler: (args: RebaseChangesetConflictArgs) => DbConflictResolution | undefined;
|
|
74
|
+
}): void;
|
|
75
|
+
removeConflictHandler(id: string): void;
|
|
76
|
+
}
|
|
59
77
|
/** Manages local changes to a [[BriefcaseDb]] or [[StandaloneDb]] via [Txns]($docs/learning/InteractiveEditing.md)
|
|
60
78
|
* @public
|
|
61
79
|
*/
|
|
@@ -66,6 +84,8 @@ export declare class TxnManager {
|
|
|
66
84
|
/** @internal */
|
|
67
85
|
get isDisposed(): boolean;
|
|
68
86
|
/** @internal */
|
|
87
|
+
readonly changeMergeManager: ChangeMergeManager;
|
|
88
|
+
/** @internal */
|
|
69
89
|
constructor(_iModel: BriefcaseDb | StandaloneDb);
|
|
70
90
|
/** Array of errors from dependency propagation */
|
|
71
91
|
readonly validationErrors: ValidationError[];
|
|
@@ -109,6 +129,9 @@ export declare class TxnManager {
|
|
|
109
129
|
protected _onBeforeUndoRedo(isUndo: boolean): void;
|
|
110
130
|
/** @internal */
|
|
111
131
|
protected _onAfterUndoRedo(isUndo: boolean): void;
|
|
132
|
+
private _onRebaseTxnBegin;
|
|
133
|
+
private _onRebaseTxnEnd;
|
|
134
|
+
private _onRebaseLocalTxnConflict;
|
|
112
135
|
/** Dependency handlers may call method this to report a validation error.
|
|
113
136
|
* @param error The error. If error.fatal === true, the transaction will cancel rather than commit.
|
|
114
137
|
*/
|
|
@@ -155,6 +178,15 @@ export declare class TxnManager {
|
|
|
155
178
|
* @see [[onReplayExternalTxns]] for the event raised before the changes are applied.
|
|
156
179
|
*/
|
|
157
180
|
readonly onReplayedExternalTxns: BeEvent<() => void>;
|
|
181
|
+
/** @internal */
|
|
182
|
+
readonly onRebaseTxnBegin: BeEvent<(txn: TxnArgs) => void>;
|
|
183
|
+
/** @internal */
|
|
184
|
+
readonly onRebaseTxnEnd: BeEvent<(txn: TxnArgs) => void>;
|
|
185
|
+
/**
|
|
186
|
+
* if handler is set and it does not return undefiend then default handler will not be called
|
|
187
|
+
* @internal
|
|
188
|
+
* */
|
|
189
|
+
appCustomConflictHandler?: (args: DbRebaseChangesetConflictArgs) => DbConflictResolution | undefined;
|
|
158
190
|
/**
|
|
159
191
|
* Restart the current TxnManager session. This causes all Txns in the current session to no longer be undoable (as if the file was closed
|
|
160
192
|
* and reopened.)
|
|
@@ -237,9 +269,19 @@ export declare class TxnManager {
|
|
|
237
269
|
get hasUnsavedChanges(): boolean;
|
|
238
270
|
/** Query if there are un-saved or un-pushed local changes. */
|
|
239
271
|
get hasLocalChanges(): boolean;
|
|
272
|
+
/** Destroy the record of all local changes that have yet to be saved and/or pushed.
|
|
273
|
+
* This permanently eradicates your changes - use with caution!
|
|
274
|
+
* Typically, callers will want to subsequently use [[LockControl.releaseAllLocks]].
|
|
275
|
+
* After calling this function, [[hasLocalChanges]], [[hasPendingTxns]], and [[hasUnsavedChanges]] will all be `false`.
|
|
276
|
+
*/
|
|
277
|
+
deleteAllTxns(): void;
|
|
240
278
|
/** Obtain a list of the EC instances that have been changed locally by the [[BriefcaseDb]] associated with this `TxnManager` and have not yet been pushed to the iModel.
|
|
241
279
|
* @beta
|
|
242
280
|
*/
|
|
243
281
|
queryLocalChanges(args?: QueryLocalChangesArgs): Iterable<ChangeInstanceKey>;
|
|
282
|
+
/** Query the number of bytes of memory currently allocated by SQLite to keep track of
|
|
283
|
+
* changes to the iModel, for debugging/diagnostic purposes, as reported by [sqlite3session_memory_used](https://www.sqlite.org/session/sqlite3session_memory_used.html).
|
|
284
|
+
*/
|
|
285
|
+
getChangeTrackingMemoryUsed(): number;
|
|
244
286
|
}
|
|
245
287
|
//# sourceMappingURL=TxnManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TxnManager.d.ts","sourceRoot":"","sources":["../../src/TxnManager.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EACG,OAAO,EAAmD,QAAQ,EAAa,UAAU,EAAE,YAAY,
|
|
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,0BAA0B,EAAe,yBAAyB,EAAE,sBAAsB,EAA4D,MAAM,oBAAoB,CAAC;AAE1L,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAgB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAEvH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAC7C,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAC7C,4IAA4I;IAC5I,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,8IAA8I;IAC9I,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED;;;EAGE;AACF,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,EAAE,EAAE,UAAU,CAAC;IACf,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,UAAU,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;CAChD;AAID,oCAAoC;AACpC,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI1D;AAkND;;;EAGE;AACF,qBAAa,kBAAkB;IAEV,OAAO,CAAC,OAAO;IADlC,OAAO,CAAC,iBAAiB,CAAC,CAAmB;gBAClB,OAAO,EAAE,WAAW,GAAG,YAAY;IACvD,MAAM;IAGN,UAAU;IAGV,UAAU,CAAC,IAAI,EAAE,2BAA2B,GAAG,oBAAoB,GAAG,SAAS;IAY/E,kBAAkB,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,IAAI,EAAE,2BAA2B,KAAK,oBAAoB,GAAG,SAAS,CAAA;KAAE;IAczH,qBAAqB,CAAC,EAAE,EAAE,MAAM;CAoBxC;AAED;;GAEG;AACH,qBAAa,UAAU;IAaT,OAAO,CAAC,OAAO;IAZ3B,gBAAgB;IAChB,OAAO,CAAC,WAAW,CAAS;IAE5B,gBAAgB;IAChB,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,gBAAgB;IAChB,SAAgB,kBAAkB,EAAE,kBAAkB,CAAC;IAEvD,gBAAgB;gBACI,OAAO,EAAE,WAAW,GAAG,YAAY;IAOvD,kDAAkD;IAClD,SAAgB,gBAAgB,EAAE,eAAe,EAAE,CAAM;IAEzD,OAAO,KAAK,SAAS,GAAsC;IAC3D,OAAO,CAAC,gBAAgB;IAGxB,OAAO,CAAC,qBAAqB;IAI7B;;;OAGG;IACI,cAAc,IAAI,IAAI;IAM7B,gBAAgB;IAChB,SAAS,CAAC,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IAG9E,gBAAgB;IAChB,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IAG1E,gBAAgB;IAChB,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAGxD,gBAAgB;IAChB,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAG9D,gBAAgB;IAChB,SAAS,CAAC,gBAAgB;IAE1B;;OAEG;IACH,SAAS,CAAC,cAAc;IAMxB,gBAAgB;IAChB,SAAS,CAAC,kBAAkB,CAAC,UAAU,EAAE,yBAAyB,EAAE;IAKpE,gBAAgB;IAChB,SAAS,CAAC,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,EAAE,GAAG,IAAI;IAK1E,gBAAgB;IAChB,SAAS,CAAC,SAAS;IAKnB,gBAAgB;IAChB,SAAS,CAAC,YAAY;IAMtB,gBAAgB;IAChB,SAAS,CAAC,qBAAqB;IAK/B,gBAAgB;IAChB,SAAS,CAAC,uBAAuB;IAKjC,gBAAgB;IAChB,SAAS,CAAC,iBAAiB;IAM3B,gBAAgB;IAChB,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO;IAK3C,gBAAgB;IAChB,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO;IAM1C,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,yBAAyB;IA6EjC;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,eAAe;IAKzC,kGAAkG;IAClG,IAAW,aAAa,IAAI,OAAO,CAA8C;IAEjF,gBAAgB;IAChB,SAAgB,eAAe,gBAAqB,IAAI,EAAI;IAE5D;;;OAGG;IACH,SAAgB,iBAAiB,oBAAyB,kBAAkB,KAAK,IAAI,EAAI;IAEzF;;;OAGG;IACH,SAAgB,eAAe,oBAAyB,kBAAkB,KAAK,IAAI,EAAI;IAEvF;;;;;OAKG;IACH,SAAgB,sBAAsB,oBAAyB,aAAa,CAAC,sBAAsB,CAAC,KAAK,IAAI,EAAI;IAEjH,SAAgB,iBAAiB,mBAAwB,yBAAyB,EAAE,KAAK,IAAI,EAAI;IACjG,iJAAiJ;IACjJ,SAAgB,QAAQ,gBAAqB,IAAI,EAAI;IACrD,wJAAwJ;IACxJ,SAAgB,WAAW,gBAAqB,IAAI,EAAI;IACxD,wEAAwE;IACxE,SAAgB,gBAAgB,gBAAqB,IAAI,EAAI;IAC7D,+DAA+D;IAC/D,SAAgB,gBAAgB,mBAAwB,OAAO,KAAK,IAAI,EAAI;IAC5E;;OAEG;IACH,SAAgB,eAAe,mBAAwB,OAAO,KAAK,IAAI,EAAI;IAC3E;;OAEG;IACH,SAAgB,oBAAoB,gBAAqB,IAAI,EAAI;IACjE;;OAEG;IACH,SAAgB,sBAAsB,gBAAqB,IAAI,EAAI;IAEnE,gBAAgB;IAChB,SAAgB,gBAAgB,gBAAqB,OAAO,KAAK,IAAI,EAAI;IACzE,gBAAgB;IAChB,SAAgB,cAAc,gBAAqB,OAAO,KAAK,IAAI,EAAI;IACvE;;;SAGK;IACE,wBAAwB,CAAC,EAAE,CAAC,IAAI,EAAE,6BAA6B,KAAK,oBAAoB,GAAG,SAAS,CAAC;IAE5G;;;;;;OAMG;IACI,cAAc;IAIrB,4EAA4E;IAC5E,IAAW,iBAAiB,IAAI,OAAO,CAA+C;IAEtF,oGAAoG;IACpG,IAAW,cAAc,IAAI,OAAO,CAA4C;IAEhF,2EAA2E;IAC3E,IAAW,cAAc,IAAI,OAAO,CAA4C;IAEhF;;OAEG;IACI,aAAa,IAAI,MAAM;IAE9B;;OAEG;IACI,aAAa,IAAI,MAAM;IAE9B;;;;;OAKG;IACI,sBAAsB,IAAI,QAAQ;IAEzC,gCAAgC;IACzB,oBAAoB,IAAI,QAAQ;IAEvC,kFAAkF;IAC3E,yBAAyB,IAAI,MAAM;IAE1C;;;;;;;OAOG;IACI,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,YAAY;IAIvD,yCAAyC;IAClC,gBAAgB,IAAI,YAAY;IAEvC,gEAAgE;IACzD,UAAU,IAAI,YAAY;IAEjC;;;;OAIG;IACI,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY;IAElD;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY;IAEjD;;;;OAIG;IACI,YAAY,IAAI,YAAY;IAEnC;OACG;IACI,eAAe,IAAI,WAAW;IAErC,+CAA+C;IACxC,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW;IAEtD,iDAAiD;IAC1C,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW;IAE1D,oDAAoD;IAC7C,eAAe,IAAI,WAAW;IAErC,sFAAsF;IAC/E,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;IAEpD,+BAA+B;IACxB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAEhD,2FAA2F;IAC3F,IAAW,cAAc,IAAI,OAAO,CAA4C;IAEhF,0FAA0F;IAC1F,IAAW,iBAAiB,IAAI,OAAO,CAA+C;IAEtF,8DAA8D;IAC9D,IAAW,eAAe,IAAI,OAAO,CAA0D;IAE/F;;;;OAIG;IACI,aAAa,IAAI,IAAI;IAI5B;;MAEE;IACK,iBAAiB,CAAC,IAAI,CAAC,EAAE,qBAAqB,GAAG,QAAQ,CAAC,iBAAiB,CAAC;IAOnF;;OAEG;IACI,2BAA2B,IAAI,MAAM;CAG7C"}
|
package/lib/cjs/TxnManager.js
CHANGED
|
@@ -7,13 +7,15 @@
|
|
|
7
7
|
* @module iModels
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.TxnManager = void 0;
|
|
10
|
+
exports.TxnManager = exports.ChangeMergeManager = void 0;
|
|
11
11
|
exports.setMaxEntitiesPerEvent = setMaxEntitiesPerEvent;
|
|
12
12
|
const touch = require("touch");
|
|
13
13
|
const core_bentley_1 = require("@itwin/core-bentley");
|
|
14
|
+
const core_common_1 = require("@itwin/core-common");
|
|
14
15
|
const BackendLoggerCategory_1 = require("./BackendLoggerCategory");
|
|
15
16
|
const IpcHost_1 = require("./IpcHost");
|
|
16
17
|
const Symbols_1 = require("./internal/Symbols");
|
|
18
|
+
const ChangesetConflictArgs_1 = require("./internal/ChangesetConflictArgs");
|
|
17
19
|
/** Strictly for tests. @internal */
|
|
18
20
|
function setMaxEntitiesPerEvent(max) {
|
|
19
21
|
const prevMax = ChangedEntitiesProc.maxPerEvent;
|
|
@@ -22,9 +24,10 @@ function setMaxEntitiesPerEvent(max) {
|
|
|
22
24
|
}
|
|
23
25
|
/** Maintains an ordered array of entity Ids and a parallel array containing the index of the corresponding entity's class Id. */
|
|
24
26
|
class ChangedEntitiesArray {
|
|
27
|
+
entityIds = new core_bentley_1.OrderedId64Array();
|
|
28
|
+
_classIndices = [];
|
|
29
|
+
_classIds;
|
|
25
30
|
constructor(classIds) {
|
|
26
|
-
this.entityIds = new core_bentley_1.OrderedId64Array();
|
|
27
|
-
this._classIndices = [];
|
|
28
31
|
this._classIds = classIds;
|
|
29
32
|
}
|
|
30
33
|
insert(entityId, classId) {
|
|
@@ -66,13 +69,12 @@ class ChangedEntitiesArray {
|
|
|
66
69
|
}
|
|
67
70
|
}
|
|
68
71
|
class ChangedEntitiesProc {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
72
|
+
_classIds = new core_bentley_1.IndexMap((lhs, rhs) => (0, core_bentley_1.compareStrings)(lhs, rhs));
|
|
73
|
+
_inserted = new ChangedEntitiesArray(this._classIds);
|
|
74
|
+
_deleted = new ChangedEntitiesArray(this._classIds);
|
|
75
|
+
_updated = new ChangedEntitiesArray(this._classIds);
|
|
76
|
+
_currSize = 0;
|
|
77
|
+
static maxPerEvent = 1000;
|
|
76
78
|
static process(iModel, mgr) {
|
|
77
79
|
if (mgr.isDisposed) {
|
|
78
80
|
// The iModel is being closed. Do not prepare new sqlite statements.
|
|
@@ -190,66 +192,91 @@ class ChangedEntitiesProc {
|
|
|
190
192
|
}
|
|
191
193
|
}
|
|
192
194
|
}
|
|
193
|
-
|
|
195
|
+
/**
|
|
196
|
+
* @internal
|
|
197
|
+
* Manages conflict resolution during a merge operation.
|
|
198
|
+
*/
|
|
199
|
+
class ChangeMergeManager {
|
|
200
|
+
_iModel;
|
|
201
|
+
_conflictHandlers;
|
|
202
|
+
constructor(_iModel) {
|
|
203
|
+
this._iModel = _iModel;
|
|
204
|
+
}
|
|
205
|
+
resume() {
|
|
206
|
+
this._iModel[Symbols_1._nativeDb].pullMergeResume();
|
|
207
|
+
}
|
|
208
|
+
inProgress() {
|
|
209
|
+
return this._iModel[Symbols_1._nativeDb].pullMergeInProgress();
|
|
210
|
+
}
|
|
211
|
+
onConflict(args) {
|
|
212
|
+
let curr = this._conflictHandlers;
|
|
213
|
+
while (curr) {
|
|
214
|
+
const resolution = curr.handler(args);
|
|
215
|
+
if (resolution !== undefined) {
|
|
216
|
+
core_bentley_1.Logger.logTrace(BackendLoggerCategory_1.BackendLoggerCategory.IModelDb, `Conflict handler ${curr.id} resolved conflict`);
|
|
217
|
+
return resolution;
|
|
218
|
+
}
|
|
219
|
+
curr = curr.next;
|
|
220
|
+
}
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
addConflictHandler(args) {
|
|
224
|
+
const idExists = (id) => {
|
|
225
|
+
let curr = this._conflictHandlers;
|
|
226
|
+
while (curr) {
|
|
227
|
+
if (curr.id === id)
|
|
228
|
+
return true;
|
|
229
|
+
curr = curr.next;
|
|
230
|
+
}
|
|
231
|
+
return false;
|
|
232
|
+
};
|
|
233
|
+
if (idExists(args.id))
|
|
234
|
+
throw new core_common_1.IModelError(core_bentley_1.DbResult.BE_SQLITE_ERROR, `Conflict handler with id ${args.id} already exists`);
|
|
235
|
+
this._conflictHandlers = { ...args, next: this._conflictHandlers };
|
|
236
|
+
}
|
|
237
|
+
removeConflictHandler(id) {
|
|
238
|
+
if (!this._conflictHandlers)
|
|
239
|
+
return;
|
|
240
|
+
if (this._conflictHandlers?.id === id) {
|
|
241
|
+
this._conflictHandlers = this._conflictHandlers.next;
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
let prev = this._conflictHandlers;
|
|
245
|
+
let curr = this._conflictHandlers?.next;
|
|
246
|
+
while (curr) {
|
|
247
|
+
if (curr.id === id) {
|
|
248
|
+
prev.next = curr.next;
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
prev = curr;
|
|
252
|
+
curr = curr.next;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.ChangeMergeManager = ChangeMergeManager;
|
|
194
257
|
/** Manages local changes to a [[BriefcaseDb]] or [[StandaloneDb]] via [Txns]($docs/learning/InteractiveEditing.md)
|
|
195
258
|
* @public
|
|
196
259
|
*/
|
|
197
260
|
class TxnManager {
|
|
261
|
+
_iModel;
|
|
262
|
+
/** @internal */
|
|
263
|
+
_isDisposed = false;
|
|
198
264
|
/** @internal */
|
|
199
265
|
get isDisposed() {
|
|
200
266
|
return this._isDisposed;
|
|
201
267
|
}
|
|
202
268
|
/** @internal */
|
|
269
|
+
changeMergeManager;
|
|
270
|
+
/** @internal */
|
|
203
271
|
constructor(_iModel) {
|
|
204
272
|
this._iModel = _iModel;
|
|
205
|
-
|
|
206
|
-
this._isDisposed = false;
|
|
207
|
-
/** Array of errors from dependency propagation */
|
|
208
|
-
this.validationErrors = [];
|
|
209
|
-
/** @internal */
|
|
210
|
-
this.onEndValidation = new core_bentley_1.BeEvent();
|
|
211
|
-
/** Called after validation completes from [[IModelDb.saveChanges]].
|
|
212
|
-
* The argument to the event holds the list of elements that were inserted, updated, and deleted.
|
|
213
|
-
* @note If there are many changed elements in a single Txn, the notifications are sent in batches so this event *may be called multiple times* per Txn.
|
|
214
|
-
*/
|
|
215
|
-
this.onElementsChanged = new core_bentley_1.BeEvent();
|
|
216
|
-
/** Called after validation completes from [[IModelDb.saveChanges]].
|
|
217
|
-
* The argument to the event holds the list of models that were inserted, updated, and deleted.
|
|
218
|
-
* @note If there are many changed models in a single Txn, the notifications are sent in batches so this event *may be called multiple times* per Txn.
|
|
219
|
-
*/
|
|
220
|
-
this.onModelsChanged = new core_bentley_1.BeEvent();
|
|
221
|
-
/** Event raised after the geometry within one or more [[GeometricModel]]s is modified by applying a changeset or validation of a transaction.
|
|
222
|
-
* A model's geometry can change as a result of:
|
|
223
|
-
* - Insertion or deletion of a geometric element within the model; or
|
|
224
|
-
* - Modification of an existing element's geometric properties; or
|
|
225
|
-
* - An explicit request to flag it as changed via [[IModelDb.Models.updateModel]].
|
|
226
|
-
*/
|
|
227
|
-
this.onModelGeometryChanged = new core_bentley_1.BeEvent();
|
|
228
|
-
this.onGeometryChanged = new core_bentley_1.BeEvent();
|
|
229
|
-
/** Event raised before a commit operation is performed. Initiated by a call to [[IModelDb.saveChanges]], unless there are no changes to save. */
|
|
230
|
-
this.onCommit = new core_bentley_1.BeEvent();
|
|
231
|
-
/** Event raised after a commit operation has been performed. Initiated by a call to [[IModelDb.saveChanges]], even if there were no changes to save. */
|
|
232
|
-
this.onCommitted = new core_bentley_1.BeEvent();
|
|
233
|
-
/** Event raised after a ChangeSet has been applied to this briefcase */
|
|
234
|
-
this.onChangesApplied = new core_bentley_1.BeEvent();
|
|
235
|
-
/** Event raised before an undo/redo operation is performed. */
|
|
236
|
-
this.onBeforeUndoRedo = new core_bentley_1.BeEvent();
|
|
237
|
-
/** Event raised after an undo/redo operation has been performed.
|
|
238
|
-
* @param _action The action that was performed.
|
|
239
|
-
*/
|
|
240
|
-
this.onAfterUndoRedo = new core_bentley_1.BeEvent();
|
|
241
|
-
/** Event raised for a read-only briefcase that was opened with the `watchForChanges` flag enabled when changes made by another connection are applied to the briefcase.
|
|
242
|
-
* @see [[onReplayedExternalTxns]] for the event raised after all such changes have been applied.
|
|
243
|
-
*/
|
|
244
|
-
this.onReplayExternalTxns = new core_bentley_1.BeEvent();
|
|
245
|
-
/** Event raised for a read-only briefcase that was opened with the `watchForChanges` flag enabled when changes made by another connection are applied to the briefcase.
|
|
246
|
-
* @see [[onReplayExternalTxns]] for the event raised before the changes are applied.
|
|
247
|
-
*/
|
|
248
|
-
this.onReplayedExternalTxns = new core_bentley_1.BeEvent();
|
|
273
|
+
this.changeMergeManager = new ChangeMergeManager(_iModel);
|
|
249
274
|
_iModel.onBeforeClose.addOnce(() => {
|
|
250
275
|
this._isDisposed = true;
|
|
251
276
|
});
|
|
252
277
|
}
|
|
278
|
+
/** Array of errors from dependency propagation */
|
|
279
|
+
validationErrors = [];
|
|
253
280
|
get _nativeDb() { return this._iModel[Symbols_1._nativeDb]; }
|
|
254
281
|
_getElementClass(elClassName) {
|
|
255
282
|
return this._iModel.getJsClass(elClassName);
|
|
@@ -340,6 +367,79 @@ class TxnManager {
|
|
|
340
367
|
this.onAfterUndoRedo.raiseEvent(isUndo);
|
|
341
368
|
IpcHost_1.IpcHost.notifyTxns(this._iModel, "notifyAfterUndoRedo", isUndo);
|
|
342
369
|
}
|
|
370
|
+
_onRebaseTxnBegin(txn) {
|
|
371
|
+
this.onRebaseTxnBegin.raiseEvent(txn);
|
|
372
|
+
}
|
|
373
|
+
_onRebaseTxnEnd(txn) {
|
|
374
|
+
this.onRebaseTxnEnd.raiseEvent(txn);
|
|
375
|
+
}
|
|
376
|
+
_onRebaseLocalTxnConflict(internalArg) {
|
|
377
|
+
const args = new ChangesetConflictArgs_1.RebaseChangesetConflictArgs(internalArg, this._iModel);
|
|
378
|
+
const getChangeMetaData = () => {
|
|
379
|
+
return {
|
|
380
|
+
parent: this._iModel.changeset,
|
|
381
|
+
txn: args.txn,
|
|
382
|
+
table: args.tableName,
|
|
383
|
+
op: args.opcode,
|
|
384
|
+
cause: args.cause,
|
|
385
|
+
indirect: args.indirect,
|
|
386
|
+
primarykey: args.getPrimaryKeyValues(),
|
|
387
|
+
fkConflictCount: args.cause === "ForeignKey" ? args.getForeignKeyConflicts() : undefined,
|
|
388
|
+
};
|
|
389
|
+
};
|
|
390
|
+
// Default conflict resolution for which custom handler is never called.
|
|
391
|
+
if (args.cause === "Data" && !args.indirect) {
|
|
392
|
+
if (args.tableName === "be_Prop") {
|
|
393
|
+
if (args.getValueText(0, "Old") === "ec_Db" && args.getValueText(1, "Old") === "localDbInfo") {
|
|
394
|
+
return core_bentley_1.DbConflictResolution.Skip;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (args.tableName.startsWith("ec_")) {
|
|
398
|
+
return core_bentley_1.DbConflictResolution.Skip;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
if (args.cause === "Conflict") {
|
|
402
|
+
if (args.tableName.startsWith("ec_")) {
|
|
403
|
+
return core_bentley_1.DbConflictResolution.Skip;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
try {
|
|
407
|
+
const resolution = this.changeMergeManager.onConflict(args);
|
|
408
|
+
if (resolution !== undefined)
|
|
409
|
+
return resolution;
|
|
410
|
+
}
|
|
411
|
+
catch (err) {
|
|
412
|
+
const msg = `Rebase failed. Custom conflict handler should not throw exception. Aborting txn. ${core_bentley_1.BentleyError.getErrorMessage(err)}`;
|
|
413
|
+
core_bentley_1.Logger.logError(BackendLoggerCategory_1.BackendLoggerCategory.IModelDb, msg, getChangeMetaData());
|
|
414
|
+
args.setLastError(msg);
|
|
415
|
+
return core_bentley_1.DbConflictResolution.Abort;
|
|
416
|
+
}
|
|
417
|
+
if (args.cause === "Data" && !args.indirect) {
|
|
418
|
+
core_bentley_1.Logger.logInfo(BackendLoggerCategory_1.BackendLoggerCategory.IModelDb, "UPDATE/DELETE before value do not match with one in db or CASCADE action was triggered. Local change will replace existing.", getChangeMetaData());
|
|
419
|
+
return core_bentley_1.DbConflictResolution.Replace;
|
|
420
|
+
}
|
|
421
|
+
if (args.cause === "Conflict") {
|
|
422
|
+
const msg = "PRIMARY KEY insert conflict. Aborting rebase.";
|
|
423
|
+
core_bentley_1.Logger.logError(BackendLoggerCategory_1.BackendLoggerCategory.IModelDb, msg, getChangeMetaData());
|
|
424
|
+
args.setLastError(msg);
|
|
425
|
+
return core_bentley_1.DbConflictResolution.Abort;
|
|
426
|
+
}
|
|
427
|
+
if (args.cause === "ForeignKey") {
|
|
428
|
+
const msg = `Foreign key conflicts in ChangeSet. Aborting rebase.`;
|
|
429
|
+
core_bentley_1.Logger.logInfo(BackendLoggerCategory_1.BackendLoggerCategory.IModelDb, msg, getChangeMetaData());
|
|
430
|
+
args.setLastError(msg);
|
|
431
|
+
return core_bentley_1.DbConflictResolution.Abort;
|
|
432
|
+
}
|
|
433
|
+
if (args.cause === "NotFound") {
|
|
434
|
+
core_bentley_1.Logger.logInfo(BackendLoggerCategory_1.BackendLoggerCategory.IModelDb, "PRIMARY KEY not found. Skipping local change.", getChangeMetaData());
|
|
435
|
+
return core_bentley_1.DbConflictResolution.Skip;
|
|
436
|
+
}
|
|
437
|
+
if (args.cause === "Constraint") {
|
|
438
|
+
core_bentley_1.Logger.logInfo(BackendLoggerCategory_1.BackendLoggerCategory.IModelDb, "Constraint voilation detected. Generally caused by db constraints like UNIQUE index. Skipping local change.", getChangeMetaData());
|
|
439
|
+
return core_bentley_1.DbConflictResolution.Skip;
|
|
440
|
+
}
|
|
441
|
+
return core_bentley_1.DbConflictResolution.Replace;
|
|
442
|
+
}
|
|
343
443
|
/** Dependency handlers may call method this to report a validation error.
|
|
344
444
|
* @param error The error. If error.fatal === true, the transaction will cancel rather than commit.
|
|
345
445
|
*/
|
|
@@ -349,6 +449,55 @@ class TxnManager {
|
|
|
349
449
|
}
|
|
350
450
|
/** Determine whether any fatal validation errors have occurred during dependency propagation. */
|
|
351
451
|
get hasFatalError() { return this._nativeDb.hasFatalTxnError(); }
|
|
452
|
+
/** @internal */
|
|
453
|
+
onEndValidation = new core_bentley_1.BeEvent();
|
|
454
|
+
/** Called after validation completes from [[IModelDb.saveChanges]].
|
|
455
|
+
* The argument to the event holds the list of elements that were inserted, updated, and deleted.
|
|
456
|
+
* @note If there are many changed elements in a single Txn, the notifications are sent in batches so this event *may be called multiple times* per Txn.
|
|
457
|
+
*/
|
|
458
|
+
onElementsChanged = new core_bentley_1.BeEvent();
|
|
459
|
+
/** Called after validation completes from [[IModelDb.saveChanges]].
|
|
460
|
+
* The argument to the event holds the list of models that were inserted, updated, and deleted.
|
|
461
|
+
* @note If there are many changed models in a single Txn, the notifications are sent in batches so this event *may be called multiple times* per Txn.
|
|
462
|
+
*/
|
|
463
|
+
onModelsChanged = new core_bentley_1.BeEvent();
|
|
464
|
+
/** Event raised after the geometry within one or more [[GeometricModel]]s is modified by applying a changeset or validation of a transaction.
|
|
465
|
+
* A model's geometry can change as a result of:
|
|
466
|
+
* - Insertion or deletion of a geometric element within the model; or
|
|
467
|
+
* - Modification of an existing element's geometric properties; or
|
|
468
|
+
* - An explicit request to flag it as changed via [[IModelDb.Models.updateModel]].
|
|
469
|
+
*/
|
|
470
|
+
onModelGeometryChanged = new core_bentley_1.BeEvent();
|
|
471
|
+
onGeometryChanged = new core_bentley_1.BeEvent();
|
|
472
|
+
/** Event raised before a commit operation is performed. Initiated by a call to [[IModelDb.saveChanges]], unless there are no changes to save. */
|
|
473
|
+
onCommit = new core_bentley_1.BeEvent();
|
|
474
|
+
/** Event raised after a commit operation has been performed. Initiated by a call to [[IModelDb.saveChanges]], even if there were no changes to save. */
|
|
475
|
+
onCommitted = new core_bentley_1.BeEvent();
|
|
476
|
+
/** Event raised after a ChangeSet has been applied to this briefcase */
|
|
477
|
+
onChangesApplied = new core_bentley_1.BeEvent();
|
|
478
|
+
/** Event raised before an undo/redo operation is performed. */
|
|
479
|
+
onBeforeUndoRedo = new core_bentley_1.BeEvent();
|
|
480
|
+
/** Event raised after an undo/redo operation has been performed.
|
|
481
|
+
* @param _action The action that was performed.
|
|
482
|
+
*/
|
|
483
|
+
onAfterUndoRedo = new core_bentley_1.BeEvent();
|
|
484
|
+
/** Event raised for a read-only briefcase that was opened with the `watchForChanges` flag enabled when changes made by another connection are applied to the briefcase.
|
|
485
|
+
* @see [[onReplayedExternalTxns]] for the event raised after all such changes have been applied.
|
|
486
|
+
*/
|
|
487
|
+
onReplayExternalTxns = new core_bentley_1.BeEvent();
|
|
488
|
+
/** Event raised for a read-only briefcase that was opened with the `watchForChanges` flag enabled when changes made by another connection are applied to the briefcase.
|
|
489
|
+
* @see [[onReplayExternalTxns]] for the event raised before the changes are applied.
|
|
490
|
+
*/
|
|
491
|
+
onReplayedExternalTxns = new core_bentley_1.BeEvent();
|
|
492
|
+
/** @internal */
|
|
493
|
+
onRebaseTxnBegin = new core_bentley_1.BeEvent();
|
|
494
|
+
/** @internal */
|
|
495
|
+
onRebaseTxnEnd = new core_bentley_1.BeEvent();
|
|
496
|
+
/**
|
|
497
|
+
* if handler is set and it does not return undefiend then default handler will not be called
|
|
498
|
+
* @internal
|
|
499
|
+
* */
|
|
500
|
+
appCustomConflictHandler;
|
|
352
501
|
/**
|
|
353
502
|
* Restart the current TxnManager session. This causes all Txns in the current session to no longer be undoable (as if the file was closed
|
|
354
503
|
* and reopened.)
|
|
@@ -435,6 +584,14 @@ class TxnManager {
|
|
|
435
584
|
get hasUnsavedChanges() { return this._nativeDb.hasUnsavedChanges(); }
|
|
436
585
|
/** Query if there are un-saved or un-pushed local changes. */
|
|
437
586
|
get hasLocalChanges() { return this.hasUnsavedChanges || this.hasPendingTxns; }
|
|
587
|
+
/** Destroy the record of all local changes that have yet to be saved and/or pushed.
|
|
588
|
+
* This permanently eradicates your changes - use with caution!
|
|
589
|
+
* Typically, callers will want to subsequently use [[LockControl.releaseAllLocks]].
|
|
590
|
+
* After calling this function, [[hasLocalChanges]], [[hasPendingTxns]], and [[hasUnsavedChanges]] will all be `false`.
|
|
591
|
+
*/
|
|
592
|
+
deleteAllTxns() {
|
|
593
|
+
this._nativeDb.deleteAllTxns();
|
|
594
|
+
}
|
|
438
595
|
/** Obtain a list of the EC instances that have been changed locally by the [[BriefcaseDb]] associated with this `TxnManager` and have not yet been pushed to the iModel.
|
|
439
596
|
* @beta
|
|
440
597
|
*/
|
|
@@ -444,6 +601,12 @@ class TxnManager {
|
|
|
444
601
|
}
|
|
445
602
|
return this._nativeDb.getLocalChanges(args.includedClasses ?? [], args.includeUnsavedChanges ?? false);
|
|
446
603
|
}
|
|
604
|
+
/** Query the number of bytes of memory currently allocated by SQLite to keep track of
|
|
605
|
+
* changes to the iModel, for debugging/diagnostic purposes, as reported by [sqlite3session_memory_used](https://www.sqlite.org/session/sqlite3session_memory_used.html).
|
|
606
|
+
*/
|
|
607
|
+
getChangeTrackingMemoryUsed() {
|
|
608
|
+
return this._iModel[Symbols_1._nativeDb].getChangeTrackingMemoryUsed();
|
|
609
|
+
}
|
|
447
610
|
}
|
|
448
611
|
exports.TxnManager = TxnManager;
|
|
449
612
|
//# sourceMappingURL=TxnManager.js.map
|