@itwin/core-backend 5.8.0-dev.9 → 5.8.0
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 +23 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CatalogDb.js.map +1 -1
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +2 -2
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +248 -248
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +5 -5
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/EntityReferences.js.map +1 -1
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/FontFile.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +47 -47
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +8 -11
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelDbFonts.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/ImageSourceConversion.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +28 -4
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +6 -0
- package/lib/cjs/LineStyle.d.ts.map +1 -1
- package/lib/cjs/LineStyle.js +41 -32
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.d.ts +17 -10
- package/lib/cjs/LocalHub.d.ts.map +1 -1
- package/lib/cjs/LocalHub.js +127 -29
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
- package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
- package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
- package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
- package/lib/cjs/core-backend.d.ts +2 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +2 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/domains/GenericSchema.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.js.map +1 -1
- package/lib/cjs/internal/HubMock.js.map +1 -1
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NativePlatform.js.map +1 -1
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/OnlineStatus.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js +108 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js +8 -4
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +57 -14
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.d.ts +8 -0
- package/lib/cjs/workspace/Settings.d.ts.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
- package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsDb.js +19 -0
- package/lib/cjs/workspace/SettingsDb.js.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts +250 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.js +53 -0
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +42 -19
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts +32 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js +19 -0
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BisCoreSchema.js.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CatalogDb.js.map +1 -1
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangeSummaryManager.js +2 -2
- package/lib/esm/ChangeSummaryManager.js.map +1 -1
- package/lib/esm/ChangedElementsDb.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +248 -248
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/ClassRegistry.js +5 -5
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeService.js.map +1 -1
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/CustomViewState3dCreator.js.map +1 -1
- package/lib/esm/DevTools.js.map +1 -1
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSchemaXmlContext.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.js.map +1 -1
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementGraphics.js.map +1 -1
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/EntityReferences.js.map +1 -1
- package/lib/esm/ExportGraphics.js.map +1 -1
- package/lib/esm/ExternalSource.js.map +1 -1
- package/lib/esm/FontFile.js.map +1 -1
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/GeometrySummary.js +47 -47
- package/lib/esm/GeometrySummary.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +8 -11
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelDbFonts.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IModelJsFs.js.map +1 -1
- package/lib/esm/ImageSourceConversion.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js +28 -4
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +6 -0
- package/lib/esm/LineStyle.d.ts.map +1 -1
- package/lib/esm/LineStyle.js +41 -32
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.d.ts +17 -10
- package/lib/esm/LocalHub.d.ts.map +1 -1
- package/lib/esm/LocalHub.js +128 -30
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/LocalhostIpcHost.js.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/NativeAppStorage.js.map +1 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/PromiseMemoizer.js.map +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/RpcBackend.js.map +1 -1
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/Schema.js.map +1 -1
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SchemaUtils.js.map +1 -1
- package/lib/esm/SheetIndex.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/SqliteStatement.js.map +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/FrameGeometry.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/core-backend.d.ts +2 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +2 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.js.map +1 -1
- package/lib/esm/domains/FunctionalSchema.js.map +1 -1
- package/lib/esm/domains/GenericElements.js.map +1 -1
- package/lib/esm/domains/GenericSchema.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/internal/FontFileImpl.js.map +1 -1
- package/lib/esm/internal/HubMock.js.map +1 -1
- package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NativePlatform.js.map +1 -1
- package/lib/esm/internal/NoLocks.js.map +1 -1
- package/lib/esm/internal/OnlineStatus.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js +104 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js +5 -2
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +57 -15
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/esm/rpc/multipart.js.map +1 -1
- package/lib/esm/rpc/tracing.js.map +1 -1
- package/lib/esm/rpc/web/logging.js.map +1 -1
- package/lib/esm/rpc/web/request.js.map +1 -1
- package/lib/esm/rpc/web/response.js.map +1 -1
- package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/esm/test/AdvancedEqual.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/AttachDb.test.js +11 -11
- package/lib/esm/test/AttachDb.test.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.js +23 -23
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/GeometryTestUtil.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js +64 -13
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/KnownTestLocations.js.map +1 -1
- package/lib/esm/test/PrintElementTree.js.map +1 -1
- package/lib/esm/test/PropertyDb.test.js.map +1 -1
- package/lib/esm/test/RevisionUtility.js.map +1 -1
- package/lib/esm/test/SchemaUtils.test.js +25 -25
- package/lib/esm/test/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +53 -53
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/categories/Category.test.js.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +88 -88
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +72 -72
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
- package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +62 -27
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +4 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +8 -0
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +22 -22
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +13 -13
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- package/lib/esm/test/element/UrlLink.test.js.map +1 -1
- package/lib/esm/test/font/FontFile.test.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +145 -145
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/imageData.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +44 -44
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js +13 -13
- package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/misc/DevTools.test.js.map +1 -1
- package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
- package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
- package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
- package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
- package/lib/esm/test/rpc/response.test.js.map +1 -1
- package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +135 -135
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js +177 -7
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
- package/lib/esm/test/standalone/Setting.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js +18 -0
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +160 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
- package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
- package/lib/esm/test/workspace/SettingsDb.test.js +465 -0
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
- package/lib/esm/workspace/Settings.d.ts +8 -0
- package/lib/esm/workspace/Settings.d.ts.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.d.ts +109 -0
- package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsDb.js +16 -0
- package/lib/esm/workspace/SettingsDb.js.map +1 -0
- package/lib/esm/workspace/SettingsEditor.d.ts +250 -0
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsEditor.js +50 -0
- package/lib/esm/workspace/SettingsEditor.js.map +1 -0
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +42 -19
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts +32 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js +19 -0
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +14 -14
package/lib/esm/LocalHub.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
import { join } from "path";
|
|
6
|
-
import { DbResult, IModelHubStatus, IModelStatus, OpenMode } from "@itwin/core-bentley";
|
|
6
|
+
import { assert, DbResult, IModelHubStatus, IModelStatus, OpenMode } from "@itwin/core-bentley";
|
|
7
7
|
import { BriefcaseIdValue, IModelError, LockState, } from "@itwin/core-common";
|
|
8
8
|
import { LockConflict } from "./BackendHubAccess";
|
|
9
9
|
import { BriefcaseManager } from "./BriefcaseManager";
|
|
@@ -37,11 +37,11 @@ export class LocalHub {
|
|
|
37
37
|
const db = this._hubDb = new SQLiteDb();
|
|
38
38
|
db.createDb(this.mockDbName);
|
|
39
39
|
db.executeSQL("CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)");
|
|
40
|
-
db.executeSQL("CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,uncompressedSize BIGINT,\
|
|
40
|
+
db.executeSQL("CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,uncompressedSize BIGINT,\
|
|
41
41
|
FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))");
|
|
42
42
|
db.executeSQL("CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)");
|
|
43
43
|
db.executeSQL("CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))");
|
|
44
|
-
db.executeSQL("CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,
|
|
44
|
+
db.executeSQL("CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastExclusiveReleaseChangesetIndex INTEGER,lastSharedReleaseChangesetIndex INTEGER,briefcaseId INTEGER)");
|
|
45
45
|
db.executeSQL("CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))");
|
|
46
46
|
db.executeSQL("CREATE INDEX LockIdx ON locks(briefcaseId)");
|
|
47
47
|
db.executeSQL("CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)");
|
|
@@ -380,21 +380,23 @@ export class LocalHub {
|
|
|
380
380
|
return locks;
|
|
381
381
|
}
|
|
382
382
|
queryLockStatus(elementId) {
|
|
383
|
-
return this.db.withPreparedSqliteStatement("SELECT
|
|
383
|
+
return this.db.withPreparedSqliteStatement("SELECT lastSharedReleaseChangesetIndex,lastExclusiveReleaseChangesetIndex,level,briefcaseId FROM locks WHERE id=?", (stmt) => {
|
|
384
384
|
stmt.bindId(1, elementId);
|
|
385
385
|
const rc = stmt.step();
|
|
386
386
|
if (DbResult.BE_SQLITE_ROW !== rc)
|
|
387
387
|
return { state: LockState.None };
|
|
388
|
-
const
|
|
388
|
+
const lastSharedCsVal = stmt.getValue(0);
|
|
389
|
+
const lastExclusiveCsVal = stmt.getValue(1);
|
|
389
390
|
const lock = {
|
|
390
|
-
|
|
391
|
-
|
|
391
|
+
lastSharedReleaseChangesetIndex: lastSharedCsVal.isNull ? undefined : lastSharedCsVal.getInteger(),
|
|
392
|
+
lastExclusiveReleaseChangesetIndex: lastExclusiveCsVal.isNull ? undefined : lastExclusiveCsVal.getInteger(),
|
|
393
|
+
state: stmt.getValueInteger(2),
|
|
392
394
|
};
|
|
393
395
|
switch (lock.state) {
|
|
394
396
|
case LockState.None:
|
|
395
397
|
return lock;
|
|
396
398
|
case LockState.Exclusive:
|
|
397
|
-
return { ...lock, briefcaseId: stmt.getValueInteger(
|
|
399
|
+
return { ...lock, briefcaseId: stmt.getValueInteger(3) };
|
|
398
400
|
case LockState.Shared:
|
|
399
401
|
return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };
|
|
400
402
|
default:
|
|
@@ -402,9 +404,37 @@ export class LocalHub {
|
|
|
402
404
|
}
|
|
403
405
|
});
|
|
404
406
|
}
|
|
407
|
+
doesBriefcaseRequirePullBeforeLock(currStatus, props, briefcase) {
|
|
408
|
+
if (props.state === LockState.None)
|
|
409
|
+
return false;
|
|
410
|
+
const briefcaseChangesetIndex = this.getIndexFromChangeset(briefcase.changeset);
|
|
411
|
+
const exclusiveIndexIsNewer = currStatus.lastExclusiveReleaseChangesetIndex !== undefined &&
|
|
412
|
+
currStatus.lastExclusiveReleaseChangesetIndex > briefcaseChangesetIndex;
|
|
413
|
+
if (props.state === LockState.Shared) {
|
|
414
|
+
// To acquire a shared lock, the briefcase must at least at the latest exclusive changeset index
|
|
415
|
+
return exclusiveIndexIsNewer;
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
assert(props.state === LockState.Exclusive);
|
|
419
|
+
const sharedIndexIsNewer = currStatus.lastSharedReleaseChangesetIndex !== undefined &&
|
|
420
|
+
currStatus.lastSharedReleaseChangesetIndex > briefcaseChangesetIndex;
|
|
421
|
+
// To acquire the exclusive lock the briefcase must be at least at the greater of the two last-indexes
|
|
422
|
+
return exclusiveIndexIsNewer || sharedIndexIsNewer;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
addSharedLockRecord(lockId, briefcaseId) {
|
|
426
|
+
this.db.withPreparedSqliteStatement("INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?) ON CONFLICT(lockId,briefcaseId) DO NOTHING", (stmt) => {
|
|
427
|
+
stmt.bindId(1, lockId);
|
|
428
|
+
stmt.bindInteger(2, briefcaseId);
|
|
429
|
+
const rc = stmt.step();
|
|
430
|
+
if (rc !== DbResult.BE_SQLITE_DONE)
|
|
431
|
+
throw new IModelError(rc, "cannot insert shared lock");
|
|
432
|
+
});
|
|
433
|
+
}
|
|
405
434
|
reserveLock(currStatus, props, briefcase) {
|
|
406
|
-
if (
|
|
435
|
+
if (this.doesBriefcaseRequirePullBeforeLock(currStatus, props, briefcase)) {
|
|
407
436
|
throw new IModelError(IModelHubStatus.PullIsRequired, "pull is required to obtain lock");
|
|
437
|
+
}
|
|
408
438
|
const wantShared = props.state === LockState.Shared;
|
|
409
439
|
if (wantShared && (currStatus.state === LockState.Exclusive))
|
|
410
440
|
throw new Error("cannot acquire shared lock because an exclusive lock is already held");
|
|
@@ -417,15 +447,26 @@ export class LocalHub {
|
|
|
417
447
|
throw new IModelError(rc, "cannot insert lock");
|
|
418
448
|
});
|
|
419
449
|
if (wantShared) {
|
|
420
|
-
this.
|
|
421
|
-
stmt.bindId(1, props.id);
|
|
422
|
-
stmt.bindInteger(2, briefcase.briefcaseId);
|
|
423
|
-
const rc = stmt.step();
|
|
424
|
-
if (rc !== DbResult.BE_SQLITE_DONE)
|
|
425
|
-
throw new IModelError(rc, "cannot insert shared lock");
|
|
426
|
-
});
|
|
450
|
+
this.addSharedLockRecord(props.id, briefcase.briefcaseId);
|
|
427
451
|
}
|
|
428
452
|
}
|
|
453
|
+
downgradeExclusiveLockToShared(lockId, briefcaseId) {
|
|
454
|
+
this.db.withPreparedSqliteStatement("UPDATE locks SET level=1,briefcaseId=NULL WHERE id=? AND briefcaseId=? AND level=2", (stmt) => {
|
|
455
|
+
stmt.bindId(1, lockId);
|
|
456
|
+
stmt.bindInteger(2, briefcaseId);
|
|
457
|
+
const rc = stmt.step();
|
|
458
|
+
if (rc !== DbResult.BE_SQLITE_DONE)
|
|
459
|
+
throw new IModelError(rc, "can't downgrade lock");
|
|
460
|
+
});
|
|
461
|
+
// Verify that the above actually updated a row. If it didn't, something has gone wrong with the downgrade.
|
|
462
|
+
// This shouldn't happen.
|
|
463
|
+
this.db.withPreparedSqliteStatement("SELECT CHANGES()", (stmt) => {
|
|
464
|
+
stmt.step();
|
|
465
|
+
if (stmt.getValueInteger(0) !== 1)
|
|
466
|
+
throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, "lock not held by this briefcase or lock is not exclusive");
|
|
467
|
+
});
|
|
468
|
+
this.addSharedLockRecord(lockId, briefcaseId);
|
|
469
|
+
}
|
|
429
470
|
clearLock(id) {
|
|
430
471
|
this.db.withPreparedSqliteStatement("UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?", (stmt) => {
|
|
431
472
|
stmt.bindId(1, id);
|
|
@@ -434,15 +475,26 @@ export class LocalHub {
|
|
|
434
475
|
throw new IModelError(rc, "can't release lock");
|
|
435
476
|
});
|
|
436
477
|
}
|
|
437
|
-
|
|
478
|
+
updateLockExclusiveChangeset(id, index) {
|
|
438
479
|
if (index <= 0)
|
|
439
480
|
return;
|
|
440
|
-
this.db.withPreparedSqliteStatement("UPDATE locks SET
|
|
481
|
+
this.db.withPreparedSqliteStatement("UPDATE locks SET lastExclusiveReleaseChangesetIndex=? WHERE id=?", (stmt) => {
|
|
441
482
|
stmt.bindInteger(1, index);
|
|
442
483
|
stmt.bindId(2, id);
|
|
443
484
|
const rc = stmt.step();
|
|
444
485
|
if (rc !== DbResult.BE_SQLITE_DONE)
|
|
445
|
-
throw new IModelError(rc, "can't update lock changeSetId");
|
|
486
|
+
throw new IModelError(rc, "can't update lock exclusive changeSetId");
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
updateLockSharedChangeset(id, index) {
|
|
490
|
+
if (index <= 0)
|
|
491
|
+
return;
|
|
492
|
+
this.db.withPreparedSqliteStatement("UPDATE locks SET lastSharedReleaseChangesetIndex=? WHERE id=?", (stmt) => {
|
|
493
|
+
stmt.bindInteger(1, index);
|
|
494
|
+
stmt.bindId(2, id);
|
|
495
|
+
const rc = stmt.step();
|
|
496
|
+
if (rc !== DbResult.BE_SQLITE_DONE)
|
|
497
|
+
throw new IModelError(rc, "can't update lock shared changeSetId");
|
|
446
498
|
});
|
|
447
499
|
}
|
|
448
500
|
requestLock(props, briefcase) {
|
|
@@ -482,23 +534,58 @@ export class LocalHub {
|
|
|
482
534
|
throw new IModelError(rc, "can't remove shared lock");
|
|
483
535
|
});
|
|
484
536
|
}
|
|
485
|
-
|
|
537
|
+
abandonLock(props, briefcase) {
|
|
538
|
+
// When abandoning (but not when releasing), props.state indicates which
|
|
539
|
+
// state we're abandoning _to_. Specifically, an Exclusive lock can be
|
|
540
|
+
// abandoned to either Shared or None.
|
|
541
|
+
// It makes no sense to abandon a lock _to_ the Exclusive state.
|
|
542
|
+
if (props.state === LockState.Exclusive)
|
|
543
|
+
throw new IModelError(IModelHubStatus.InvalidArgumentError, "must specify Shared or None when abandoning a lock");
|
|
486
544
|
const lockId = props.id;
|
|
487
|
-
const
|
|
488
|
-
switch (
|
|
545
|
+
const previousLockStatus = this.queryLockStatus(lockId);
|
|
546
|
+
switch (previousLockStatus.state) {
|
|
547
|
+
case LockState.None:
|
|
548
|
+
throw new IModelError(IModelHubStatus.LockDoesNotExist, "lock not held");
|
|
549
|
+
case LockState.Exclusive:
|
|
550
|
+
if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)
|
|
551
|
+
throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, "lock not held by this briefcase");
|
|
552
|
+
if (props.state === LockState.Shared) {
|
|
553
|
+
// Exclusive -> Shared
|
|
554
|
+
this.downgradeExclusiveLockToShared(lockId, briefcase.briefcaseId);
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
// Exclusive -> None
|
|
558
|
+
this.clearLock(lockId);
|
|
559
|
+
}
|
|
560
|
+
break;
|
|
561
|
+
case LockState.Shared:
|
|
562
|
+
if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))
|
|
563
|
+
throw new IModelError(IModelHubStatus.LockDoesNotExist, "shared lock not held by this briefcase");
|
|
564
|
+
this.removeSharedLock(lockId, briefcase.briefcaseId);
|
|
565
|
+
if (previousLockStatus.sharedBy.size === 1)
|
|
566
|
+
this.clearLock(lockId);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
releaseLock(props, briefcase) {
|
|
570
|
+
// Unlike abandonLock above, release always releases the lock all the way back to the None state.
|
|
571
|
+
// So we ignore props.state. There's no such thing as a "downgrade" here.
|
|
572
|
+
const lockId = props.id;
|
|
573
|
+
const previousLockStatus = this.queryLockStatus(lockId);
|
|
574
|
+
switch (previousLockStatus.state) {
|
|
489
575
|
case LockState.None:
|
|
490
576
|
throw new IModelError(IModelHubStatus.LockDoesNotExist, "lock not held");
|
|
491
577
|
case LockState.Exclusive:
|
|
492
|
-
if (
|
|
578
|
+
if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)
|
|
493
579
|
throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, "lock not held by this briefcase");
|
|
494
|
-
this.
|
|
580
|
+
this.updateLockExclusiveChangeset(lockId, briefcase.changesetIndex);
|
|
495
581
|
this.clearLock(lockId);
|
|
496
582
|
break;
|
|
497
583
|
case LockState.Shared:
|
|
498
|
-
if (!
|
|
584
|
+
if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))
|
|
499
585
|
throw new IModelError(IModelHubStatus.LockDoesNotExist, "shared lock not held by this briefcase");
|
|
500
|
-
this.
|
|
501
|
-
|
|
586
|
+
this.updateLockSharedChangeset(lockId, briefcase.changesetIndex);
|
|
587
|
+
this.removeSharedLock(lockId, briefcase.briefcaseId);
|
|
588
|
+
if (previousLockStatus.sharedBy.size === 1)
|
|
502
589
|
this.clearLock(lockId);
|
|
503
590
|
}
|
|
504
591
|
}
|
|
@@ -524,10 +611,20 @@ export class LocalHub {
|
|
|
524
611
|
this.releaseLock(props, arg);
|
|
525
612
|
this.db.saveChanges();
|
|
526
613
|
}
|
|
614
|
+
abandonLocks(locks, arg) {
|
|
615
|
+
for (const props of locks)
|
|
616
|
+
this.abandonLock({ id: props[0], state: props[1] }, arg);
|
|
617
|
+
this.db.saveChanges();
|
|
618
|
+
}
|
|
527
619
|
releaseAllLocks(arg) {
|
|
528
620
|
const locks = this.queryAllLocks(arg.briefcaseId);
|
|
529
621
|
this.releaseLocks(locks, arg);
|
|
530
622
|
}
|
|
623
|
+
abandonAllLocks(arg) {
|
|
624
|
+
const locks = new Map();
|
|
625
|
+
this.queryAllLocks(arg.briefcaseId).forEach(lock => locks.set(lock.id, LockState.None));
|
|
626
|
+
this.abandonLocks(locks, arg);
|
|
627
|
+
}
|
|
531
628
|
countTable(tableName) {
|
|
532
629
|
return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {
|
|
533
630
|
stmt.step();
|
|
@@ -550,13 +647,14 @@ export class LocalHub {
|
|
|
550
647
|
// for debugging
|
|
551
648
|
queryLocks() {
|
|
552
649
|
const locks = [];
|
|
553
|
-
this.db.withPreparedSqliteStatement("SELECT id,level,
|
|
650
|
+
this.db.withPreparedSqliteStatement("SELECT id,level,lastExclusiveReleaseChangesetIndex,lastSharedReleaseChangesetIndex,briefcaseId FROM locks", (stmt) => {
|
|
554
651
|
while (DbResult.BE_SQLITE_ROW === stmt.step())
|
|
555
652
|
locks.push({
|
|
556
653
|
id: stmt.getValueId(0),
|
|
557
654
|
level: stmt.getValueInteger(1),
|
|
558
|
-
|
|
559
|
-
|
|
655
|
+
lastExclusiveReleaseChangesetIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),
|
|
656
|
+
lastSharedReleaseChangesetIndex: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),
|
|
657
|
+
briefcaseId: stmt.getValue(4).isNull ? undefined : stmt.getValueInteger(4),
|
|
560
658
|
});
|
|
561
659
|
});
|
|
562
660
|
return locks;
|
package/lib/esm/LocalHub.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { join } from \"path\";\r\nimport { DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\r\n ChangesetRange, IModelError, LocalDirName, LocalFileName, LockState,\r\n} from \"@itwin/core-common\";\r\nimport { LockConflict, LockMap, LockProps } from \"./BackendHubAccess\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { SQLiteDb } from \"./SQLiteDb\";\r\n\r\n// cspell:ignore rowid\r\n\r\n/** @internal */\r\ninterface MockBriefcaseIdProps {\r\n id: BriefcaseId;\r\n user: string; // Just an AccessToken that simulates a user\r\n alias: string;\r\n assigned: boolean;\r\n}\r\n\r\n/** @internal */\r\ninterface LocalHubProps {\r\n readonly iTwinId: GuidString;\r\n readonly iModelId: GuidString;\r\n readonly iModelName: string;\r\n readonly description?: string;\r\n readonly version0?: string;\r\n readonly noLocks?: true;\r\n}\r\n\r\ninterface LocksEntry {\r\n id: Id64String;\r\n level: LockState;\r\n lastCsIndex?: ChangesetIndex;\r\n briefcaseId?: BriefcaseId;\r\n}\r\n\r\ninterface LockStatusNone {\r\n state: LockState.None;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusExclusive {\r\n state: LockState.Exclusive;\r\n briefcaseId: BriefcaseId;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusShared {\r\n state: LockState.Shared;\r\n sharedBy: Set<BriefcaseId>;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\ninterface BriefcaseIdAndChangeset {\r\n changeset: ChangesetIdWithIndex;\r\n briefcaseId: BriefcaseId;\r\n}\r\n\r\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\r\n\r\n/**\r\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\r\n * @internal\r\n */\r\nexport class LocalHub {\r\n public readonly iTwinId: GuidString;\r\n public readonly iModelId: GuidString;\r\n public readonly iModelName: string;\r\n public readonly description?: string;\r\n private _hubDb?: SQLiteDb;\r\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\r\n private _latestChangesetIndex = 0;\r\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\r\n\r\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\r\n this.iTwinId = arg.iTwinId;\r\n this.iModelId = arg.iModelId;\r\n this.iModelName = arg.iModelName;\r\n this.description = arg.description;\r\n\r\n this.cleanup();\r\n\r\n IModelJsFs.recursiveMkDirSync(this.rootDir);\r\n IModelJsFs.mkdirSync(this.changesetDir);\r\n IModelJsFs.mkdirSync(this.checkpointDir);\r\n\r\n const db = this._hubDb = new SQLiteDb();\r\n db.createDb(this.mockDbName);\r\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\r\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,uncompressedSize BIGINT,\\\r\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\r\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\r\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\r\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastCSetIndex INTEGER,briefcaseId INTEGER)\");\r\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\r\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\r\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\r\n db.saveChanges();\r\n\r\n const version0Root = `${rootDir}_version0`;\r\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\r\n\r\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\r\n IModelJsFs.recursiveMkDirSync(version0Root);\r\n IModelJsFs.removeSync(version0);\r\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\r\n }\r\n\r\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\r\n if (!arg.version0)\r\n IModelJsFs.removeSync(version0);\r\n\r\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\r\n try {\r\n nativeDb.setITwinId(this.iTwinId);\r\n nativeDb.setIModelId(this.iModelId);\r\n nativeDb.saveChanges();\r\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\r\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\r\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\r\n nativeDb.saveChanges();\r\n } finally {\r\n nativeDb.closeFile();\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\r\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\r\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\r\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\r\n\r\n /** Acquire the next available briefcaseId and assign it to the supplied user */\r\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\r\n const db = this.db;\r\n const newId = this._nextBriefcaseId++;\r\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, newId);\r\n stmt.bindString(2, user);\r\n stmt.bindString(3, alias ?? `${user} (${newId})`);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\r\n });\r\n db.saveChanges();\r\n return newId;\r\n }\r\n\r\n /** Release a briefcaseId */\r\n public releaseBriefcaseId(id: BriefcaseId) {\r\n const db = this.db;\r\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\r\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Get an array of all of the currently assigned Briefcases */\r\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\r\n const briefcases: MockBriefcaseIdProps[] = [];\r\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\r\n if (onlyAssigned)\r\n sql += \" WHERE assigned=1\";\r\n\r\n this.db.withSqliteStatement(sql, (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n briefcases.push({\r\n id: stmt.getValueInteger(0),\r\n user: stmt.getValueString(1),\r\n alias: stmt.getValueString(2),\r\n assigned: stmt.getValueInteger(3) !== 0,\r\n });\r\n }\r\n });\r\n return briefcases;\r\n }\r\n\r\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\r\n public getBriefcaseIds(user: string): BriefcaseId[] {\r\n const briefcases: BriefcaseId[] = [];\r\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\r\n stmt.bindString(1, user);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.push(stmt.getValueInteger(0));\r\n });\r\n return briefcases;\r\n }\r\n\r\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\r\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\r\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\r\n });\r\n }\r\n\r\n private getChangesetFileName(index: ChangesetIndex) {\r\n return join(this.changesetDir, `changeset-${index}`);\r\n }\r\n\r\n /** Add a changeset to the timeline\r\n * @return the changesetIndex of the added changeset\r\n */\r\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\r\n const stats = IModelJsFs.lstatSync(changeset.pathname);\r\n if (!stats)\r\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\r\n\r\n const parentIndex = this.getChangesetById(changeset.parentId).index;\r\n if (parentIndex !== this.latestChangesetIndex)\r\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\r\n\r\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\r\n const db = this.db;\r\n changeset.index = this._latestChangesetIndex + 1;\r\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId,uncompressedSize) VALUES (?,?,?,?,?,?,?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, changeset.index);\r\n stmt.bindString(2, changeset.id);\r\n stmt.bindString(3, changeset.description);\r\n stmt.bindInteger(4, stats.size);\r\n stmt.bindInteger(5, changeset.changesType ?? 0);\r\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\r\n stmt.bindString(7, changeset.userCreated ?? \"\");\r\n stmt.bindInteger(8, changeset.briefcaseId);\r\n stmt.bindInteger(9, changeset.uncompressedSize ?? 0);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert changeset into mock db\");\r\n });\r\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\r\n db.saveChanges();\r\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\r\n return changeset.index;\r\n }\r\n\r\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\r\n return changeset.index ?? this.getChangesetIndex(changeset.id);\r\n }\r\n\r\n /** Get the index of a changeset by its Id */\r\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\r\n if (id === \"\")\r\n return 0;\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\r\n stmt.bindString(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset ${id} not found`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its Id */\r\n public getChangesetById(id: ChangesetId): ChangesetProps {\r\n return this.getChangesetByIndex(this.getChangesetIndex(id));\r\n }\r\n\r\n public getPreviousIndex(index: ChangesetIndex) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `cannot get previous index`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n public getParentId(index: ChangesetIndex): ChangesetId {\r\n if (index === 0)\r\n return \"\";\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, this.getPreviousIndex(index));\r\n stmt.step();\r\n return stmt.getValueString(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its index */\r\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\r\n if (index <= 0)\r\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0, size: 0, uncompressedSize: 0 };\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId,uncompressedSize FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset at index ${index} not found`);\r\n\r\n return {\r\n description: stmt.getValueString(0),\r\n size: stmt.getValueDouble(1),\r\n changesType: stmt.getValueInteger(2),\r\n pushDate: stmt.getValueString(3),\r\n userCreated: stmt.getValueString(4),\r\n id: stmt.getValueString(5),\r\n briefcaseId: stmt.getValueInteger(6),\r\n index,\r\n parentId: this.getParentId(index),\r\n uncompressedSize: stmt.getValueInteger(7),\r\n };\r\n });\r\n }\r\n\r\n public getLatestChangeset(): ChangesetProps {\r\n return this.getChangesetByIndex(this.latestChangesetIndex);\r\n }\r\n\r\n public getChangesetId(index: ChangesetIndex): ChangesetId {\r\n return this.getChangesetByIndex(index).id;\r\n }\r\n\r\n /** Get an array of changesets starting with first to last, by index */\r\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\r\n const changesets: ChangesetProps[] = [];\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\r\n });\r\n return changesets;\r\n }\r\n\r\n /** Name a version */\r\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\r\n stmt.bindString(1, arg.versionName);\r\n stmt.bindInteger(2, arg.csIndex);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Delete a named version */\r\n public deleteNamedVersion(versionName: string) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't delete named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** find the changeset for a named version */\r\n public findNamedVersion(versionName: string): ChangesetProps {\r\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\r\n return stmt.getValueInteger(0);\r\n });\r\n return this.getChangesetByIndex(index);\r\n }\r\n\r\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\r\n return `checkpoint-${csIndex}`;\r\n }\r\n\r\n /** \"upload\" a checkpoint */\r\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\r\n stmt.bindInteger(1, arg.changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== res)\r\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\r\n });\r\n db.saveChanges();\r\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\r\n IModelJsFs.copySync(arg.localFile, outName);\r\n return outName;\r\n }\r\n\r\n /** Get an array of the indexes for a range of checkpoints */\r\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n const checkpoints: ChangesetIndex[] = [];\r\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n checkpoints.push(stmt.getValueInteger(0));\r\n\r\n });\r\n return checkpoints;\r\n }\r\n\r\n /** Find the checkpoint that is no newer than a changesetIndex */\r\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\r\n if (changesetIndex <= 0)\r\n return 0;\r\n\r\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\r\n stmt.bindInteger(1, changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== res)\r\n throw new IModelError(res, \"can't get previous checkpoint\");\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** \"download\" a checkpoint */\r\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\r\n const index = this.getIndexFromChangeset(arg.changeset);\r\n const prev = this.queryPreviousCheckpoint(index);\r\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\r\n const changeset = this.getChangesetByIndex(index);\r\n return { index, id: changeset.id };\r\n }\r\n\r\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\r\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\r\n return arg;\r\n }\r\n\r\n /** \"download\" a changeset */\r\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\r\n const cs = this.getChangesetByIndex(arg.index);\r\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\r\n return this.copyChangeset(csProps);\r\n }\r\n\r\n /** \"download\" all the changesets in a given range */\r\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\r\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\r\n for (const cs of cSets) {\r\n cs.pathname = join(arg.targetDir, cs.id);\r\n this.copyChangeset(cs);\r\n }\r\n return cSets;\r\n }\r\n\r\n private querySharedLockHolders(elementId: Id64String) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const briefcases = new Set<BriefcaseId>();\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.add(stmt.getValueInteger(0));\r\n return briefcases;\r\n });\r\n }\r\n\r\n public queryAllLocks(briefcaseId: BriefcaseId) {\r\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\r\n const locks: LockProps[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\r\n });\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\r\n });\r\n return locks;\r\n }\r\n\r\n public queryLockStatus(elementId: Id64String): LockStatus {\r\n return this.db.withPreparedSqliteStatement(\"SELECT lastCSetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n return { state: LockState.None };\r\n const lastCsVal = stmt.getValue(0);\r\n const lock = {\r\n lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),\r\n state: stmt.getValueInteger(1),\r\n };\r\n switch (lock.state) {\r\n case LockState.None:\r\n return lock;\r\n case LockState.Exclusive:\r\n return { ...lock, briefcaseId: stmt.getValueInteger(2) };\r\n case LockState.Shared:\r\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\r\n default:\r\n throw new Error(\"illegal lock state\");\r\n }\r\n });\r\n }\r\n\r\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))\r\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\r\n\r\n const wantShared = props.state === LockState.Shared;\r\n if (wantShared && (currStatus.state === LockState.Exclusive))\r\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\r\n\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, props.state);\r\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert lock\");\r\n });\r\n\r\n if (wantShared) {\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert shared lock\");\r\n });\r\n }\r\n }\r\n\r\n private clearLock(id: Id64String) {\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't release lock\");\r\n });\r\n }\r\n\r\n private updateLockChangeset(id: Id64String, index: ChangesetIndex) {\r\n if (index <= 0)\r\n return;\r\n\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastCSetIndex=? WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n stmt.bindId(2, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't update lock changeSetId\");\r\n });\r\n }\r\n\r\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.None)\r\n throw new Error(\"cannot request lock for LockState.None\");\r\n\r\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\r\n\r\n const lockStatus = this.queryLockStatus(props.id);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n return this.reserveLock(lockStatus, props, briefcase);\r\n\r\n case LockState.Shared:\r\n if (props.state === LockState.Shared) {\r\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\r\n this.reserveLock(lockStatus, props, briefcase);\r\n } else {\r\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\r\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\r\n const id = lockStatus.sharedBy.values().next().value!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\r\n }\r\n this.removeSharedLock(props.id, briefcase.briefcaseId);\r\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\r\n }\r\n return;\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\r\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\r\n }\r\n }\r\n\r\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\r\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\r\n stmt.bindId(1, lockId);\r\n stmt.bindInteger(2, briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't remove shared lock\");\r\n });\r\n }\r\n\r\n private releaseLock(props: LockProps, arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const lockId = props.id;\r\n const lockStatus = this.queryLockStatus(lockId);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== arg.briefcaseId)\r\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\r\n this.updateLockChangeset(lockId, arg.changesetIndex);\r\n this.clearLock(lockId);\r\n break;\r\n\r\n case LockState.Shared:\r\n if (!lockStatus.sharedBy.has(arg.briefcaseId))\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\r\n this.removeSharedLock(lockId, arg.briefcaseId);\r\n if (lockStatus.sharedBy.size === 1)\r\n this.clearLock(lockId);\r\n }\r\n }\r\n\r\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\r\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\r\n try {\r\n for (const lock of locks)\r\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\r\n this.db.saveChanges(); // only after all locks have been acquired\r\n } catch (err) {\r\n this.db.abandonChanges(); // abandon all locks that may have been acquired\r\n throw err;\r\n }\r\n }\r\n\r\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n const locks = new Map<Id64String, LockState>();\r\n locks.set(props.id, props.state);\r\n this.acquireLocks(locks, briefcase);\r\n }\r\n\r\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n for (const props of locks)\r\n this.releaseLock(props, arg);\r\n this.db.saveChanges();\r\n }\r\n\r\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const locks = this.queryAllLocks(arg.briefcaseId);\r\n this.releaseLocks(locks, arg);\r\n }\r\n\r\n private countTable(tableName: string): number {\r\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\r\n stmt.step();\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n // for debugging\r\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\r\n // for debugging\r\n public countLocks(): number { return this.countTable(\"locks\"); }\r\n\r\n // for debugging\r\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\r\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\r\n });\r\n return locks;\r\n }\r\n\r\n // for debugging\r\n public queryLocks(): LocksEntry[] {\r\n const locks: LocksEntry[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastCSetIndex,briefcaseId FROM locks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({\r\n id: stmt.getValueId(0),\r\n level: stmt.getValueInteger(1),\r\n lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\r\n briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\r\n });\r\n });\r\n return locks;\r\n }\r\n\r\n public removeDir(dirName: string) {\r\n if (IModelJsFs.existsSync(dirName)) {\r\n IModelJsFs.purgeDirSync(dirName);\r\n IModelJsFs.rmdirSync(dirName);\r\n }\r\n\r\n }\r\n public cleanup() {\r\n if (this._hubDb) {\r\n this._hubDb.closeDb();\r\n this._hubDb = undefined;\r\n }\r\n try {\r\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\r\n this.removeDir(this.rootDir);\r\n } catch {\r\n // eslint-disable-next-line no-console\r\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { join } from \"path\";\nimport { assert, DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\nimport {\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\n ChangesetRange, IModelError, LocalDirName, LocalFileName, LockState,\n} from \"@itwin/core-common\";\nimport { BriefcaseIdArg, LockConflict, LockMap, LockProps } from \"./BackendHubAccess\";\nimport { BriefcaseManager } from \"./BriefcaseManager\";\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\nimport { IModelJsFs } from \"./IModelJsFs\";\nimport { SQLiteDb } from \"./SQLiteDb\";\n\n// cspell:ignore rowid\n\n/** @internal */\ninterface MockBriefcaseIdProps {\n id: BriefcaseId;\n user: string; // Just an AccessToken that simulates a user\n alias: string;\n assigned: boolean;\n}\n\n/** @internal */\ninterface LocalHubProps {\n readonly iTwinId: GuidString;\n readonly iModelId: GuidString;\n readonly iModelName: string;\n readonly description?: string;\n readonly version0?: string;\n readonly noLocks?: true;\n}\n\ninterface LockLastReleaseChangesetIndices {\n lastExclusiveReleaseChangesetIndex?: ChangesetIndex;\n lastSharedReleaseChangesetIndex?: ChangesetIndex;\n}\n\ninterface LocksEntry extends LockLastReleaseChangesetIndices {\n id: Id64String;\n level: LockState;\n briefcaseId?: BriefcaseId;\n}\n\ninterface LockStatusNone extends LockLastReleaseChangesetIndices {\n state: LockState.None;\n}\n\n/** @internal exported for tests. */\nexport interface LockStatusExclusive extends LockLastReleaseChangesetIndices {\n state: LockState.Exclusive;\n briefcaseId: BriefcaseId;\n}\n\n/** @internal exported for tests. */\nexport interface LockStatusShared extends LockLastReleaseChangesetIndices {\n state: LockState.Shared;\n sharedBy: Set<BriefcaseId>;\n}\n\ninterface BriefcaseIdAndChangeset {\n changeset: ChangesetIdWithIndex;\n briefcaseId: BriefcaseId;\n}\n\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\n\n/**\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\n * @internal\n */\nexport class LocalHub {\n public readonly iTwinId: GuidString;\n public readonly iModelId: GuidString;\n public readonly iModelName: string;\n public readonly description?: string;\n private _hubDb?: SQLiteDb;\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\n private _latestChangesetIndex = 0;\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\n\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\n this.iTwinId = arg.iTwinId;\n this.iModelId = arg.iModelId;\n this.iModelName = arg.iModelName;\n this.description = arg.description;\n\n this.cleanup();\n\n IModelJsFs.recursiveMkDirSync(this.rootDir);\n IModelJsFs.mkdirSync(this.changesetDir);\n IModelJsFs.mkdirSync(this.checkpointDir);\n\n const db = this._hubDb = new SQLiteDb();\n db.createDb(this.mockDbName);\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,uncompressedSize BIGINT,\\\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastExclusiveReleaseChangesetIndex INTEGER,lastSharedReleaseChangesetIndex INTEGER,briefcaseId INTEGER)\");\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\n db.saveChanges();\n\n const version0Root = `${rootDir}_version0`;\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\n\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\n IModelJsFs.recursiveMkDirSync(version0Root);\n IModelJsFs.removeSync(version0);\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\n }\n\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\n if (!arg.version0)\n IModelJsFs.removeSync(version0);\n\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\n try {\n nativeDb.setITwinId(this.iTwinId);\n nativeDb.setIModelId(this.iModelId);\n nativeDb.saveChanges();\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\n nativeDb.saveChanges();\n } finally {\n nativeDb.closeFile();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\n\n /** Acquire the next available briefcaseId and assign it to the supplied user */\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\n const db = this.db;\n const newId = this._nextBriefcaseId++;\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\n stmt.bindInteger(1, newId);\n stmt.bindString(2, user);\n stmt.bindString(3, alias ?? `${user} (${newId})`);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\n });\n db.saveChanges();\n return newId;\n }\n\n /** Release a briefcaseId */\n public releaseBriefcaseId(id: BriefcaseId) {\n const db = this.db;\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, id);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\n });\n db.saveChanges();\n }\n\n /** Get an array of all of the currently assigned Briefcases */\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\n const briefcases: MockBriefcaseIdProps[] = [];\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\n if (onlyAssigned)\n sql += \" WHERE assigned=1\";\n\n this.db.withSqliteStatement(sql, (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n briefcases.push({\n id: stmt.getValueInteger(0),\n user: stmt.getValueString(1),\n alias: stmt.getValueString(2),\n assigned: stmt.getValueInteger(3) !== 0,\n });\n }\n });\n return briefcases;\n }\n\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\n public getBriefcaseIds(user: string): BriefcaseId[] {\n const briefcases: BriefcaseId[] = [];\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\n stmt.bindString(1, user);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n briefcases.push(stmt.getValueInteger(0));\n });\n return briefcases;\n }\n\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, id);\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\n });\n }\n\n private getChangesetFileName(index: ChangesetIndex) {\n return join(this.changesetDir, `changeset-${index}`);\n }\n\n /** Add a changeset to the timeline\n * @return the changesetIndex of the added changeset\n */\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\n const stats = IModelJsFs.lstatSync(changeset.pathname);\n if (!stats)\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\n\n const parentIndex = this.getChangesetById(changeset.parentId).index;\n if (parentIndex !== this.latestChangesetIndex)\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\n\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\n const db = this.db;\n changeset.index = this._latestChangesetIndex + 1;\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId,uncompressedSize) VALUES (?,?,?,?,?,?,?,?,?)\", (stmt) => {\n stmt.bindInteger(1, changeset.index);\n stmt.bindString(2, changeset.id);\n stmt.bindString(3, changeset.description);\n stmt.bindInteger(4, stats.size);\n stmt.bindInteger(5, changeset.changesType ?? 0);\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\n stmt.bindString(7, changeset.userCreated ?? \"\");\n stmt.bindInteger(8, changeset.briefcaseId);\n stmt.bindInteger(9, changeset.uncompressedSize ?? 0);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert changeset into mock db\");\n });\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\n db.saveChanges();\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\n return changeset.index;\n }\n\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\n return changeset.index ?? this.getChangesetIndex(changeset.id);\n }\n\n /** Get the index of a changeset by its Id */\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\n if (id === \"\")\n return 0;\n\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\n stmt.bindString(1, id);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `changeset ${id} not found`);\n\n return stmt.getValueInteger(0);\n });\n }\n\n /** Get the properties of a changeset by its Id */\n public getChangesetById(id: ChangesetId): ChangesetProps {\n return this.getChangesetByIndex(this.getChangesetIndex(id));\n }\n\n public getPreviousIndex(index: ChangesetIndex) {\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\n stmt.bindInteger(1, index);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `cannot get previous index`);\n\n return stmt.getValueInteger(0);\n });\n }\n\n public getParentId(index: ChangesetIndex): ChangesetId {\n if (index === 0)\n return \"\";\n\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\n stmt.bindInteger(1, this.getPreviousIndex(index));\n stmt.step();\n return stmt.getValueString(0);\n });\n }\n\n /** Get the properties of a changeset by its index */\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\n if (index <= 0)\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0, size: 0, uncompressedSize: 0 };\n\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId,uncompressedSize FROM timeline WHERE csIndex=?\", (stmt) => {\n stmt.bindInteger(1, index);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `changeset at index ${index} not found`);\n\n return {\n description: stmt.getValueString(0),\n size: stmt.getValueDouble(1),\n changesType: stmt.getValueInteger(2),\n pushDate: stmt.getValueString(3),\n userCreated: stmt.getValueString(4),\n id: stmt.getValueString(5),\n briefcaseId: stmt.getValueInteger(6),\n index,\n parentId: this.getParentId(index),\n uncompressedSize: stmt.getValueInteger(7),\n };\n });\n }\n\n public getLatestChangeset(): ChangesetProps {\n return this.getChangesetByIndex(this.latestChangesetIndex);\n }\n\n public getChangesetId(index: ChangesetIndex): ChangesetId {\n return this.getChangesetByIndex(index).id;\n }\n\n /** Get an array of changesets starting with first to last, by index */\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\n const changesets: ChangesetProps[] = [];\n const first = range?.first ?? 0;\n const last = range?.end ?? this.latestChangesetIndex;\n\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\n stmt.bindInteger(1, first);\n stmt.bindInteger(2, last);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\n });\n return changesets;\n }\n\n /** Name a version */\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\n const db = this.db;\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\n stmt.bindString(1, arg.versionName);\n stmt.bindInteger(2, arg.csIndex);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert named version\");\n });\n db.saveChanges();\n }\n\n /** Delete a named version */\n public deleteNamedVersion(versionName: string) {\n const db = this.db;\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\n stmt.bindString(1, versionName);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't delete named version\");\n });\n db.saveChanges();\n }\n\n /** find the changeset for a named version */\n public findNamedVersion(versionName: string): ChangesetProps {\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\n stmt.bindString(1, versionName);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\n return stmt.getValueInteger(0);\n });\n return this.getChangesetByIndex(index);\n }\n\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\n return `checkpoint-${csIndex}`;\n }\n\n /** \"upload\" a checkpoint */\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\n const db = this.db;\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\n stmt.bindInteger(1, arg.changesetIndex);\n const res = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== res)\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\n });\n db.saveChanges();\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\n IModelJsFs.copySync(arg.localFile, outName);\n return outName;\n }\n\n /** Get an array of the indexes for a range of checkpoints */\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\n const first = range?.first ?? 0;\n const last = range?.end ?? this.latestChangesetIndex;\n\n const checkpoints: ChangesetIndex[] = [];\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\n stmt.bindInteger(1, first);\n stmt.bindInteger(2, last);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n checkpoints.push(stmt.getValueInteger(0));\n\n });\n return checkpoints;\n }\n\n /** Find the checkpoint that is no newer than a changesetIndex */\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\n if (changesetIndex <= 0)\n return 0;\n\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\n stmt.bindInteger(1, changesetIndex);\n const res = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== res)\n throw new IModelError(res, \"can't get previous checkpoint\");\n return stmt.getValueInteger(0);\n });\n }\n\n /** \"download\" a checkpoint */\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\n const index = this.getIndexFromChangeset(arg.changeset);\n const prev = this.queryPreviousCheckpoint(index);\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\n const changeset = this.getChangesetByIndex(index);\n return { index, id: changeset.id };\n }\n\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\n return arg;\n }\n\n /** \"download\" a changeset */\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\n const cs = this.getChangesetByIndex(arg.index);\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\n return this.copyChangeset(csProps);\n }\n\n /** \"download\" all the changesets in a given range */\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\n for (const cs of cSets) {\n cs.pathname = join(arg.targetDir, cs.id);\n this.copyChangeset(cs);\n }\n return cSets;\n }\n\n private querySharedLockHolders(elementId: Id64String) {\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\n stmt.bindId(1, elementId);\n const briefcases = new Set<BriefcaseId>();\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n briefcases.add(stmt.getValueInteger(0));\n return briefcases;\n });\n }\n\n public queryAllLocks(briefcaseId: BriefcaseId) {\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\n const locks: LockProps[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\n stmt.bindInteger(1, briefcaseId);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\n });\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\n stmt.bindInteger(1, briefcaseId);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\n });\n return locks;\n }\n\n public queryLockStatus(elementId: Id64String): LockStatus {\n return this.db.withPreparedSqliteStatement(\"SELECT lastSharedReleaseChangesetIndex,lastExclusiveReleaseChangesetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\n stmt.bindId(1, elementId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n return { state: LockState.None };\n const lastSharedCsVal = stmt.getValue(0);\n const lastExclusiveCsVal = stmt.getValue(1);\n const lock = {\n lastSharedReleaseChangesetIndex: lastSharedCsVal.isNull ? undefined : lastSharedCsVal.getInteger(),\n lastExclusiveReleaseChangesetIndex: lastExclusiveCsVal.isNull ? undefined : lastExclusiveCsVal.getInteger(),\n state: stmt.getValueInteger(2),\n };\n switch (lock.state) {\n case LockState.None:\n return lock;\n case LockState.Exclusive:\n return { ...lock, briefcaseId: stmt.getValueInteger(3) };\n case LockState.Shared:\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\n default:\n throw new Error(\"illegal lock state\");\n }\n });\n }\n\n private doesBriefcaseRequirePullBeforeLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset): boolean {\n if (props.state === LockState.None)\n return false;\n\n const briefcaseChangesetIndex = this.getIndexFromChangeset(briefcase.changeset);\n const exclusiveIndexIsNewer = currStatus.lastExclusiveReleaseChangesetIndex !== undefined &&\n currStatus.lastExclusiveReleaseChangesetIndex > briefcaseChangesetIndex;\n\n if (props.state === LockState.Shared) {\n // To acquire a shared lock, the briefcase must at least at the latest exclusive changeset index\n return exclusiveIndexIsNewer;\n } else {\n assert(props.state === LockState.Exclusive);\n\n const sharedIndexIsNewer = currStatus.lastSharedReleaseChangesetIndex !== undefined &&\n currStatus.lastSharedReleaseChangesetIndex > briefcaseChangesetIndex;\n\n // To acquire the exclusive lock the briefcase must be at least at the greater of the two last-indexes\n return exclusiveIndexIsNewer || sharedIndexIsNewer;\n }\n }\n\n private addSharedLockRecord(lockId: Id64String, briefcaseId: BriefcaseId) {\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?) ON CONFLICT(lockId,briefcaseId) DO NOTHING\", (stmt) => {\n stmt.bindId(1, lockId);\n stmt.bindInteger(2, briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"cannot insert shared lock\");\n });\n }\n\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n if (this.doesBriefcaseRequirePullBeforeLock(currStatus, props, briefcase)) {\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\n }\n\n const wantShared = props.state === LockState.Shared;\n if (wantShared && (currStatus.state === LockState.Exclusive))\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\n\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\n stmt.bindId(1, props.id);\n stmt.bindInteger(2, props.state);\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"cannot insert lock\");\n });\n\n if (wantShared) {\n this.addSharedLockRecord(props.id, briefcase.briefcaseId);\n }\n }\n\n private downgradeExclusiveLockToShared(lockId: Id64String, briefcaseId: BriefcaseId) {\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=1,briefcaseId=NULL WHERE id=? AND briefcaseId=? AND level=2\", (stmt) => {\n stmt.bindId(1, lockId);\n stmt.bindInteger(2, briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't downgrade lock\");\n });\n\n // Verify that the above actually updated a row. If it didn't, something has gone wrong with the downgrade.\n // This shouldn't happen.\n this.db.withPreparedSqliteStatement(\"SELECT CHANGES()\", (stmt) => {\n stmt.step();\n if (stmt.getValueInteger(0) !== 1)\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase or lock is not exclusive\");\n });\n\n this.addSharedLockRecord(lockId, briefcaseId);\n }\n\n private clearLock(id: Id64String) {\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\n stmt.bindId(1, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't release lock\");\n });\n }\n\n private updateLockExclusiveChangeset(id: Id64String, index: ChangesetIndex) {\n if (index <= 0)\n return;\n\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastExclusiveReleaseChangesetIndex=? WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, index);\n stmt.bindId(2, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't update lock exclusive changeSetId\");\n });\n }\n\n private updateLockSharedChangeset(id: Id64String, index: ChangesetIndex) {\n if (index <= 0)\n return;\n\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastSharedReleaseChangesetIndex=? WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, index);\n stmt.bindId(2, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't update lock shared changeSetId\");\n });\n }\n\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n if (props.state === LockState.None)\n throw new Error(\"cannot request lock for LockState.None\");\n\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\n\n const lockStatus = this.queryLockStatus(props.id);\n switch (lockStatus.state) {\n case LockState.None:\n return this.reserveLock(lockStatus, props, briefcase);\n\n case LockState.Shared:\n if (props.state === LockState.Shared) {\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\n this.reserveLock(lockStatus, props, briefcase);\n } else {\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\n const id = lockStatus.sharedBy.values().next().value!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\n }\n this.removeSharedLock(props.id, briefcase.briefcaseId);\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\n }\n return;\n\n case LockState.Exclusive:\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\n }\n }\n\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\n stmt.bindId(1, lockId);\n stmt.bindInteger(2, briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't remove shared lock\");\n });\n }\n\n private abandonLock(props: LockProps, briefcase: BriefcaseIdArg) {\n // When abandoning (but not when releasing), props.state indicates which\n // state we're abandoning _to_. Specifically, an Exclusive lock can be\n // abandoned to either Shared or None.\n\n // It makes no sense to abandon a lock _to_ the Exclusive state.\n if (props.state === LockState.Exclusive)\n throw new IModelError(IModelHubStatus.InvalidArgumentError, \"must specify Shared or None when abandoning a lock\");\n\n const lockId = props.id;\n const previousLockStatus = this.queryLockStatus(lockId);\n switch (previousLockStatus.state) {\n case LockState.None:\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\n\n case LockState.Exclusive:\n if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\n if (props.state === LockState.Shared) {\n // Exclusive -> Shared\n this.downgradeExclusiveLockToShared(lockId, briefcase.briefcaseId);\n } else {\n // Exclusive -> None\n this.clearLock(lockId);\n }\n break;\n\n case LockState.Shared:\n if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\n this.removeSharedLock(lockId, briefcase.briefcaseId);\n if (previousLockStatus.sharedBy.size === 1)\n this.clearLock(lockId);\n }\n }\n\n private releaseLock(props: LockProps, briefcase: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n // Unlike abandonLock above, release always releases the lock all the way back to the None state.\n // So we ignore props.state. There's no such thing as a \"downgrade\" here.\n\n const lockId = props.id;\n const previousLockStatus = this.queryLockStatus(lockId);\n switch (previousLockStatus.state) {\n case LockState.None:\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\n\n case LockState.Exclusive:\n if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\n this.updateLockExclusiveChangeset(lockId, briefcase.changesetIndex);\n this.clearLock(lockId);\n break;\n\n case LockState.Shared:\n if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\n this.updateLockSharedChangeset(lockId, briefcase.changesetIndex);\n this.removeSharedLock(lockId, briefcase.briefcaseId);\n if (previousLockStatus.sharedBy.size === 1)\n this.clearLock(lockId);\n }\n }\n\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\n try {\n for (const lock of locks)\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\n this.db.saveChanges(); // only after all locks have been acquired\n } catch (err) {\n this.db.abandonChanges(); // abandon all locks that may have been acquired\n throw err;\n }\n }\n\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n const locks = new Map<Id64String, LockState>();\n locks.set(props.id, props.state);\n this.acquireLocks(locks, briefcase);\n }\n\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n for (const props of locks)\n this.releaseLock(props, arg);\n this.db.saveChanges();\n }\n\n public abandonLocks(locks: LockMap, arg: BriefcaseIdArg) {\n for (const props of locks)\n this.abandonLock({ id: props[0], state: props[1] }, arg);\n this.db.saveChanges();\n }\n\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n const locks = this.queryAllLocks(arg.briefcaseId);\n this.releaseLocks(locks, arg);\n }\n\n public abandonAllLocks(arg: BriefcaseIdArg) {\n const locks = new Map<Id64String, LockState>();\n this.queryAllLocks(arg.briefcaseId).forEach(lock => locks.set(lock.id, LockState.None));\n this.abandonLocks(locks, arg);\n }\n\n private countTable(tableName: string): number {\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\n stmt.step();\n return stmt.getValueInteger(0);\n });\n }\n\n // for debugging\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\n // for debugging\n public countLocks(): number { return this.countTable(\"locks\"); }\n\n // for debugging\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\n });\n return locks;\n }\n\n // for debugging\n public queryLocks(): LocksEntry[] {\n const locks: LocksEntry[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastExclusiveReleaseChangesetIndex,lastSharedReleaseChangesetIndex,briefcaseId FROM locks\", (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({\n id: stmt.getValueId(0),\n level: stmt.getValueInteger(1),\n lastExclusiveReleaseChangesetIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\n lastSharedReleaseChangesetIndex: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\n briefcaseId: stmt.getValue(4).isNull ? undefined : stmt.getValueInteger(4),\n });\n });\n return locks;\n }\n\n public removeDir(dirName: string) {\n if (IModelJsFs.existsSync(dirName)) {\n IModelJsFs.purgeDirSync(dirName);\n IModelJsFs.rmdirSync(dirName);\n }\n\n }\n public cleanup() {\n if (this._hubDb) {\n this._hubDb.closeDb();\n this._hubDb = undefined;\n }\n try {\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\n this.removeDir(this.rootDir);\n } catch {\n // eslint-disable-next-line no-console\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalhostIpcHost.js","sourceRoot":"","sources":["../../src/LocalhostIpcHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\
|
|
1
|
+
{"version":3,"file":"LocalhostIpcHost.js","sourceRoot":"","sources":["../../src/LocalhostIpcHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module IModelHost\n */\n\nimport * as ws from \"ws\";\nimport {\n InterceptedRpcRequest, IpcWebSocket, IpcWebSocketBackend, IpcWebSocketMessage, IpcWebSocketTransport, rpcOverIpcStrings, RpcSessionInvocation,\n} from \"@itwin/core-common\";\nimport { IModelHostOptions } from \"./IModelHost\";\nimport { IpcHandler, IpcHost } from \"./IpcHost\";\n\n/** @internal */\nexport interface LocalhostIpcHostOpts {\n socketPort?: number;\n host?: string;\n noServer?: boolean;\n}\n\nclass LocalTransport extends IpcWebSocketTransport {\n private _server: ws.Server | undefined;\n private _connections: Map<ws, number> = new Map();\n\n public constructor(opts: LocalhostIpcHostOpts) {\n super();\n\n if (!opts.noServer) {\n this._server = new ws.Server({ port: opts.socketPort ?? 3002, host: opts.host ?? \"127.0.0.1\" });\n this._server.on(\"connection\", (connection) => LocalhostIpcHost.connect(connection));\n }\n }\n\n public send(message: IpcWebSocketMessage): void {\n this._connections.forEach((last, connection) => {\n message.sequence = last + 1;\n this._connections.set(connection, message.sequence);\n const parts = this.serialize(message);\n parts.forEach((part) => connection.send(part));\n });\n }\n\n public connect(connection: ws) {\n this._connections.set(connection, -1);\n\n connection.on(\"message\", async (data) => {\n const message = await this.notifyIncoming(data, connection);\n if (IpcWebSocketMessage.skip(message)) {\n return;\n }\n\n for (const listener of IpcWebSocket.receivers) {\n listener({} as Event, message);\n }\n });\n\n connection.on(\"close\", () => {\n this._connections.delete(connection);\n this.notifyClose(connection);\n });\n }\n}\n\nclass RpcHandler extends IpcHandler {\n public channelName = rpcOverIpcStrings.channelName;\n\n public async request(info: InterceptedRpcRequest) {\n const invocation = RpcSessionInvocation.create(info);\n const fulfillment = await invocation.fulfillment;\n return invocation.rejected ? Promise.reject(fulfillment.rawResult) : fulfillment.rawResult; // eslint-disable-line @typescript-eslint/prefer-promise-reject-errors\n }\n}\n\n/** @internal */\nexport class LocalhostIpcHost {\n private static _initialized = false;\n public static socket: IpcWebSocketBackend;\n\n public static connect(connection: ws) {\n (IpcWebSocket.transport as LocalTransport).connect(connection);\n }\n\n public static async startup(opts?: { localhostIpcHost?: LocalhostIpcHostOpts, iModelHost?: IModelHostOptions }) {\n let registerHandler = false;\n\n if (!this._initialized) {\n registerHandler = true;\n IpcWebSocket.transport = new LocalTransport(opts?.localhostIpcHost ?? {});\n this.socket = new IpcWebSocketBackend();\n this._initialized = true;\n }\n\n await IpcHost.startup({ ipcHost: { socket: this.socket }, iModelHost: opts?.iModelHost });\n\n if (registerHandler)\n RpcHandler.register();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LockControl.js","sourceRoot":"","sources":["../../src/LockControl.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\
|
|
1
|
+
{"version":3,"file":"LockControl.js","sourceRoot":"","sources":["../../src/LockControl.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module iModels\n */\n\nimport { Id64Arg, Id64String } from \"@itwin/core-bentley\";\nimport { _close, _elementWasCreated, _implementationProhibited, _releaseAllLocks } from \"./internal/Symbols\";\n\n/**\n * Interface for acquiring element locks to [coordinate simultaneous edits]($docs/learning/backend/ConcurrencyControl.md) from multiple briefcases.\n * @see [[IModelDb.locks]] to access the locks for an iModel.\n * @public\n */\nexport interface LockControl {\n /** @internal*/\n readonly [_implementationProhibited]: unknown;\n\n /**\n * true if this LockControl uses a server-based concurrency approach.\n */\n readonly isServerBased: boolean;\n\n /**\n * Close the local lock control database\n * @internal\n */\n [_close]: () => void;\n\n /**\n * Notification that a new element was just created. Called by [[Element.onInserted]]\n * @internal\n */\n [_elementWasCreated]: (id: Id64String) => void;\n\n /**\n * Throw if locks are required and the exclusive lock is not held on the supplied element.\n * Note: there is no need to check the shared locks on parents/models since an element cannot hold the exclusive lock without first obtaining them.\n * Called by functions like [[Element.onUpdate]], [[Element.onDelete]], etc.\n */\n checkExclusiveLock(id: Id64String, type: string, operation: string): void;\n\n /**\n * Throw if locks are required and a shared lock is not held on the supplied element.\n * Called by [[Element.onInsert]] to ensure shared lock is held on the new element's model and parent element.\n */\n checkSharedLock(id: Id64String, type: string, operation: string): void;\n\n /**\n * Determine whether the owning iModel currently holds the exclusive lock on the specified element.\n */\n holdsExclusiveLock(id: Id64String): boolean;\n\n /**\n * Determine whether the owning iModel currently holds a shared lock on the specified element.\n */\n holdsSharedLock(id: Id64String): boolean;\n\n /**\n * Acquire locks on one or more elements from the lock server, if required and not already held.\n * If any required lock is not available, this method throws an exception and *none* of the requested locks are acquired.\n * @note Acquiring the exclusive lock on an element requires also obtaining a shared lock on all its owner elements. This method will\n * attempt to acquire all necessary locks for both sets of input ids.\n */\n acquireLocks(arg: {\n /** if present, one or more elements to obtain shared lock */\n shared?: Id64Arg;\n /** if present, one or more elements to obtain exclusive lock */\n exclusive?: Id64Arg;\n }): Promise<void>;\n\n /** Release all locks currently held by this briefcase from the locker server.\n * This is typically done on your behalf by [[BriefcaseDb.pushChanges]].\n * You may want to do it manually when abandoning all of your briefcase's local changes.\n * You cannot release your locks if your briefcase contains local changes.\n * @throws Error if the briefcase has local changes, or if any other error occurs while releasing the locks.\n */\n releaseAllLocks(): Promise<void>;\n\n /**\n * Release all locks currently held by this Briefcase from the lock server.\n * Not possible to release locks unless push or abandon all changes. Should only be called internally.\n * @internal\n */\n [_releaseAllLocks]: () => Promise<void>;\n}\n"]}
|