@itwin/core-backend 5.15.0-dev.9 → 5.15.1
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 +46 -1
- package/lib/cjs/BlobContainerService.d.ts +2 -0
- package/lib/cjs/BlobContainerService.d.ts.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts +2 -1
- package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
- package/lib/cjs/BriefcaseManager.js +39 -9
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/ChangeUnifier.d.ts +82 -0
- package/lib/cjs/ChangeUnifier.d.ts.map +1 -0
- package/lib/cjs/ChangeUnifier.js +163 -0
- package/lib/cjs/ChangeUnifier.js.map +1 -0
- package/lib/cjs/ChangesetReader.d.ts +21 -2
- package/lib/cjs/ChangesetReader.d.ts.map +1 -1
- package/lib/cjs/ChangesetReader.js +37 -1
- package/lib/cjs/ChangesetReader.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +15 -0
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +1 -0
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +4 -1
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/EditTxn.d.ts +61 -19
- package/lib/cjs/EditTxn.d.ts.map +1 -1
- package/lib/cjs/EditTxn.js +84 -29
- package/lib/cjs/EditTxn.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.d.ts +1 -0
- package/lib/cjs/GeoCoordConfig.d.ts.map +1 -1
- package/lib/cjs/GeoCoordConfig.js +12 -8
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +22 -9
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +54 -12
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/NativeHost.d.ts.map +1 -1
- package/lib/cjs/NativeHost.js +5 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +28 -0
- package/lib/cjs/Relationship.d.ts.map +1 -1
- package/lib/cjs/Relationship.js +78 -0
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/SQLiteDb.d.ts +52 -5
- package/lib/cjs/SQLiteDb.d.ts.map +1 -1
- package/lib/cjs/SQLiteDb.js +40 -5
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/SchemaSync.d.ts.map +1 -1
- package/lib/cjs/SchemaSync.js +1 -0
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +126 -89
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +114 -76
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.d.ts.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.d.ts.map +1 -1
- package/lib/cjs/ViewStore.js +62 -19
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js +3 -0
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +1 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +1 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/BriefcaseUtils.d.ts +19 -0
- package/lib/cjs/internal/BriefcaseUtils.d.ts.map +1 -0
- package/lib/cjs/internal/BriefcaseUtils.js +65 -0
- package/lib/cjs/internal/BriefcaseUtils.js.map +1 -0
- package/lib/cjs/internal/QueryMetadataCache.d.ts +44 -0
- package/lib/cjs/internal/QueryMetadataCache.d.ts.map +1 -0
- package/lib/cjs/internal/QueryMetadataCache.js +107 -0
- package/lib/cjs/internal/QueryMetadataCache.js.map +1 -0
- package/lib/cjs/internal/Symbols.d.ts +9 -0
- package/lib/cjs/internal/Symbols.d.ts.map +1 -1
- package/lib/cjs/internal/Symbols.js +10 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +20 -6
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +6 -6
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.d.ts +4 -3
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/SettingsEditor.js +7 -5
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
- package/lib/esm/BlobContainerService.d.ts +2 -0
- package/lib/esm/BlobContainerService.d.ts.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.d.ts +2 -1
- package/lib/esm/BriefcaseManager.d.ts.map +1 -1
- package/lib/esm/BriefcaseManager.js +40 -10
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/ChangeUnifier.d.ts +82 -0
- package/lib/esm/ChangeUnifier.d.ts.map +1 -0
- package/lib/esm/ChangeUnifier.js +159 -0
- package/lib/esm/ChangeUnifier.js.map +1 -0
- package/lib/esm/ChangesetReader.d.ts +21 -2
- package/lib/esm/ChangesetReader.d.ts.map +1 -1
- package/lib/esm/ChangesetReader.js +38 -2
- package/lib/esm/ChangesetReader.js.map +1 -1
- package/lib/esm/CloudSqlite.d.ts +15 -0
- package/lib/esm/CloudSqlite.d.ts.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/ECDb.d.ts +1 -0
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +4 -1
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/EditTxn.d.ts +61 -19
- package/lib/esm/EditTxn.d.ts.map +1 -1
- package/lib/esm/EditTxn.js +85 -30
- package/lib/esm/EditTxn.js.map +1 -1
- package/lib/esm/GeoCoordConfig.d.ts +1 -0
- package/lib/esm/GeoCoordConfig.d.ts.map +1 -1
- package/lib/esm/GeoCoordConfig.js +12 -8
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +22 -9
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +56 -14
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/NativeHost.d.ts.map +1 -1
- package/lib/esm/NativeHost.js +5 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/Relationship.d.ts +28 -0
- package/lib/esm/Relationship.d.ts.map +1 -1
- package/lib/esm/Relationship.js +78 -0
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/SQLiteDb.d.ts +52 -5
- package/lib/esm/SQLiteDb.d.ts.map +1 -1
- package/lib/esm/SQLiteDb.js +40 -5
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/SchemaSync.d.ts.map +1 -1
- package/lib/esm/SchemaSync.js +1 -0
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/TxnManager.d.ts +126 -89
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +116 -78
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewStateHydrator.d.ts.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.d.ts.map +1 -1
- package/lib/esm/ViewStore.js +62 -19
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.d.ts.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js +3 -0
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/core-backend.d.ts +1 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +1 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/BriefcaseUtils.d.ts +19 -0
- package/lib/esm/internal/BriefcaseUtils.d.ts.map +1 -0
- package/lib/esm/internal/BriefcaseUtils.js +61 -0
- package/lib/esm/internal/BriefcaseUtils.js.map +1 -0
- package/lib/esm/internal/QueryMetadataCache.d.ts +44 -0
- package/lib/esm/internal/QueryMetadataCache.d.ts.map +1 -0
- package/lib/esm/internal/QueryMetadataCache.js +103 -0
- package/lib/esm/internal/QueryMetadataCache.js.map +1 -0
- package/lib/esm/internal/Symbols.d.ts +9 -0
- package/lib/esm/internal/Symbols.d.ts.map +1 -1
- package/lib/esm/internal/Symbols.js +9 -0
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +20 -6
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts +6 -6
- package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js +15 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +144 -30
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts +2 -0
- package/lib/esm/test/ecdb/QueryMetadataCache.test.d.ts.map +1 -0
- package/lib/esm/test/ecdb/QueryMetadataCache.test.js +630 -0
- package/lib/esm/test/ecdb/QueryMetadataCache.test.js.map +1 -0
- package/lib/esm/test/element/DeleteDefinitionElements.test.js +403 -249
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts +2 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.d.ts.map +1 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.js +202 -0
- package/lib/esm/test/element/RelationshipBatchLookup.test.js.map +1 -0
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js +187 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.d.ts +2 -0
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.d.ts.map +1 -0
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.js +142 -0
- package/lib/esm/test/hubaccess/SchemaImportOrphanColumns.test.js.map +1 -0
- package/lib/esm/test/imodel/IModelGeolocation.test.js +8 -6
- package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -1
- package/lib/esm/test/imodel/IModelProps.test.d.ts +2 -0
- package/lib/esm/test/imodel/IModelProps.test.d.ts.map +1 -0
- package/lib/esm/test/imodel/IModelProps.test.js +411 -0
- package/lib/esm/test/imodel/IModelProps.test.js.map +1 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.d.ts +2 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.d.ts.map +1 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.js +240 -0
- package/lib/esm/test/schema/SchemaViewPropertyOverrides.test.js.map +1 -0
- package/lib/esm/test/schema/SchemaViewValidation.test.js +2 -8
- package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -1
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts +2 -0
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js +159 -0
- package/lib/esm/test/standalone/BriefcaseManagerDelete.test.js.map +1 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.d.ts +2 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.js +732 -0
- package/lib/esm/test/standalone/ChangeUnifier.test.js.map +1 -0
- package/lib/esm/test/standalone/DeleteElements.test.js +962 -83
- package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
- package/lib/esm/test/standalone/EditTxn.test.js +72 -1
- package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
- package/lib/esm/test/standalone/GeoCoordConfig.test.d.ts +2 -0
- package/lib/esm/test/standalone/GeoCoordConfig.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/GeoCoordConfig.test.js +158 -0
- package/lib/esm/test/standalone/GeoCoordConfig.test.js.map +1 -0
- package/lib/esm/test/standalone/SQLiteDb.test.d.ts.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js +422 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewStoreDb.test.js +53 -0
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsContainers.test.d.ts +2 -0
- package/lib/esm/test/workspace/SettingsContainers.test.d.ts.map +1 -0
- package/lib/esm/test/workspace/SettingsContainers.test.js +95 -0
- package/lib/esm/test/workspace/SettingsContainers.test.js.map +1 -0
- package/lib/esm/workspace/SettingsEditor.d.ts +4 -3
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
- package/lib/esm/workspace/SettingsEditor.js +7 -5
- package/lib/esm/workspace/SettingsEditor.js.map +1 -1
- package/package.json +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLiteDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SQLiteDb.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,cAAc,CAAC,CAAC,4EAA4E;AAEnG,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IAExB,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACzE,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC1E,EAAE,CAAC,UAAU,CAAC,qDAAqD,CAAC,CAAC;QACrE,EAAE,CAAC,UAAU,CAAC,6CAA6C,CAAC,CAAC;QAC7D,EAAE,CAAC,UAAU,CAAC,6CAA6C,CAAC,CAAC;QAC7D,EAAE,CAAC,WAAW,EAAE,CAAC;QAEjB,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,EAAE,CAAC,mBAAmB,CAAC,0BAA0B,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC/C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YACH,EAAE,CAAC,OAAO,EAAE,CAAC;QACf,CAAC,CAAC;QACF,MAAM,EAAE,CAAC;QAET,0BAA0B;QAC1B,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtJ,MAAM,EAAE,CAAC;QAET,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;QACxB,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE7C,IAAI,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE;YAC9G,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAClB,EAAE,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;QAExB,GAAG,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;YACtH,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;YAClB,MAAM,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,YAAY,GAAG,eAAe,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAClE,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE;YAC3C,EAAE,CAAC,mBAAmB,CAAC,8EAA8E,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC9G,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;gBAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;gBACrD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;gBACjD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,cAAc,GAAG,eAAe,CAAC,gBAAgB,CAAC,uCAAuC,CAAC,CAAC;QACjG,MAAM,iBAAiB,GAAG,eAAe,CAAC,gBAAgB,CAAC,wEAAwE,CAAC,CAAC;QACrI,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,SAAiB,CAAC;QACtB,IAAI,WAAqB,CAAC;QAC1B,IAAI,cAAuC,CAAC;QAC5C,IAAI,KAAoB,CAAC;QACzB,IAAI,CAAC;;;gBACH,MAAM,YAAY,kCAAG,qBAAqB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,QAAA,CAAC;gBACjG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;gBACjC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC;gBACnC,WAAW,GAAG,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBACrD,KAAK,GAAG,YAAY,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBACtD,cAAc,GAAG,YAAY,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAE,CAAC;;;;;;;;;SAC3F;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;QAED,MAAM,UAAU,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;QACxF,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC1B,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEjD,IAAI,CAAC;;;gBACH,MAAM,kBAAkB,kCAAG,qBAAqB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,QAAA,CAAC;gBACzH,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;gBACvC,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,SAAS,iBAAiB,CAAC,CAAC;gBAEpH,EAAE,CAAC,UAAU,CAAC,iBAAiB,SAAS,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAEvG,MAAM,aAAa,kCAAG,qBAAqB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,QAAA,CAAC;gBAC1F,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;gBAClC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;gBAEhG,MAAM,eAAe,kCAAG,qBAAqB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,QAAA,CAAC;gBACtH,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;gBACpC,MAAM,MAAM,GAAG,eAAe,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1F,MAAM,sBAAsB,GAAG,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/G,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;;;;;;;;;SACnD;gBAAS,CAAC;YACT,EAAE,CAAC,OAAO,EAAE,CAAC;QACf,CAAC;QAED,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACxI,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,MAAM,QAAQ,GAAG,CAAC,EAAY,EAAE,SAAiB,EAAE,EAAE;YACnD,MAAM,IAAI,GAAuC,EAAE,CAAC;YACpD,EAAE,CAAC,mBAAmB,CAAC,sBAAsB,SAAS,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC7E,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,aAAa;oBAC3C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;YACjG,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAC;YACjG,MAAM,iBAAiB,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;YAEtG,oGAAoG;YACpG,kDAAkD;YAClD,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,UAAU,CAAC,qDAAqD,CAAC,CAAC;YACzE,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,CAAC,UAAU,CAAC,6CAA6C,CAAC,CAAC;YACjE,MAAM,CAAC,UAAU,CAAC,6CAA6C,CAAC,CAAC;YACjE,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;YAE1C,sGAAsG;YACtG,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,UAAU,CAAC,qDAAqD,CAAC,CAAC;YACzE,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,EAAE,CAAC;YAErB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAE/F,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,8BAA8B,CAAC,CAAC;YACrG,MAAM,iBAAiB,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,8BAA8B,CAAC,CAAC;YAExG,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,CAAC,UAAU,CAAC,qDAAqD,CAAC,CAAC;YACzE,MAAM,CAAC,WAAW,EAAE,CAAC;YAErB,4DAA4D;YAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAEjE,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4HAA4H,EAAE,GAAG,EAAE;YACpI,MAAM,YAAY,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC;YAC7F,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,mCAAmC,CAAC,CAAC;YAC1G,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,mCAAmC,CAAC,CAAC;YAC1G,MAAM,iBAAiB,GAAG,eAAe,CAAC,iBAAiB,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;YAEtG,gGAAgG;YAChG,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,CAAC,qDAAqD,CAAC,CAAC;YACvE,IAAI,CAAC,UAAU,CAAC,8CAA8C,CAAC,CAAC;YAChE,IAAI,CAAC,UAAU,CAAC,8CAA8C,CAAC,CAAC;YAChE,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,EAAE,CAAC;YAEf,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YAClD,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YAElD,oGAAoG;YACpG,mGAAmG;YACnG,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjF,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC7B,MAAM,CAAC,UAAU,CAAC,+CAA+C,CAAC,CAAC;YACnE,MAAM,CAAC,UAAU,CAAC,+CAA+C,CAAC,CAAC;YACnE,MAAM,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,EAAE,CAAC;YAEjB,mHAAmH;YACnH,MAAM,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjF,MAAM,CAAC,UAAU,CAAC,+CAA+C,CAAC,CAAC;YACnE,MAAM,CAAC,WAAW,EAAE,CAAC;YAErB,8FAA8F;YAC9F,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YAEvG,wGAAwG;YACxG,wGAAwG;YACxG,8CAA8C;YAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAChE,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YAE7G,gHAAgH;YAChH,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YAEvG,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC","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 { expect } from \"chai\";\r\nimport { BeDuration, DbResult, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport { SqliteChangesetReader } from \"../../SqliteChangesetReader\";\r\nimport \"../TestUtils\"; // registers the global mocha before/after hooks that start/stop the backend\r\n\r\ndescribe(\"SQLiteDb\", () => {\r\n\r\n it(\"should create new SQLiteDb\", async () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"db1.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(fileName, undefined, { rawSQLite: true, pageSize: 8 * 1024 });\r\n db.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (1,\"val1\")`);\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (2,\"val2\")`);\r\n db.saveChanges();\r\n\r\n const testDb = () => {\r\n db.withSqliteStatement(\"SELECT id,val from test1\", (stmt) => {\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(1);\r\n expect(stmt.getValue(1).getString()).equal(\"val1\");\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(2);\r\n expect(stmt.getValue(1).getString()).equal(\"val2\");\r\n });\r\n db.closeDb();\r\n };\r\n testDb();\r\n\r\n // now test immutable flag\r\n db.openDb(fileName, { openMode: OpenMode.Readonly, skipFileCheck: true, immutable: true, defaultTxn: SQLiteDb.DefaultTxnMode.None, rawSQLite: true });\r\n testDb();\r\n\r\n expect(db.isOpen).false;\r\n expect(() => db.vacuum()).throws(\"not open\");\r\n\r\n let val = db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, () => {\r\n expect(db.isOpen);\r\n db.vacuum();\r\n return 22;\r\n });\r\n expect(val).equal(22);\r\n expect(db.isOpen).false;\r\n\r\n val = await db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, async () => {\r\n expect(db.isOpen);\r\n await BeDuration.fromMilliseconds(10).wait();\r\n return 100;\r\n });\r\n expect(val).equal(100);\r\n expect(db.isOpen).false;\r\n });\r\n\r\n it(\"should be able to open existing .bim file with SQLiteDb\", () => {\r\n const testFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = new SQLiteDb();\r\n db.withOpenDb({ dbName: testFileName }, () => {\r\n db.withSqliteStatement(`SELECT StrData FROM be_Prop WHERE Namespace=\"ec_Db\" AND Name=\"SchemaVersion\"`, (stmt) => {\r\n expect(stmt.step()).equal(DbResult.BE_SQLITE_ROW);\r\n const val = JSON.parse(stmt.getValue(0).getString());\r\n expect(val.major).equal(4, \"read major version\");\r\n expect(val.minor).equal(0, \"read minor version\");\r\n });\r\n });\r\n });\r\n\r\n it(\"supports reading an iModel changeset with SQLiteDb\", () => {\r\n const iModelFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/ReadOnlyTest.bim\");\r\n const changesetFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/csets/dbe4b3824129f99e4eb485fb7cd9d2fea2354be1.cs\");\r\n const iModel = SnapshotDb.openFile(iModelFileName);\r\n let tableName: string;\r\n let columnNames: string[];\r\n let expectedValues: Record<string, unknown>;\r\n let stage: \"Old\" | \"New\";\r\n try {\r\n using schemaReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db: iModel });\r\n expect(schemaReader.step()).true;\r\n tableName = schemaReader.tableName;\r\n columnNames = schemaReader.getColumnNames(tableName);\r\n stage = schemaReader.op === \"Deleted\" ? \"Old\" : \"New\";\r\n expectedValues = schemaReader.getChangeValuesObject(stage, { includeNullColumns: true })!;\r\n } finally {\r\n iModel.close();\r\n }\r\n\r\n const dbFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"changeset-reader.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(dbFileName, undefined, { rawSQLite: true });\r\n const declaredColumns = columnNames.slice(0, -1);\r\n\r\n try {\r\n using missingTableReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(missingTableReader.step()).true;\r\n expect(() => missingTableReader.getChangeValuesObject(stage)).throws(`changeset table ${tableName} does not exist`);\r\n\r\n db.executeSQL(`CREATE TABLE \"${tableName}\" (${declaredColumns.map((name) => `\"${name}\"`).join(\",\")})`);\r\n\r\n using checkedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db });\r\n expect(checkedReader.step()).true;\r\n expect(() => checkedReader.getChangeValuesObject(stage)).throws(\"columns count does not match\");\r\n\r\n using uncheckedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(uncheckedReader.step()).true;\r\n const values = uncheckedReader.getChangeValuesObject(stage, { includeNullColumns: true });\r\n const expectedDeclaredValues = Object.fromEntries(declaredColumns.map((name) => [name, expectedValues[name]]));\r\n expect(values).deep.equal(expectedDeclaredValues);\r\n } finally {\r\n db.closeDb();\r\n }\r\n\r\n expect(() => SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true })).throws(\"db must be open\");\r\n });\r\n\r\n describe(\"applyChangeset\", () => {\r\n const readRows = (db: SQLiteDb, tableName: string) => {\r\n const rows: Array<{ id: number, val: string }> = [];\r\n db.withSqliteStatement(`SELECT id,val FROM ${tableName} ORDER BY id`, (stmt) => {\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n rows.push({ id: stmt.getValue(0).getInteger(), val: stmt.getValue(1).getString() });\r\n });\r\n return rows;\r\n };\r\n\r\n it(\"should apply a changeset containing data changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-1.changeset\");\r\n\r\n // create the source db (with the table already present - raw sqlite changesets cannot capture DDL),\r\n // then capture a changeset that inserts some rows\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n source.startChangeTracking();\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'val1')`);\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'val2')`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n // apply the changeset (raw sqlite changesets have no header to validate) to a db with the same schema\r\n const target = new SQLiteDb();\r\n target.createDb(targetFileName, undefined, { rawSQLite: true });\r\n target.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n target.saveChanges();\r\n target.applyChangeset(changesetFileName);\r\n target.saveChanges();\r\n\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"val1\" }, { id: 2, val: \"val2\" }]);\r\n\r\n source.closeDb();\r\n target.closeDb();\r\n });\r\n\r\n it(\"should throw when creating a changeset containing DDL/schema changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl-source.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl.changeset\");\r\n\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeDdl(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n\r\n // raw sqlite changesets cannot represent DDL/schema changes\r\n expect(() => source.createChangeset(changesetFileName)).throws();\r\n\r\n source.closeDb();\r\n });\r\n\r\n it(\"should fail if applying a changeset produces a conflict, leaving it to the caller to abandon the partially-applied changes\", () => {\r\n const baseFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-base.db\");\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-2.changeset\");\r\n\r\n // create a common base db with two rows, then clone it so source and target start out identical\r\n const base = new SQLiteDb();\r\n base.createDb(baseFileName, undefined, { rawSQLite: true });\r\n base.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'base1')`);\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'base2')`);\r\n base.saveChanges();\r\n base.closeDb();\r\n\r\n IModelJsFs.copySync(baseFileName, sourceFileName);\r\n IModelJsFs.copySync(baseFileName, targetFileName);\r\n\r\n // diverge source: update both rows and capture that as a single changeset. Only the second row will\r\n // conflict with target's divergence below - the first row's change would apply cleanly on its own.\r\n const source = new SQLiteDb();\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeSQL(`UPDATE test1 SET val='fromSource1' WHERE id=1`);\r\n source.executeSQL(`UPDATE test1 SET val='fromSource2' WHERE id=2`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n source.closeDb();\r\n\r\n // diverge target independently - only on the second row - so applying source's changeset conflicts partway through\r\n const target = new SQLiteDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n target.executeSQL(`UPDATE test1 SET val='fromTarget2' WHERE id=2`);\r\n target.saveChanges();\r\n\r\n // confirm the pre-apply baseline: id=1 was never touched by target, id=2 diverged from source\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // applyChangeset only throws on failure - it does not commit or abandon changes itself. Since the first\r\n // row's change didn't conflict, it may already have been applied to the current transaction by the time\r\n // the second row's conflict causes the throw.\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"fromSource1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // it is the caller's responsibility to abandon (or save) the partially-applied changes after catching the error\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n target.closeDb();\r\n });\r\n });\r\n\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"SQLiteDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SQLiteDb.test.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 { expect } from \"chai\";\r\nimport * as sinon from \"sinon\";\r\nimport { BeDuration, DbConflictCause, DbConflictResolution, DbOpcode, DbResult, Logger, LogLevel, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport { SqliteChangesetReader } from \"../../SqliteChangesetReader\";\r\nimport { _nativeDb } from \"../../internal/Symbols\";\r\nimport \"../TestUtils\"; // registers the global mocha before/after hooks that start/stop the backend\r\n\r\ndescribe(\"SQLiteDb\", () => {\r\n\r\n it(\"should create new SQLiteDb\", async () => {\r\n const fileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"db1.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(fileName, undefined, { rawSQLite: true, pageSize: 8 * 1024 });\r\n db.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (1,\"val1\")`);\r\n db.executeSQL(`INSERT INTO test1(id,val) VALUES (2,\"val2\")`);\r\n db.saveChanges();\r\n\r\n const testDb = () => {\r\n db.withSqliteStatement(\"SELECT id,val from test1\", (stmt) => {\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(1);\r\n expect(stmt.getValue(1).getString()).equal(\"val1\");\r\n stmt.step();\r\n expect(stmt.getValue(0).getInteger()).equal(2);\r\n expect(stmt.getValue(1).getString()).equal(\"val2\");\r\n });\r\n db.closeDb();\r\n };\r\n testDb();\r\n\r\n // now test immutable flag\r\n db.openDb(fileName, { openMode: OpenMode.Readonly, skipFileCheck: true, immutable: true, defaultTxn: SQLiteDb.DefaultTxnMode.None, rawSQLite: true });\r\n testDb();\r\n\r\n expect(db.isOpen).false;\r\n expect(() => db.vacuum()).throws(\"not open\");\r\n\r\n let val = db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, () => {\r\n expect(db.isOpen);\r\n db.vacuum();\r\n return 22;\r\n });\r\n expect(val).equal(22);\r\n expect(db.isOpen).false;\r\n\r\n val = await db.withOpenDb({ dbName: fileName, openMode: { openMode: OpenMode.ReadWrite, rawSQLite: true } }, async () => {\r\n expect(db.isOpen);\r\n await BeDuration.fromMilliseconds(10).wait();\r\n return 100;\r\n });\r\n expect(val).equal(100);\r\n expect(db.isOpen).false;\r\n });\r\n\r\n it(\"should be able to open existing .bim file with SQLiteDb\", () => {\r\n const testFileName = IModelTestUtils.resolveAssetFile(\"test.bim\");\r\n const db = new SQLiteDb();\r\n db.withOpenDb({ dbName: testFileName }, () => {\r\n db.withSqliteStatement(`SELECT StrData FROM be_Prop WHERE Namespace=\"ec_Db\" AND Name=\"SchemaVersion\"`, (stmt) => {\r\n expect(stmt.step()).equal(DbResult.BE_SQLITE_ROW);\r\n const val = JSON.parse(stmt.getValue(0).getString());\r\n expect(val.major).equal(4, \"read major version\");\r\n expect(val.minor).equal(0, \"read minor version\");\r\n });\r\n });\r\n });\r\n\r\n it(\"supports reading an iModel changeset with SQLiteDb\", () => {\r\n const iModelFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/ReadOnlyTest.bim\");\r\n const changesetFileName = IModelTestUtils.resolveAssetFile(\"_mocks_/ReadOnlyTest/csets/dbe4b3824129f99e4eb485fb7cd9d2fea2354be1.cs\");\r\n const iModel = SnapshotDb.openFile(iModelFileName);\r\n let tableName: string;\r\n let columnNames: string[];\r\n let expectedValues: Record<string, unknown>;\r\n let stage: \"Old\" | \"New\";\r\n try {\r\n using schemaReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db: iModel });\r\n expect(schemaReader.step()).true;\r\n tableName = schemaReader.tableName;\r\n columnNames = schemaReader.getColumnNames(tableName);\r\n stage = schemaReader.op === \"Deleted\" ? \"Old\" : \"New\";\r\n expectedValues = schemaReader.getChangeValuesObject(stage, { includeNullColumns: true })!;\r\n } finally {\r\n iModel.close();\r\n }\r\n\r\n const dbFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"changeset-reader.db\");\r\n const db = new SQLiteDb();\r\n db.createDb(dbFileName, undefined, { rawSQLite: true });\r\n const declaredColumns = columnNames.slice(0, -1);\r\n\r\n try {\r\n using missingTableReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(missingTableReader.step()).true;\r\n expect(() => missingTableReader.getChangeValuesObject(stage)).throws(`changeset table ${tableName} does not exist`);\r\n\r\n db.executeSQL(`CREATE TABLE \"${tableName}\" (${declaredColumns.map((name) => `\"${name}\"`).join(\",\")})`);\r\n\r\n using checkedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db });\r\n expect(checkedReader.step()).true;\r\n expect(() => checkedReader.getChangeValuesObject(stage)).throws(\"columns count does not match\");\r\n\r\n using uncheckedReader = SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true });\r\n expect(uncheckedReader.step()).true;\r\n const values = uncheckedReader.getChangeValuesObject(stage, { includeNullColumns: true });\r\n const expectedDeclaredValues = Object.fromEntries(declaredColumns.map((name) => [name, expectedValues[name]]));\r\n expect(values).deep.equal(expectedDeclaredValues);\r\n } finally {\r\n db.closeDb();\r\n }\r\n\r\n expect(() => SqliteChangesetReader.openFile({ fileName: changesetFileName, db, disableSchemaCheck: true })).throws(\"db must be open\");\r\n });\r\n\r\n describe(\"applyChangeset\", () => {\r\n const applyFlags = SQLiteDb.ApplyChangesetFlags;\r\n const policy = SQLiteDb.ChangesetConflictPolicy;\r\n const readRows = (db: SQLiteDb, tableName: string) => {\r\n const rows: Array<{ id: number, val: string }> = [];\r\n db.withSqliteStatement(`SELECT id,val FROM ${tableName} ORDER BY id`, (stmt) => {\r\n while (stmt.step() === DbResult.BE_SQLITE_ROW)\r\n rows.push({ id: stmt.getValue(0).getInteger(), val: stmt.getValue(1).getString() });\r\n });\r\n return rows;\r\n };\r\n\r\n it(\"should apply a changeset containing data changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-1.changeset\");\r\n\r\n // create the source db (with the table already present - raw sqlite changesets cannot capture DDL),\r\n // then capture a changeset that inserts some rows\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n source.startChangeTracking();\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'val1')`);\r\n source.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'val2')`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n // apply the changeset (raw sqlite changesets have no header to validate) to a db with the same schema\r\n const target = new SQLiteDb();\r\n target.createDb(targetFileName, undefined, { rawSQLite: true });\r\n target.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n target.saveChanges();\r\n target.applyChangeset(changesetFileName);\r\n target.saveChanges();\r\n\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"val1\" }, { id: 2, val: \"val2\" }]);\r\n\r\n source.closeDb();\r\n target.closeDb();\r\n });\r\n\r\n it(\"should throw when creating a changeset containing DDL/schema changes\", () => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl-source.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-ddl.changeset\");\r\n\r\n const source = new SQLiteDb();\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeDdl(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.saveChanges();\r\n\r\n // raw sqlite changesets cannot represent DDL/schema changes\r\n expect(() => source.createChangeset(changesetFileName)).throws();\r\n\r\n source.closeDb();\r\n });\r\n\r\n it(\"should fail if applying a changeset produces a conflict, leaving it to the caller to abandon the partially-applied changes\", () => {\r\n const baseFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-base.db\");\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-source.db\");\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-conflict-target.db\");\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", \"applyChangeset-2.changeset\");\r\n\r\n // create a common base db with two rows, then clone it so source and target start out identical\r\n const base = new SQLiteDb();\r\n base.createDb(baseFileName, undefined, { rawSQLite: true });\r\n base.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT)\");\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (1,'base1')`);\r\n base.executeSQL(`INSERT INTO test1(id,val) VALUES (2,'base2')`);\r\n base.saveChanges();\r\n base.closeDb();\r\n\r\n IModelJsFs.copySync(baseFileName, sourceFileName);\r\n IModelJsFs.copySync(baseFileName, targetFileName);\r\n\r\n // diverge source: update both rows and capture that as a single changeset. Only the second row will\r\n // conflict with target's divergence below - the first row's change would apply cleanly on its own.\r\n const source = new SQLiteDb();\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeSQL(`UPDATE test1 SET val='fromSource1' WHERE id=1`);\r\n source.executeSQL(`UPDATE test1 SET val='fromSource2' WHERE id=2`);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n source.closeDb();\r\n\r\n // diverge target independently - only on the second row - so applying source's changeset conflicts partway through\r\n const target = new SQLiteDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n target.executeSQL(`UPDATE test1 SET val='fromTarget2' WHERE id=2`);\r\n target.saveChanges();\r\n\r\n // confirm the pre-apply baseline: id=1 was never touched by target, id=2 diverged from source\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // applyChangeset only throws on failure - it does not commit or abandon changes itself. Since the first\r\n // row's change didn't conflict, it may already have been applied to the current transaction by the time\r\n // the second row's conflict causes the throw.\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"fromSource1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n // it is the caller's responsibility to abandon (or save) the partially-applied changes after catching the error\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n expect(() => target.applyChangeset(changesetFileName, applyFlags.None, policy.AbortOnAnyConflict)).throws();\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"fromTarget2\" }]);\r\n\r\n target.closeDb();\r\n });\r\n\r\n const withChangeset = (name: string, sourceSql: string[], targetSql: string[], test: (target: SQLiteDb, changesetFile: string, targetFile: string) => void) => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `${name}-source.db`);\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `${name}-target.db`);\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `${name}.changeset`);\r\n const source = new SQLiteDb();\r\n const target = new SQLiteDb();\r\n try {\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE test1(id INTEGER PRIMARY KEY,val TEXT NOT NULL UNIQUE)\");\r\n source.executeSQL(\"INSERT INTO test1 VALUES (1,'base1'),(2,'base2')\");\r\n source.saveChanges();\r\n source.closeDb();\r\n IModelJsFs.copySync(sourceFileName, targetFileName);\r\n\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n for (const sql of sourceSql)\r\n source.executeSQL(sql);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n for (const sql of targetSql)\r\n target.executeSQL(sql);\r\n target.saveChanges();\r\n test(target, changesetFileName, targetFileName);\r\n } finally {\r\n if (source.isOpen)\r\n source.closeDb();\r\n if (target.isOpen)\r\n target.closeDb();\r\n }\r\n };\r\n\r\n const conflictCases = [\r\n {\r\n name: \"replace primary-key insert conflicts\",\r\n sourceSql: \"INSERT INTO test1 VALUES (3,'incoming')\",\r\n targetSql: \"INSERT INTO test1 VALUES (3,'existing')\",\r\n expected: [{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }, { id: 3, val: \"incoming\" }],\r\n },\r\n {\r\n name: \"skip deletes of missing rows\",\r\n sourceSql: \"DELETE FROM test1 WHERE id=1\",\r\n targetSql: \"DELETE FROM test1 WHERE id=1\",\r\n expected: [{ id: 2, val: \"base2\" }],\r\n },\r\n {\r\n name: \"skip updates of missing rows\",\r\n sourceSql: \"UPDATE test1 SET val='incoming' WHERE id=1\",\r\n targetSql: \"DELETE FROM test1 WHERE id=1\",\r\n expected: [{ id: 2, val: \"base2\" }],\r\n },\r\n {\r\n name: \"replace conflicting update values\",\r\n sourceSql: \"UPDATE test1 SET val='incoming' WHERE id=1\",\r\n targetSql: \"UPDATE test1 SET val='existing' WHERE id=1\",\r\n expected: [{ id: 1, val: \"incoming\" }, { id: 2, val: \"base2\" }],\r\n },\r\n {\r\n name: \"apply deletes despite conflicting before-values\",\r\n sourceSql: \"DELETE FROM test1 WHERE id=1\",\r\n targetSql: \"UPDATE test1 SET val='existing' WHERE id=1\",\r\n expected: [{ id: 2, val: \"base2\" }],\r\n },\r\n {\r\n name: \"skip incoming changes that violate unique constraints\",\r\n sourceSql: \"INSERT INTO test1 VALUES (3,'incoming')\",\r\n targetSql: \"UPDATE test1 SET val='incoming' WHERE id=2\",\r\n expected: [{ id: 1, val: \"base1\" }, { id: 2, val: \"incoming\" }],\r\n },\r\n ];\r\n\r\n for (const [index, testCase] of conflictCases.entries()) {\r\n it(`should ${testCase.name} with the no-local-changes policy`, () => {\r\n withChangeset(`no-local-changes-${index}`, [testCase.sourceSql], [testCase.targetSql], (target, changesetFileName, targetFileName) => {\r\n const beforeApply = readRows(target, \"test1\");\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal(beforeApply);\r\n\r\n target.applyChangeset(changesetFileName, applyFlags.None, policy.NoLocalChanges);\r\n expect(readRows(target, \"test1\")).deep.equal(testCase.expected);\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal(beforeApply);\r\n target.applyChangeset(changesetFileName, applyFlags.None, policy.NoLocalChanges);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"test1\")).deep.equal(testCase.expected);\r\n });\r\n });\r\n }\r\n\r\n it(\"should combine Invert and IgnoreNoop without invoking a conflict handler for no-op deletes\", () => {\r\n withChangeset(\"invert-ignore-noop\", [\"INSERT INTO test1 VALUES (3,'incoming')\"], [\"INSERT INTO test1 VALUES (3,'incoming')\"], (target, file) => {\r\n target.applyChangeset(file, applyFlags.Invert);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }]);\r\n target.applyChangeset(file, applyFlags.Invert | applyFlags.IgnoreNoop, () => {\r\n throw new Error(\"No-op delete should not invoke the conflict handler\");\r\n });\r\n target.applyChangeset(file);\r\n target.applyChangeset(file, applyFlags.IgnoreNoop, () => {\r\n throw new Error(\"No-op insert should not invoke the conflict handler\");\r\n });\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }, { id: 3, val: \"incoming\" }]);\r\n });\r\n });\r\n\r\n for (const insert of [false, true]) {\r\n it(`should replace indirect ${insert ? \"insert conflicts with a warning\" : \"update conflicts without warnings\"} with the no-local-changes policy`, () => {\r\n const indirectSql = insert ? \"INSERT INTO test1 VALUES (3,'incoming')\" : \"UPDATE test1 SET val='incoming' WHERE id=2\";\r\n const targetSql = insert ? \"INSERT INTO test1 VALUES (3,'existing')\" : \"UPDATE test1 SET val='existing' WHERE id=2\";\r\n withChangeset(`indirect-${insert ? \"insert\" : \"update\"}`, [\r\n `CREATE TRIGGER indirect_change AFTER UPDATE ON test1 WHEN NEW.id=1 BEGIN ${indirectSql}; END`,\r\n \"UPDATE test1 SET val='direct' WHERE id=1\",\r\n ], [targetSql], (target, file, targetFile) => {\r\n const conflicts: SQLiteDb.ChangesetConflictArgs[] = [];\r\n target.applyChangeset(file, applyFlags.None, (args) => {\r\n conflicts.push(args);\r\n return DbConflictResolution.Replace;\r\n });\r\n expect(conflicts).lengthOf(1);\r\n expect(conflicts[0]).include({ cause: insert ? DbConflictCause.Conflict : DbConflictCause.Data, indirect: true });\r\n target.abandonChanges();\r\n\r\n const sandbox = sinon.createSandbox();\r\n const category = \"BeSQLite\";\r\n const levels = { ...Logger.categoryFilter, [category]: LogLevel.Warning };\r\n sandbox.stub(Logger, \"categoryFilter\").get(() => levels);\r\n const logWarning = sandbox.spy(Logger, \"logWarning\");\r\n Logger.onLogLevelChanged.raiseEvent();\r\n try {\r\n target.applyChangeset(file, applyFlags.None, policy.NoLocalChanges);\r\n expect(logWarning.calledWith(category)).equal(insert);\r\n } finally {\r\n sandbox.restore();\r\n Logger.onLogLevelChanged.raiseEvent();\r\n }\r\n const expected = insert\r\n ? [{ id: 1, val: \"direct\" }, { id: 2, val: \"base2\" }, { id: 3, val: \"incoming\" }]\r\n : [{ id: 1, val: \"direct\" }, { id: 2, val: \"incoming\" }];\r\n expect(readRows(target, \"test1\")).deep.equal(expected);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"test1\")).deep.equal(expected);\r\n });\r\n });\r\n }\r\n\r\n it(\"should expose NoUpdateLoop independently of conflict policy\", () => {\r\n withChangeset(\"no-update-loop\", [\r\n \"UPDATE test1 SET val='temp' WHERE id=1\",\r\n \"UPDATE test1 SET val='base1' WHERE id=2\",\r\n \"UPDATE test1 SET val='base2' WHERE id=1\",\r\n ], [], (target, file) => {\r\n target.applyChangeset(file);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base2\" }, { id: 2, val: \"base1\" }]);\r\n target.abandonChanges();\r\n expect(() => target.applyChangeset(file, applyFlags.NoUpdateLoop)).throws();\r\n target.abandonChanges();\r\n target.applyChangeset(file, applyFlags.NoUpdateLoop, policy.NoLocalChanges);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }]);\r\n });\r\n });\r\n\r\n it(\"should let a custom handler skip a conflicting insert and retain its copied arguments\", () => {\r\n withChangeset(\"custom-conflict\", [\"INSERT INTO test1 VALUES (3,'incoming')\"], [\"INSERT INTO test1 VALUES (3,'existing')\"], (target, file) => {\r\n const conflicts: SQLiteDb.ChangesetConflictArgs[] = [];\r\n target.applyChangeset(file, applyFlags.None, (args) => {\r\n conflicts.push(args);\r\n return DbConflictResolution.Skip;\r\n });\r\n expect(conflicts).deep.equal([{\r\n cause: DbConflictCause.Conflict,\r\n opcode: DbOpcode.Insert,\r\n indirect: false,\r\n tableName: \"test1\",\r\n columnCount: 2,\r\n primaryKeyColumns: [0],\r\n }]);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"base2\" }, { id: 3, val: \"existing\" }]);\r\n });\r\n });\r\n\r\n it(\"should honor custom Replace and Abort resolutions and propagate callback exceptions\", () => {\r\n withChangeset(\"custom-resolution\", [\"UPDATE test1 SET val='incoming' WHERE id=1\"], [\"UPDATE test1 SET val='existing' WHERE id=1\"], (target, file) => {\r\n target.applyChangeset(file, applyFlags.None, (args) => {\r\n expect(args.cause).equal(DbConflictCause.Data);\r\n expect(args).deep.equal({\r\n cause: DbConflictCause.Data,\r\n opcode: DbOpcode.Update,\r\n indirect: false,\r\n tableName: \"test1\",\r\n columnCount: 2,\r\n primaryKeyColumns: [0],\r\n });\r\n return DbConflictResolution.Replace;\r\n });\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"incoming\" });\r\n target.abandonChanges();\r\n\r\n expect(() => target.applyChangeset(file, applyFlags.None, () => DbConflictResolution.Abort)).throws();\r\n target.abandonChanges();\r\n const error = new Error(\"custom conflict failure\");\r\n expect(() => target.applyChangeset(file, applyFlags.None, () => { throw error; })).throws(error);\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"existing\" });\r\n target.applyChangeset(file, applyFlags.None, () => DbConflictResolution.Replace);\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"incoming\" });\r\n });\r\n });\r\n\r\n it(\"should reject invalid flags, policies, and custom resolutions\", () => {\r\n withChangeset(\"invalid-apply-options\", [\"INSERT INTO test1 VALUES (3,'incoming')\"], [\"INSERT INTO test1 VALUES (3,'existing')\"], (target, file) => {\r\n const applyChangeset = target.applyChangeset.bind(target);\r\n for (const flags of [-1, 16, 0.5, Number.NaN, Number.POSITIVE_INFINITY, true])\r\n expect(() => Reflect.apply(applyChangeset, undefined, [file, flags])).throws(TypeError);\r\n expect(() => Reflect.apply(applyChangeset, undefined, [file, applyFlags.None, 2])).throws(TypeError);\r\n for (const resolution of [undefined, -1, 3, 0.5, Number.NaN, Promise.resolve(DbConflictResolution.Skip)]) {\r\n expect(() => Reflect.apply(applyChangeset, undefined, [file, applyFlags.None, (): unknown => resolution])).throws(TypeError);\r\n target.abandonChanges();\r\n }\r\n });\r\n });\r\n\r\n it(\"should reject reentrant lifecycle and transaction changes while allowing conflict queries\", () => {\r\n withChangeset(\"reentrant-apply\", [\"UPDATE test1 SET val='incoming' WHERE id=1\"], [\"UPDATE test1 SET val='existing' WHERE id=1\"], (target, file, targetFile) => {\r\n const nativeDb = target[_nativeDb];\r\n const operations = [\r\n () => target.saveChanges(),\r\n () => target.abandonChanges(),\r\n () => nativeDb.restartDefaultTxn(),\r\n () => target.closeDb(),\r\n () => nativeDb.dispose(),\r\n () => target.openDb(targetFile, OpenMode.ReadWrite),\r\n () => target.createDb(targetFile),\r\n () => target.applyChangeset(file),\r\n () => target.vacuum(),\r\n () => nativeDb.analyze(),\r\n () => nativeDb.enableWalMode(),\r\n () => nativeDb.performCheckpoint(),\r\n () => nativeDb.setAutoCheckpointThreshold(100),\r\n () => target.executeDdl(\"DROP TABLE test1\"),\r\n () => target.startChangeTracking(),\r\n () => target.createChangeset(file),\r\n () => nativeDb.saveFileProperty({ namespace: \"test\", name: \"test\" }, \"value\"),\r\n ];\r\n let calls = 0;\r\n target.applyChangeset(file, applyFlags.None, () => {\r\n ++calls;\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"existing\" });\r\n for (const operation of operations)\r\n expect(operation).throws(\"cannot modify or close database while applying a changeset\");\r\n expect(target.isOpen).true;\r\n return DbConflictResolution.Replace;\r\n });\r\n expect(calls).equal(1);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"test1\")[0]).deep.equal({ id: 1, val: \"incoming\" });\r\n });\r\n });\r\n\r\n it(\"should release the apply guard after a reentrant operation aborts the callback\", () => {\r\n withChangeset(\"reentrant-apply-failure\", [\r\n \"UPDATE test1 SET val='incoming1' WHERE id=1\",\r\n \"UPDATE test1 SET val='incoming2' WHERE id=2\",\r\n ], [\"UPDATE test1 SET val='existing' WHERE id=2\"], (target, file) => {\r\n expect(() => target.applyChangeset(file, applyFlags.None, () => {\r\n target.saveChanges();\r\n return DbConflictResolution.Replace;\r\n })).throws(\"cannot modify or close database while applying a changeset\");\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"incoming1\" }, { id: 2, val: \"existing\" }]);\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"base1\" }, { id: 2, val: \"existing\" }]);\r\n target.applyChangeset(file, applyFlags.None, () => DbConflictResolution.Replace);\r\n expect(readRows(target, \"test1\")).deep.equal([{ id: 1, val: \"incoming1\" }, { id: 2, val: \"incoming2\" }]);\r\n });\r\n });\r\n\r\n for (const testCase of [conflictCases[1], conflictCases[5]]) {\r\n it(`should reject Replace when the handler must ${testCase.name}`, () => {\r\n withChangeset(`invalid-replace-${testCase.name}`, [testCase.sourceSql], [testCase.targetSql], (target, file) => {\r\n const beforeApply = readRows(target, \"test1\");\r\n expect(() => target.applyChangeset(file, applyFlags.None, () => DbConflictResolution.Replace))\r\n .throws(TypeError, \"Replace is valid only for data and primary-key insert conflicts\");\r\n target.abandonChanges();\r\n expect(readRows(target, \"test1\")).deep.equal(beforeApply);\r\n });\r\n });\r\n }\r\n\r\n const withCascadeChangeset = (name: string, test: (target: SQLiteDb, file: string, targetFile: string) => void) => {\r\n const sourceFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `cascade-${name}-source.db`);\r\n const targetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `cascade-${name}-target.db`);\r\n const changesetFileName = IModelTestUtils.prepareOutputFile(\"SQLiteDb\", `cascade-${name}.changeset`);\r\n const source = new SQLiteDb();\r\n const target = new SQLiteDb();\r\n try {\r\n source.createDb(sourceFileName, undefined, { rawSQLite: true });\r\n source.executeSQL(\"CREATE TABLE parent(id INTEGER PRIMARY KEY,val TEXT)\");\r\n source.executeSQL(\"CREATE TABLE child(id INTEGER PRIMARY KEY,val TEXT,parentId INTEGER REFERENCES parent(id) ON DELETE CASCADE)\");\r\n source.executeSQL(\"INSERT INTO parent VALUES (1,'slab')\");\r\n source.executeSQL(\"INSERT INTO child VALUES (1,'child1',1),(2,'child2',1)\");\r\n source.saveChanges();\r\n source.closeDb();\r\n IModelJsFs.copySync(sourceFileName, targetFileName);\r\n\r\n source.openDb(sourceFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n source.startChangeTracking();\r\n source.executeSQL(\"DELETE FROM parent WHERE id=1\");\r\n expect(readRows(source, \"parent\")).deep.equal([]);\r\n expect(readRows(source, \"child\")).deep.equal([]);\r\n source.saveChanges();\r\n source.createChangeset(changesetFileName);\r\n\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n test(target, changesetFileName, targetFileName);\r\n } finally {\r\n if (source.isOpen)\r\n source.closeDb();\r\n if (target.isOpen)\r\n target.closeDb();\r\n }\r\n };\r\n\r\n it(\"should apply a captured parent cascade with FkNoAction and preserve unrelated families\", () => {\r\n withCascadeChangeset(\"unrelated-family\", (target, file, targetFile) => {\r\n target.executeSQL(\"INSERT INTO parent VALUES (2,'other')\");\r\n target.executeSQL(\"INSERT INTO child VALUES (3,'other child',2)\");\r\n target.saveChanges();\r\n\r\n target.applyChangeset(file, applyFlags.FkNoAction);\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 2, val: \"other\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 3, val: \"other child\" }]);\r\n target.abandonChanges();\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 1, val: \"slab\" }, { id: 2, val: \"other\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 1, val: \"child1\" }, { id: 2, val: \"child2\" }, { id: 3, val: \"other child\" }]);\r\n\r\n target.applyChangeset(file, applyFlags.FkNoAction);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 2, val: \"other\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 3, val: \"other child\" }]);\r\n });\r\n });\r\n\r\n it(\"should apply a captured parent cascade with foreign-key actions enabled\", () => {\r\n withCascadeChangeset(\"actions-enabled\", (target, file, targetFile) => {\r\n target.applyChangeset(file, applyFlags.None, policy.NoLocalChanges);\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n });\r\n });\r\n\r\n it(\"should replace conflicting indirect child deletes from a captured parent cascade\", () => {\r\n withCascadeChangeset(\"changed-child\", (target, file, targetFile) => {\r\n target.executeSQL(\"UPDATE child SET val='changed child' WHERE id=1\");\r\n target.saveChanges();\r\n expect(() => target.applyChangeset(file, applyFlags.FkNoAction)).throws();\r\n target.abandonChanges();\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 1, val: \"slab\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 1, val: \"changed child\" }, { id: 2, val: \"child2\" }]);\r\n\r\n const conflicts: SQLiteDb.ChangesetConflictArgs[] = [];\r\n target.applyChangeset(file, applyFlags.FkNoAction, (args) => {\r\n conflicts.push(args);\r\n return DbConflictResolution.Replace;\r\n });\r\n expect(conflicts).deep.equal([{\r\n cause: DbConflictCause.Data,\r\n opcode: DbOpcode.Delete,\r\n indirect: true,\r\n tableName: \"child\",\r\n columnCount: 3,\r\n primaryKeyColumns: [0],\r\n }]);\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n target.abandonChanges();\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 1, val: \"changed child\" }, { id: 2, val: \"child2\" }]);\r\n\r\n target.applyChangeset(file, applyFlags.FkNoAction, policy.NoLocalChanges);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFile, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n });\r\n });\r\n\r\n for (const extraChild of [false, true]) {\r\n it(`should ${extraChild ? \"reject orphaned children instead of cascading\" : \"apply parent and cascaded child deletions\"} with FkNoAction and the no-local-changes policy`, () => {\r\n withCascadeChangeset(extraChild ? \"orphan\" : \"complete\", (target, changesetFileName, targetFileName) => {\r\n if (extraChild) {\r\n target.executeSQL(\"INSERT INTO child VALUES (3,'extra child',1)\");\r\n target.saveChanges();\r\n expect(() => target.applyChangeset(changesetFileName, applyFlags.FkNoAction, policy.NoLocalChanges)).throws();\r\n target.abandonChanges();\r\n expect(readRows(target, \"parent\")).deep.equal([{ id: 1, val: \"slab\" }]);\r\n expect(readRows(target, \"child\")).deep.equal([{ id: 1, val: \"child1\" }, { id: 2, val: \"child2\" }, { id: 3, val: \"extra child\" }]);\r\n const conflicts: SQLiteDb.ChangesetConflictArgs[] = [];\r\n expect(() => target.applyChangeset(changesetFileName, applyFlags.FkNoAction, (args) => {\r\n conflicts.push(args);\r\n return args.cause === DbConflictCause.ForeignKey ? DbConflictResolution.Abort : DbConflictResolution.Skip;\r\n })).throws();\r\n expect(conflicts).deep.equal([{ cause: DbConflictCause.ForeignKey, foreignKeyConflicts: 1 }]);\r\n target.abandonChanges();\r\n expect(() => target.applyChangeset(changesetFileName, applyFlags.FkNoAction, () => DbConflictResolution.Replace))\r\n .throws(TypeError, \"Replace is valid only for data and primary-key insert conflicts\");\r\n target.abandonChanges();\r\n target.applyChangeset(changesetFileName, applyFlags.None, policy.NoLocalChanges);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n } else {\r\n expect(() => target.applyChangeset(changesetFileName)).throws();\r\n target.abandonChanges();\r\n target.applyChangeset(changesetFileName, applyFlags.FkNoAction, policy.NoLocalChanges);\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n target.saveChanges();\r\n target.closeDb();\r\n target.openDb(targetFileName, { openMode: OpenMode.ReadWrite, rawSQLite: true });\r\n expect(readRows(target, \"parent\")).deep.equal([]);\r\n expect(readRows(target, \"child\")).deep.equal([]);\r\n }\r\n });\r\n });\r\n }\r\n });\r\n\r\n});\r\n"]}
|
|
@@ -6,6 +6,7 @@ import { expect } from "chai";
|
|
|
6
6
|
import { join } from "path";
|
|
7
7
|
import { Guid, Logger, LogLevel, OpenMode } from "@itwin/core-bentley";
|
|
8
8
|
import { ViewStore } from "../../ViewStore";
|
|
9
|
+
import { ViewStoreError } from "@itwin/core-common";
|
|
9
10
|
import { KnownTestLocations } from "../KnownTestLocations";
|
|
10
11
|
import { SnapshotDb } from "../../IModelDb";
|
|
11
12
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
@@ -236,6 +237,58 @@ describe("ViewStore", function () {
|
|
|
236
237
|
expect(vs1.queryViewsSync({ owner: "owner10", classNames: ["BisCore:SpatialViewDefinition", "BisCore:OrthographicViewDefinition"] }).length).equal(2);
|
|
237
238
|
expect(vs1.queryViewsSync({ owner: "owner10", classNames: ["BisCore:DrawingViewDefinition"] }).length).equal(1);
|
|
238
239
|
expect(vs1.queryViewsSync({ owner: "owner10", classNames: ["BisCore:DrawingViewDefinition", "BisCore:SheetViewDefinition"] }).length).equal(2);
|
|
240
|
+
// query parameters may come from RPC callers, so values must never be interpreted as SQL
|
|
241
|
+
const allPublicCount = vs1.queryViewsSync({}).length;
|
|
242
|
+
const injectClause = "x') OR 1=1 OR className IN('x";
|
|
243
|
+
expect(vs1.queryViewsSync({ classNames: [injectClause] }).length).equal(0);
|
|
244
|
+
expect(vs1.queryViewsSync({ classNames: ["foo') UNION SELECT Id,name,owner,private,1 FROM views -- "] }).length).equal(0);
|
|
245
|
+
expect(vs1.queryViewsSync({ tags: [injectClause] }).length).equal(0);
|
|
246
|
+
expect(vs1.queryViewsSync({ classNames: ["it's"] }).length).equal(0); // quotes in values must not cause SQL errors
|
|
247
|
+
expect(vs1.queryViewsSync({ tags: ["it's"] }).length).equal(0);
|
|
248
|
+
expect(vs1.queryViewsSync({ nameSearch: "' OR 1=1 --" }).length).equal(0);
|
|
249
|
+
expect(vs1.queryViewsSync({ group: "group2", offset: 95 }).length).equal(5); // offset without limit
|
|
250
|
+
const badParams = [
|
|
251
|
+
{ nameSearch: "x", nameCompare: "= @name OR 1=1 OR name =" },
|
|
252
|
+
{ nameSearch: "x", nameCompare: "like" },
|
|
253
|
+
{ limit: "1 UNION SELECT Id FROM views" },
|
|
254
|
+
{ limit: 1.5 },
|
|
255
|
+
{ limit: -1 },
|
|
256
|
+
{ limit: 10, offset: "1; --" },
|
|
257
|
+
{ classNames: "BisCore:SpatialViewDefinition" },
|
|
258
|
+
{ classNames: [1] },
|
|
259
|
+
{ tags: [{}] },
|
|
260
|
+
{ owner: 1 },
|
|
261
|
+
{ nameSearch: { $ne: "" } },
|
|
262
|
+
{ group: 5 },
|
|
263
|
+
{ group: ["group2"] },
|
|
264
|
+
null,
|
|
265
|
+
undefined,
|
|
266
|
+
];
|
|
267
|
+
for (const params of badParams) {
|
|
268
|
+
// must be rejected by validation with a ViewStoreError, not fail later with a generic or native error
|
|
269
|
+
expect(() => vs1.queryViewsSync(params), String(JSON.stringify(params))).throws().that.satisfies((e) => ViewStoreError.isError(e, "invalid-value"));
|
|
270
|
+
}
|
|
271
|
+
expect(vs1.queryViewsSync({ owner: "", nameSearch: "", group: "" }).length).equal(allPublicCount); // empty strings are treated as absent
|
|
272
|
+
// owner is optional: without it only public views are returned; with it, that owner's private views are added
|
|
273
|
+
expect(vs1.queryViewsSync({ group: "/" }).every((view) => !view.isPrivate)).to.be.true;
|
|
274
|
+
expect(vs1.queryViewsSync({ group: "/", owner: "someoneElse" }).every((view) => !view.isPrivate)).to.be.true;
|
|
275
|
+
expect(vs1.queryViewsSync({ group: "/", owner: "owner10" }).filter((view) => view.isPrivate).length).equal(4);
|
|
276
|
+
expect(vs1.queryViewsSync({ nameSearch: "my private 2" }).length).equal(0);
|
|
277
|
+
expect(vs1.queryViewsSync({ nameSearch: "my private 2", owner: "someoneElse" }).length).equal(0);
|
|
278
|
+
expect(vs1.queryViewsSync({ nameSearch: "my private 2", owner: "owner10" }).length).equal(1);
|
|
279
|
+
// a limit of 0 means no limit
|
|
280
|
+
expect(vs1.queryViewsSync({ group: "group2", limit: 0 }).length).equal(100);
|
|
281
|
+
expect(vs1.queryViewsSync({ group: "group2", limit: 0, offset: 0 }).length).equal(100);
|
|
282
|
+
// the query statement is cached, so bindings from one call must not leak into the next
|
|
283
|
+
expect(vs1.queryViewsSync({ owner: "owner10" }).length).equal(7);
|
|
284
|
+
expect(vs1.queryViewsSync({}).length).equal(allPublicCount);
|
|
285
|
+
expect(vs1.queryViewsSync({ owner: "owner10", classNames: ["BisCore:SpatialViewDefinition"], nameSearch: "my%", nameCompare: "LIKE", limit: 1 }).length).equal(1);
|
|
286
|
+
expect(vs1.queryViewsSync({ nameSearch: "another view" }).length).equal(1);
|
|
287
|
+
expect(vs1.queryViewsSync({}).length).equal(allPublicCount);
|
|
288
|
+
// arrays are bound as a single JSON value, so their size is not limited by SQLite's bound-variable limit
|
|
289
|
+
const manyClassNames = Array.from({ length: 40000 }, (_, i) => `Fake:Class${i}`);
|
|
290
|
+
expect(vs1.queryViewsSync({ owner: "owner10", classNames: [...manyClassNames, "BisCore:DrawingViewDefinition"] }).length).equal(1);
|
|
291
|
+
expect(vs1.queryViewsSync({}).length).equal(allPublicCount);
|
|
239
292
|
await vs1.renameTag({ oldName: "tag2", newName: "tag2-renamed" });
|
|
240
293
|
views = vs1.queryViewsSync({ tags: ["tag2-renamed"] });
|
|
241
294
|
expect(views.length).equal(3);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewStoreDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ViewStoreDb.test.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 { expect } from \"chai\";\r\nimport { Suite } from \"mocha\";\r\nimport { join } from \"path\";\r\nimport { Guid, GuidString, Logger, LogLevel, OpenMode } from \"@itwin/core-bentley\";\r\nimport { ViewStore } from \"../../ViewStore\";\r\nimport { ThumbnailFormatProps } from \"@itwin/core-common\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\n\r\ndescribe(\"ViewStore\", function (this: Suite) {\r\n this.timeout(0);\r\n\r\n let vs1: ViewStore.ViewDb;\r\n\r\n before(async () => {\r\n Logger.setLevel(\"SQLite\", LogLevel.None); // we're expecting errors\r\n const dbName = join(KnownTestLocations.outputDir, \"viewStore.db\");\r\n ViewStore.ViewDb.createNewDb(dbName);\r\n vs1 = new ViewStore.ViewDb({ guidMap: {} as any });\r\n vs1.openDb(dbName, OpenMode.ReadWrite);\r\n });\r\n\r\n after(async () => {\r\n vs1.closeDb(true);\r\n Logger.setLevel(\"SQLite\", LogLevel.Error);\r\n });\r\n\r\n it(\"ViewDb\", async () => {\r\n const c1 = vs1.addCategorySelectorRow({ name: \"first cat\", json: \"cat1-json\" });\r\n const ds1 = vs1.addDisplayStyleRow({ name: \"first style\", json: \"style1-json\" });\r\n\r\n expect(vs1.getViewByNameSync({ name: \"view1\" })).to.be.undefined;\r\n const v1Id = vs1.addViewRow({ className: \"spatial\", name: \"view1\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n expect(v1Id).equals(1);\r\n\r\n const v1 = vs1.getViewByNameSync({ name: \"view1\" })!;\r\n expect(vs1.findViewIdByName({ name: \"view1\" })).equals(v1Id);\r\n expect(vs1.findViewIdByName({ name: \"/view1\" })).equals(v1Id);\r\n expect(v1.owner).equals(\"owner10\");\r\n expect(v1.className).equals(\"spatial\");\r\n expect(v1.groupId).equals(\"@1\");\r\n expect(v1.isPrivate).to.be.true;\r\n expect(v1.name).equals(\"view1\");\r\n await vs1.updateViewShared({ viewId: v1Id, isShared: true, owner: \"owner10\" });\r\n const v1Updated = vs1.getViewByNameSync({ name: \"view1\" })!;\r\n expect(v1Updated.isPrivate).to.be.false;\r\n\r\n const v1Id2 = vs1.addViewRow({ className: \"spatial\", name: \"v2\", json: \"json-v2\", owner: \"owner1\", groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n expect(v1Id2).equals(2);\r\n const v2 = vs1.getViewRow(v1Id2)!;\r\n expect(v2.name).equals(\"v2\");\r\n vs1.deleteViewRow(v1Id2);\r\n expect(vs1.findViewIdByName({ name: \"v2\", groupId: 1 })).equals(0);\r\n\r\n expect(() => vs1.addViewGroupRow({ name: \"\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \" \", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \"@bad\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \"bad/name\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \"^fd\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \"sd#fd\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewRow({ className: \"spatial\", name: \"@bad\", json: \"json-v2\", owner: \"owner1\", groupId: 1, categorySel: c1, displayStyle: ds1 })).to.throw(\"illegal view\");\r\n expect(() => vs1.addViewRow({ className: \"spatial\", name: \"bad/name\", json: \"json-v2\", owner: \"owner1\", groupId: 1, categorySel: c1, displayStyle: ds1 })).to.throw(\"illegal view\");\r\n\r\n const g1 = vs1.addViewGroupRow({ name: \"group1\", json: \"group1-json\" });\r\n const g2 = vs1.addViewGroupRow({ name: \"group2\", json: \"group2-json\" });\r\n const g3 = vs1.addViewGroupRow({ name: \"group 3\", parentId: g2, json: \"group3-json\" });\r\n const g4 = vs1.addViewGroupRow({ name: \"group4\", parentId: g3, json: \"group3-json\" });\r\n const v2Id = vs1.addViewRow({ className: \"spatial2\", name: \"view2\", json: \"json2\", groupId: g4, categorySel: c1, displayStyle: ds1 });\r\n expect(v2Id).equals(3);\r\n\r\n for (let i = 0; i < 100; i++)\r\n vs1.addViewRow({ className: \"spatial\", name: `test view ${i}`, json: `json${i}`, owner: \"owner1\", groupId: g2, categorySel: c1, displayStyle: ds1 });\r\n\r\n // duplicate name in a group should throw\r\n expect(() => vs1.addViewRow({ className: \"spatial3\", name: \"test view 0\", json: \"json-blah\", owner: \"owner1\", groupId: g2, categorySel: c1, displayStyle: ds1 })).to.throw(\"UNIQUE\");\r\n // allow the same name in different groups\r\n const v103 = vs1.addViewRow({ className: \"spatial3\", name: \"test view 0\", json: \"json-blah\", owner: \"owner1\", groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n const v104 = vs1.addViewRow({ className: \"spatial3\", name: \"another view\", json: \"json-blah\", owner: \"owner10\", groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n\r\n const g3Id = vs1.getViewGroupByName(\"group 3\", g2);\r\n\r\n expect(g3Id).equals(g3);\r\n expect(vs1.findViewGroup(\"group1\")).equals(g1);\r\n expect(vs1.findViewGroup(\"group 3\")).equals(0); // not in the root group\r\n expect(vs1.findViewGroup(\"/group2/group 3/\")).equals(g3);\r\n expect(vs1.findViewGroup(\"/group2/group 3/group4\")).equals(g4);\r\n expect(vs1.findViewGroup(\"group2/group 3/group4\")).equals(g4);\r\n expect(vs1.findViewGroup(ViewStore.fromRowId(g4))).equals(g4);\r\n expect(vs1.findViewGroup(\"group2/group 3/group4/blah\")).equals(0);\r\n expect(vs1.findViewGroup(\"group2/blah/group4\")).equals(0);\r\n expect(vs1.findViewGroup(\"blah\")).equals(0);\r\n expect(vs1.findViewGroup(\"/\")).equals(1);\r\n expect(vs1.findViewGroup(\"\")).equals(1);\r\n\r\n expect(vs1.getViewByNameSync({ name: \"view2\", groupId: g4 })?.groupId).equals(ViewStore.fromRowId(g4));\r\n expect(vs1.findViewIdByName({ name: \"/group2/group 3/group4/view2\" })).equals(v2Id);\r\n expect(vs1.findViewIdByName({ name: \"group2/group 3/group4/view2\" })).equals(v2Id);\r\n expect(vs1.findViewIdByName({ name: `${ViewStore.fromRowId(g4)}/view2` })).equals(v2Id);\r\n expect(vs1.findViewIdByName({ name: \"group2/group 3/group4/not there\" })).equals(0);\r\n expect(vs1.findViewIdByName({ name: \"group2/test view 3\" })).not.equal(0);\r\n\r\n const group3 = vs1.getViewGroup(g3Id)!;\r\n expect(group3.name).equals(\"group 3\");\r\n expect(group3.parentId).equals(g2);\r\n expect(group3.json).equals(\"group3-json\");\r\n await vs1.renameViewGroup({ groupId: g3Id, name: \"group3-updated\" });\r\n vs1.updateViewGroupJson(g3Id, \"group3-json-updated\");\r\n const g3Updated = vs1.getViewGroup(g3Id)!;\r\n expect(g3Updated.name).equals(\"group3-updated\");\r\n expect(g3Updated.json).equals(\"group3-json-updated\");\r\n\r\n expect(vs1.queryViewsSync({ group: \"group2\", classNames: [\"spatial\"] }).length).equals(100);\r\n expect(vs1.queryViewsSync({ group: ViewStore.fromRowId(g4), classNames: [\"spatial2\"] }).length).equals(1);\r\n expect(vs1.queryViewsSync({ classNames: [\"spatial\", \"spatial3\", \"blah\"] }).length).equals(3);\r\n expect(vs1.queryViewsSync({ classNames: [] }).length).equals(0);\r\n expect(vs1.queryViewsSync({ classNames: [\"blah\"] }).length).equals(0);\r\n expect((await vs1.findViewsByOwner({ owner: \"owner1\" })).length).equals(101);\r\n\r\n const thumbnail1 = new Uint8Array([2, 33, 23, 0, 202]);\r\n const format1: ThumbnailFormatProps = { width: 100, height: 200, format: \"jpeg\" };\r\n const format2: ThumbnailFormatProps = { width: 10, height: 20, format: \"png\" };\r\n vs1.addOrReplaceThumbnailRow({ data: thumbnail1, viewId: v1Id, format: format1 });\r\n vs1.addOrReplaceThumbnailRow({ data: thumbnail1, viewId: v2Id, format: format2 });\r\n const thumbnail2 = vs1.getThumbnailRow(v2Id);\r\n expect(thumbnail2?.data).deep.equals(thumbnail1);\r\n expect(thumbnail2?.format).deep.equals(format2);\r\n const thumb3 = new Uint8Array([2, 33, 23, 0, 203]);\r\n vs1.addOrReplaceThumbnailRow({ data: thumb3, viewId: v2Id, format: format2 });\r\n const thumbnail3 = vs1.getThumbnailRow(v2Id);\r\n expect(thumbnail3?.data).deep.equals(thumb3);\r\n vs1.addOrReplaceThumbnailRow({ data: thumbnail1, viewId: 33, format: format1 });\r\n expect(vs1.getThumbnailRow(33)).to.not.be.undefined;\r\n vs1.deleteThumbnailSync(ViewStore.fromRowId(33));\r\n expect(vs1.getThumbnailRow(33)).to.be.undefined;\r\n\r\n await vs1.deleteViewGroup({ name: \"group1\" });\r\n expect(vs1.getViewByNameSync({ name: \"view2\", groupId: g1 })).to.be.undefined;\r\n\r\n const cat01 = vs1.addCategorySelectorRow({ name: \"cat1\", json: \"cat1-json\" });\r\n vs1.addCategorySelectorRow({ name: \"cat2\", json: \"cat2-json\" });\r\n const cat1Id = vs1.findCategorySelectorByName(\"cat1\");\r\n expect(cat1Id).equals(cat01);\r\n let cat1 = vs1.getCategorySelectorRow(cat1Id)!;\r\n expect(cat1.name).equals(\"cat1\");\r\n expect(cat1.json).equals(\"cat1-json\");\r\n await vs1.updateCategorySelectorJson(cat1Id, \"cat1-json-updated\");// eslint-disable-line @typescript-eslint/await-thenable\r\n cat1 = vs1.getCategorySelectorRow(cat1Id)!;\r\n expect(cat1.json).equals(\"cat1-json-updated\");\r\n\r\n vs1.deleteCategorySelectorSync(cat1Id);\r\n expect(vs1.findCategorySelectorByName(\"cat1\")).equals(0);\r\n\r\n const ds01 = vs1.addDisplayStyleRow({ name: \"style1\", json: \"style1-json\" });\r\n vs1.addDisplayStyleRow({ name: \"style2\", json: \"style2-json\" });\r\n const style1Id = vs1.findDisplayStyleByName(\"style1\");\r\n expect(style1Id).equals(ds01);\r\n const style1 = vs1.getDisplayStyleRow(style1Id)!;\r\n expect(style1.name).equals(\"style1\");\r\n expect(style1.json).equals(\"style1-json\");\r\n await vs1.renameDisplayStyle({ id: style1Id, name: \"style1-updated\" });\r\n const style1UpdatedNameId = vs1.findDisplayStyleByName(\"style1-updated\");\r\n expect(style1UpdatedNameId).equals(style1Id);\r\n\r\n vs1.updateDisplayStyleJson(style1Id, \"style1-json-updated\");\r\n const style1Updated = vs1.getDisplayStyleRow(style1Id)!;\r\n expect(style1Updated.json).equals(\"style1-json-updated\");\r\n\r\n vs1.deleteDisplayStyleSync(style1Id);\r\n expect(vs1.findDisplayStyleByName(\"style1\")).equals(0);\r\n expect(vs1.findDisplayStyleByName(\"style2\")).equals(3);\r\n\r\n vs1.addModelSelectorRow({ name: \"model1\", json: \"model1-json\" });\r\n const ms2 = vs1.addModelSelectorRow({ json: \"model2-json\" });\r\n const model1Id = vs1.findModelSelectorByName(\"model1\");\r\n expect(model1Id).equals(1);\r\n const model1 = vs1.getModelSelectorRow(model1Id)!;\r\n expect(model1.name).equals(\"model1\");\r\n expect(model1.json).equals(\"model1-json\");\r\n const model2 = vs1.getModelSelectorRow(ms2)!;\r\n expect(model2.name).undefined;\r\n expect(model2.json).equals(\"model2-json\");\r\n\r\n await vs1.renameModelSelector({ id: model1Id, name: \"model1-updated\" });\r\n const model1UpdatedNameId = vs1.findModelSelectorByName(\"model1-updated\");\r\n expect(model1UpdatedNameId).equals(model1Id);\r\n await vs1.renameModelSelector({ id: model1Id, name: undefined });\r\n expect(vs1.getModelSelectorRow(model1Id)!.name).undefined;\r\n\r\n vs1.updateModelSelectorJson(model1Id, \"model1-json-updated\");\r\n const model1Updated = vs1.getModelSelectorRow(model1Id)!;\r\n expect(model1Updated.json).equals(\"model1-json-updated\");\r\n\r\n vs1.deleteModelSelectorSync(model1Id);\r\n expect(vs1.findModelSelectorByName(\"model1\")).equals(0);\r\n\r\n vs1.addTimelineRow({ name: \"timeline1\", json: \"timeline1-json\" });\r\n vs1.addTimelineRow({ name: \"timeline2\", json: \"timeline2-json\" });\r\n const timeline1Id = vs1.findTimelineByName(\"timeline1\");\r\n const timeline2Id = vs1.findTimelineByName(\"timeline2\");\r\n expect(timeline1Id).equals(1);\r\n const timeline1 = vs1.getTimelineRow(timeline1Id)!;\r\n expect(timeline1.name).equals(\"timeline1\");\r\n expect(timeline1.json).equals(\"timeline1-json\");\r\n\r\n await vs1.renameTimeline({ id: timeline1Id, name: \"timeline1-updated\" });\r\n const timeline1UpdatedNameId = vs1.findTimelineByName(\"timeline1-updated\");\r\n expect(timeline1UpdatedNameId).equals(timeline1Id);\r\n\r\n vs1.updateTimelineJson(timeline1Id, \"timeline1-json-updated\");\r\n const timeline1Updated = vs1.getTimelineRow(timeline1Id)!;\r\n expect(timeline1Updated.json).equals(\"timeline1-json-updated\");\r\n\r\n vs1.deleteTimelineSync(timeline2Id);\r\n expect(vs1.findTimelineByName(\"timeline2\")).equals(0);\r\n\r\n const t1 = vs1.addTag({ name: \"tag1\", json: \"tag1-json\", owner: \"owner1\" });\r\n vs1.addTag({ name: \"tag2\", json: \"tag2-json\" });\r\n const tag1Id = vs1.findTagByName(\"tag1\");\r\n expect(tag1Id).equals(t1);\r\n const tag1 = vs1.getTag(tag1Id)!;\r\n expect(tag1.name).equals(\"tag1\");\r\n expect(tag1.json).equals(\"tag1-json\");\r\n expect(tag1.owner).equals(\"owner1\");\r\n for (let i = 0; i < 5; i++)\r\n vs1.addTag({ name: `test tag ${i}`, json: `newTag${i}-json` });\r\n\r\n vs1.addTagToView({ viewId: v1Id, tagId: tag1Id });\r\n vs1.addTagToView({ viewId: v1Id, tagId: 2 });\r\n vs1.addTagToView({ viewId: v103, tagId: 2 });\r\n vs1.addTagToView({ viewId: v104, tagId: 2 });\r\n vs1.addTagToView({ viewId: v1Id, tagId: 3 });\r\n const taggedViewIds = vs1.findViewsForTag(tag1Id);\r\n expect(taggedViewIds.length).equals(1);\r\n expect(taggedViewIds[0]).equals(v1Id);\r\n const tags = vs1.getTagsForView(v1Id)!;\r\n expect(tags.length).equals(3);\r\n expect(tags[0]).equals(\"tag1\");\r\n expect(tags[1]).equals(\"tag2\");\r\n expect(tags[2]).equals(\"test tag 0\");\r\n\r\n vs1.addViewRow({ className: \"BisCore:SpatialViewDefinition\", name: \"my private 2\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n vs1.addViewRow({ className: \"BisCore:OrthographicViewDefinition\", name: \"my private 3\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n vs1.addViewRow({ className: \"BisCore:SheetViewDefinition\", name: \"sheet 3\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n vs1.addViewRow({ className: \"BisCore:DrawingViewDefinition\", name: \"drawing 3\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n\r\n let views = vs1.queryViewsSync({ group: \"/\" });\r\n expect(views.length).equals(3);\r\n expect(views[0].name).equals(\"another view\");\r\n expect(vs1.queryViewsSync({ group: \"group1\" }).length).equals(0);\r\n expect(vs1.queryViewsSync({ group: \"group2\" }).length).equal(100);\r\n expect(vs1.queryViewsSync({ group: \"group2\", offset: 20, limit: 10 }).length).equals(10);\r\n expect(vs1.queryViewsSync({ group: \"group2\", offset: 20, limit: 100 }).length).equals(80);\r\n views = vs1.queryViewsSync({ group: \"group2\", nameSearch: \"%20%\", nameCompare: \"LIKE\" });\r\n expect(views.length).equals(1);\r\n expect(views[0].name).equals(\"test view 20\");\r\n views = vs1.queryViewsSync({ group: \"group2\", nameSearch: \"*2*\", nameCompare: \"GLOB\" });\r\n expect(views.length).equals(19);\r\n expect(vs1.queryViewsSync({ group: \"group2\", tags: [\"tag1\"] }).length).equal(0);\r\n expect(vs1.queryViewsSync({ tags: [\"tag1\"] }).length).equal(1);\r\n views = vs1.queryViewsSync({ tags: [\"tag2\", \"tag1\"] });\r\n expect(views.length).equal(3);\r\n expect(views[2].tags?.length).equal(3);\r\n views = vs1.queryViewsSync({ owner: \"owner10\" });\r\n expect(views.length).equal(7);\r\n views = vs1.queryViewsSync({ owner: \"owner10\", nameSearch: \"my%\", nameCompare: \"LIKE\" });\r\n expect(views.length).equal(2);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [\"BisCore:SpatialViewDefinition\"] }).length).equal(1);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [\"BisCore:SpatialViewDefinition\", \"BisCore:OrthographicViewDefinition\"] }).length).equal(2);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [\"BisCore:DrawingViewDefinition\"] }).length).equal(1);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [\"BisCore:DrawingViewDefinition\", \"BisCore:SheetViewDefinition\"] }).length).equal(2);\r\n\r\n await vs1.renameTag({ oldName: \"tag2\", newName: \"tag2-renamed\" });\r\n views = vs1.queryViewsSync({ tags: [\"tag2-renamed\"] });\r\n expect(views.length).equal(3);\r\n\r\n vs1.deleteTagSync({ name: \"tag2-renamed\" });\r\n const tagIdsAfterDelete = vs1.getTagsForView(v1Id)!;\r\n expect(tagIdsAfterDelete.length).equals(2);\r\n expect(tagIdsAfterDelete[0]).equals(\"tag1\");\r\n expect(tagIdsAfterDelete[1]).equals(\"test tag 0\");\r\n\r\n await vs1.addSearch({ name: \"search1\", json: \"search1-json\" });\r\n const search2 = await vs1.addSearch({ name: \"search2\", json: \"search2-json\" });\r\n await expect(vs1.addSearch({ name: \"search1\", json: \"search1-json\" })).to.be.rejectedWith(\"UNIQUE\");\r\n const search1Id = vs1.findSearchByName(\"search1\");\r\n expect(search1Id).equals(1);\r\n const search1 = vs1.getSearch(search1Id)!;\r\n expect(search1.name).equals(\"search1\");\r\n expect(search1.json).equals(\"search1-json\");\r\n await vs1.renameSearch({ id: search1Id, name: \"search1-updated\" });\r\n const search1UpdatedNameId = vs1.findSearchByName(\"search1-updated\");\r\n expect(search1UpdatedNameId).equals(search1Id);\r\n vs1.updateSearchJson(search1Id, \"search1-json-updated\");\r\n const search1Updated = vs1.getSearch(search1Id)!;\r\n expect(search1Updated.json).equals(\"search1-json-updated\");\r\n vs1.deleteSearch(search2);\r\n expect(vs1.findSearchByName(\"search2\")).equals(0);\r\n\r\n const guids: GuidString[] = [];\r\n const rowIds: ViewStore.RowId[] = [];\r\n const nGuids = 1000;\r\n for (let i = 0; i < nGuids; i++) {\r\n const guid = Guid.createValue();\r\n const rowId = vs1.addGuid(guid);\r\n guids.push(guid);\r\n rowIds.push(rowId);\r\n }\r\n for (let i = 0; i < nGuids; i++) {\r\n expect(vs1.getGuid(rowIds[i])).equals(guids[i]);\r\n expect(vs1.addGuid(guids[i])).equals(rowIds[i]);\r\n }\r\n\r\n let count = 0;\r\n vs1.iterateGuids(rowIds, (guid: GuidString, row: ViewStore.RowId) => {\r\n count++;\r\n expect(guid).not.undefined;\r\n expect(guids.indexOf(guid)).not.equals(-1);\r\n const rowString1 = ViewStore.fromRowId(row);\r\n expect(rowString1.startsWith(\"@\")).true;\r\n expect(ViewStore.toRowId(rowString1)).equals(row); // round trip\r\n });\r\n expect(count).equals(nGuids);\r\n\r\n const largeNumber = 0x7ffffffffffff;\r\n expect(ViewStore.toRowId(ViewStore.fromRowId(largeNumber))).equals(largeNumber);\r\n\r\n vs1.vacuum();\r\n });\r\n\r\n it(\"selector queries should skip undefined and null bindings\", async () => {\r\n const dbName = join(KnownTestLocations.outputDir, \"viewStoreBindings.db\");\r\n if (IModelJsFs.existsSync(dbName))\r\n IModelJsFs.removeSync(dbName);\r\n const snapshot = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n const vs = new ViewStore.ViewDb({ guidMap: {} as any });\r\n try {\r\n ViewStore.ViewDb.createNewDb(dbName);\r\n vs.openDb(dbName, OpenMode.ReadWrite);\r\n vs.iModel = snapshot;\r\n\r\n const selectorId = await vs.addCategorySelector({ selector: { query: { from: \"BisCore:SpatialCategory\" } } });\r\n\r\n const baseline = vs.getCategorySelectorSync({ id: selectorId });\r\n expect(baseline.categories.length).greaterThan(0);\r\n\r\n // Undefined/null bindings not referenced by the query must be skipped (legacy ECSqlStatement.bindValues\r\n // semantics, per ViewStoreRpc.QueryBindings), not bound as NULL.\r\n const withUnusedUndefined = vs.getCategorySelectorSync({ id: selectorId, bindings: { parent: undefined } });\r\n expect(withUnusedUndefined.categories).deep.equal(baseline.categories);\r\n\r\n const withUnusedNull = vs.getCategorySelectorSync({ id: selectorId, bindings: { parent: null } });\r\n expect(withUnusedNull.categories).deep.equal(baseline.categories);\r\n } finally {\r\n if (vs.isOpen)\r\n vs.closeDb();\r\n if (snapshot.isOpen)\r\n snapshot.close();\r\n }\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"ViewStoreDb.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ViewStoreDb.test.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 { expect } from \"chai\";\r\nimport { Suite } from \"mocha\";\r\nimport { join } from \"path\";\r\nimport { Guid, GuidString, Logger, LogLevel, OpenMode } from \"@itwin/core-bentley\";\r\nimport { ViewStore } from \"../../ViewStore\";\r\nimport { ThumbnailFormatProps, ViewStoreError } from \"@itwin/core-common\";\r\nimport { KnownTestLocations } from \"../KnownTestLocations\";\r\nimport { SnapshotDb } from \"../../IModelDb\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\n\r\ndescribe(\"ViewStore\", function (this: Suite) {\r\n this.timeout(0);\r\n\r\n let vs1: ViewStore.ViewDb;\r\n\r\n before(async () => {\r\n Logger.setLevel(\"SQLite\", LogLevel.None); // we're expecting errors\r\n const dbName = join(KnownTestLocations.outputDir, \"viewStore.db\");\r\n ViewStore.ViewDb.createNewDb(dbName);\r\n vs1 = new ViewStore.ViewDb({ guidMap: {} as any });\r\n vs1.openDb(dbName, OpenMode.ReadWrite);\r\n });\r\n\r\n after(async () => {\r\n vs1.closeDb(true);\r\n Logger.setLevel(\"SQLite\", LogLevel.Error);\r\n });\r\n\r\n it(\"ViewDb\", async () => {\r\n const c1 = vs1.addCategorySelectorRow({ name: \"first cat\", json: \"cat1-json\" });\r\n const ds1 = vs1.addDisplayStyleRow({ name: \"first style\", json: \"style1-json\" });\r\n\r\n expect(vs1.getViewByNameSync({ name: \"view1\" })).to.be.undefined;\r\n const v1Id = vs1.addViewRow({ className: \"spatial\", name: \"view1\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n expect(v1Id).equals(1);\r\n\r\n const v1 = vs1.getViewByNameSync({ name: \"view1\" })!;\r\n expect(vs1.findViewIdByName({ name: \"view1\" })).equals(v1Id);\r\n expect(vs1.findViewIdByName({ name: \"/view1\" })).equals(v1Id);\r\n expect(v1.owner).equals(\"owner10\");\r\n expect(v1.className).equals(\"spatial\");\r\n expect(v1.groupId).equals(\"@1\");\r\n expect(v1.isPrivate).to.be.true;\r\n expect(v1.name).equals(\"view1\");\r\n await vs1.updateViewShared({ viewId: v1Id, isShared: true, owner: \"owner10\" });\r\n const v1Updated = vs1.getViewByNameSync({ name: \"view1\" })!;\r\n expect(v1Updated.isPrivate).to.be.false;\r\n\r\n const v1Id2 = vs1.addViewRow({ className: \"spatial\", name: \"v2\", json: \"json-v2\", owner: \"owner1\", groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n expect(v1Id2).equals(2);\r\n const v2 = vs1.getViewRow(v1Id2)!;\r\n expect(v2.name).equals(\"v2\");\r\n vs1.deleteViewRow(v1Id2);\r\n expect(vs1.findViewIdByName({ name: \"v2\", groupId: 1 })).equals(0);\r\n\r\n expect(() => vs1.addViewGroupRow({ name: \"\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \" \", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \"@bad\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \"bad/name\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \"^fd\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewGroupRow({ name: \"sd#fd\", json: \"\" })).to.throw(\"illegal group\");\r\n expect(() => vs1.addViewRow({ className: \"spatial\", name: \"@bad\", json: \"json-v2\", owner: \"owner1\", groupId: 1, categorySel: c1, displayStyle: ds1 })).to.throw(\"illegal view\");\r\n expect(() => vs1.addViewRow({ className: \"spatial\", name: \"bad/name\", json: \"json-v2\", owner: \"owner1\", groupId: 1, categorySel: c1, displayStyle: ds1 })).to.throw(\"illegal view\");\r\n\r\n const g1 = vs1.addViewGroupRow({ name: \"group1\", json: \"group1-json\" });\r\n const g2 = vs1.addViewGroupRow({ name: \"group2\", json: \"group2-json\" });\r\n const g3 = vs1.addViewGroupRow({ name: \"group 3\", parentId: g2, json: \"group3-json\" });\r\n const g4 = vs1.addViewGroupRow({ name: \"group4\", parentId: g3, json: \"group3-json\" });\r\n const v2Id = vs1.addViewRow({ className: \"spatial2\", name: \"view2\", json: \"json2\", groupId: g4, categorySel: c1, displayStyle: ds1 });\r\n expect(v2Id).equals(3);\r\n\r\n for (let i = 0; i < 100; i++)\r\n vs1.addViewRow({ className: \"spatial\", name: `test view ${i}`, json: `json${i}`, owner: \"owner1\", groupId: g2, categorySel: c1, displayStyle: ds1 });\r\n\r\n // duplicate name in a group should throw\r\n expect(() => vs1.addViewRow({ className: \"spatial3\", name: \"test view 0\", json: \"json-blah\", owner: \"owner1\", groupId: g2, categorySel: c1, displayStyle: ds1 })).to.throw(\"UNIQUE\");\r\n // allow the same name in different groups\r\n const v103 = vs1.addViewRow({ className: \"spatial3\", name: \"test view 0\", json: \"json-blah\", owner: \"owner1\", groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n const v104 = vs1.addViewRow({ className: \"spatial3\", name: \"another view\", json: \"json-blah\", owner: \"owner10\", groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n\r\n const g3Id = vs1.getViewGroupByName(\"group 3\", g2);\r\n\r\n expect(g3Id).equals(g3);\r\n expect(vs1.findViewGroup(\"group1\")).equals(g1);\r\n expect(vs1.findViewGroup(\"group 3\")).equals(0); // not in the root group\r\n expect(vs1.findViewGroup(\"/group2/group 3/\")).equals(g3);\r\n expect(vs1.findViewGroup(\"/group2/group 3/group4\")).equals(g4);\r\n expect(vs1.findViewGroup(\"group2/group 3/group4\")).equals(g4);\r\n expect(vs1.findViewGroup(ViewStore.fromRowId(g4))).equals(g4);\r\n expect(vs1.findViewGroup(\"group2/group 3/group4/blah\")).equals(0);\r\n expect(vs1.findViewGroup(\"group2/blah/group4\")).equals(0);\r\n expect(vs1.findViewGroup(\"blah\")).equals(0);\r\n expect(vs1.findViewGroup(\"/\")).equals(1);\r\n expect(vs1.findViewGroup(\"\")).equals(1);\r\n\r\n expect(vs1.getViewByNameSync({ name: \"view2\", groupId: g4 })?.groupId).equals(ViewStore.fromRowId(g4));\r\n expect(vs1.findViewIdByName({ name: \"/group2/group 3/group4/view2\" })).equals(v2Id);\r\n expect(vs1.findViewIdByName({ name: \"group2/group 3/group4/view2\" })).equals(v2Id);\r\n expect(vs1.findViewIdByName({ name: `${ViewStore.fromRowId(g4)}/view2` })).equals(v2Id);\r\n expect(vs1.findViewIdByName({ name: \"group2/group 3/group4/not there\" })).equals(0);\r\n expect(vs1.findViewIdByName({ name: \"group2/test view 3\" })).not.equal(0);\r\n\r\n const group3 = vs1.getViewGroup(g3Id)!;\r\n expect(group3.name).equals(\"group 3\");\r\n expect(group3.parentId).equals(g2);\r\n expect(group3.json).equals(\"group3-json\");\r\n await vs1.renameViewGroup({ groupId: g3Id, name: \"group3-updated\" });\r\n vs1.updateViewGroupJson(g3Id, \"group3-json-updated\");\r\n const g3Updated = vs1.getViewGroup(g3Id)!;\r\n expect(g3Updated.name).equals(\"group3-updated\");\r\n expect(g3Updated.json).equals(\"group3-json-updated\");\r\n\r\n expect(vs1.queryViewsSync({ group: \"group2\", classNames: [\"spatial\"] }).length).equals(100);\r\n expect(vs1.queryViewsSync({ group: ViewStore.fromRowId(g4), classNames: [\"spatial2\"] }).length).equals(1);\r\n expect(vs1.queryViewsSync({ classNames: [\"spatial\", \"spatial3\", \"blah\"] }).length).equals(3);\r\n expect(vs1.queryViewsSync({ classNames: [] }).length).equals(0);\r\n expect(vs1.queryViewsSync({ classNames: [\"blah\"] }).length).equals(0);\r\n expect((await vs1.findViewsByOwner({ owner: \"owner1\" })).length).equals(101);\r\n\r\n const thumbnail1 = new Uint8Array([2, 33, 23, 0, 202]);\r\n const format1: ThumbnailFormatProps = { width: 100, height: 200, format: \"jpeg\" };\r\n const format2: ThumbnailFormatProps = { width: 10, height: 20, format: \"png\" };\r\n vs1.addOrReplaceThumbnailRow({ data: thumbnail1, viewId: v1Id, format: format1 });\r\n vs1.addOrReplaceThumbnailRow({ data: thumbnail1, viewId: v2Id, format: format2 });\r\n const thumbnail2 = vs1.getThumbnailRow(v2Id);\r\n expect(thumbnail2?.data).deep.equals(thumbnail1);\r\n expect(thumbnail2?.format).deep.equals(format2);\r\n const thumb3 = new Uint8Array([2, 33, 23, 0, 203]);\r\n vs1.addOrReplaceThumbnailRow({ data: thumb3, viewId: v2Id, format: format2 });\r\n const thumbnail3 = vs1.getThumbnailRow(v2Id);\r\n expect(thumbnail3?.data).deep.equals(thumb3);\r\n vs1.addOrReplaceThumbnailRow({ data: thumbnail1, viewId: 33, format: format1 });\r\n expect(vs1.getThumbnailRow(33)).to.not.be.undefined;\r\n vs1.deleteThumbnailSync(ViewStore.fromRowId(33));\r\n expect(vs1.getThumbnailRow(33)).to.be.undefined;\r\n\r\n await vs1.deleteViewGroup({ name: \"group1\" });\r\n expect(vs1.getViewByNameSync({ name: \"view2\", groupId: g1 })).to.be.undefined;\r\n\r\n const cat01 = vs1.addCategorySelectorRow({ name: \"cat1\", json: \"cat1-json\" });\r\n vs1.addCategorySelectorRow({ name: \"cat2\", json: \"cat2-json\" });\r\n const cat1Id = vs1.findCategorySelectorByName(\"cat1\");\r\n expect(cat1Id).equals(cat01);\r\n let cat1 = vs1.getCategorySelectorRow(cat1Id)!;\r\n expect(cat1.name).equals(\"cat1\");\r\n expect(cat1.json).equals(\"cat1-json\");\r\n await vs1.updateCategorySelectorJson(cat1Id, \"cat1-json-updated\");// eslint-disable-line @typescript-eslint/await-thenable\r\n cat1 = vs1.getCategorySelectorRow(cat1Id)!;\r\n expect(cat1.json).equals(\"cat1-json-updated\");\r\n\r\n vs1.deleteCategorySelectorSync(cat1Id);\r\n expect(vs1.findCategorySelectorByName(\"cat1\")).equals(0);\r\n\r\n const ds01 = vs1.addDisplayStyleRow({ name: \"style1\", json: \"style1-json\" });\r\n vs1.addDisplayStyleRow({ name: \"style2\", json: \"style2-json\" });\r\n const style1Id = vs1.findDisplayStyleByName(\"style1\");\r\n expect(style1Id).equals(ds01);\r\n const style1 = vs1.getDisplayStyleRow(style1Id)!;\r\n expect(style1.name).equals(\"style1\");\r\n expect(style1.json).equals(\"style1-json\");\r\n await vs1.renameDisplayStyle({ id: style1Id, name: \"style1-updated\" });\r\n const style1UpdatedNameId = vs1.findDisplayStyleByName(\"style1-updated\");\r\n expect(style1UpdatedNameId).equals(style1Id);\r\n\r\n vs1.updateDisplayStyleJson(style1Id, \"style1-json-updated\");\r\n const style1Updated = vs1.getDisplayStyleRow(style1Id)!;\r\n expect(style1Updated.json).equals(\"style1-json-updated\");\r\n\r\n vs1.deleteDisplayStyleSync(style1Id);\r\n expect(vs1.findDisplayStyleByName(\"style1\")).equals(0);\r\n expect(vs1.findDisplayStyleByName(\"style2\")).equals(3);\r\n\r\n vs1.addModelSelectorRow({ name: \"model1\", json: \"model1-json\" });\r\n const ms2 = vs1.addModelSelectorRow({ json: \"model2-json\" });\r\n const model1Id = vs1.findModelSelectorByName(\"model1\");\r\n expect(model1Id).equals(1);\r\n const model1 = vs1.getModelSelectorRow(model1Id)!;\r\n expect(model1.name).equals(\"model1\");\r\n expect(model1.json).equals(\"model1-json\");\r\n const model2 = vs1.getModelSelectorRow(ms2)!;\r\n expect(model2.name).undefined;\r\n expect(model2.json).equals(\"model2-json\");\r\n\r\n await vs1.renameModelSelector({ id: model1Id, name: \"model1-updated\" });\r\n const model1UpdatedNameId = vs1.findModelSelectorByName(\"model1-updated\");\r\n expect(model1UpdatedNameId).equals(model1Id);\r\n await vs1.renameModelSelector({ id: model1Id, name: undefined });\r\n expect(vs1.getModelSelectorRow(model1Id)!.name).undefined;\r\n\r\n vs1.updateModelSelectorJson(model1Id, \"model1-json-updated\");\r\n const model1Updated = vs1.getModelSelectorRow(model1Id)!;\r\n expect(model1Updated.json).equals(\"model1-json-updated\");\r\n\r\n vs1.deleteModelSelectorSync(model1Id);\r\n expect(vs1.findModelSelectorByName(\"model1\")).equals(0);\r\n\r\n vs1.addTimelineRow({ name: \"timeline1\", json: \"timeline1-json\" });\r\n vs1.addTimelineRow({ name: \"timeline2\", json: \"timeline2-json\" });\r\n const timeline1Id = vs1.findTimelineByName(\"timeline1\");\r\n const timeline2Id = vs1.findTimelineByName(\"timeline2\");\r\n expect(timeline1Id).equals(1);\r\n const timeline1 = vs1.getTimelineRow(timeline1Id)!;\r\n expect(timeline1.name).equals(\"timeline1\");\r\n expect(timeline1.json).equals(\"timeline1-json\");\r\n\r\n await vs1.renameTimeline({ id: timeline1Id, name: \"timeline1-updated\" });\r\n const timeline1UpdatedNameId = vs1.findTimelineByName(\"timeline1-updated\");\r\n expect(timeline1UpdatedNameId).equals(timeline1Id);\r\n\r\n vs1.updateTimelineJson(timeline1Id, \"timeline1-json-updated\");\r\n const timeline1Updated = vs1.getTimelineRow(timeline1Id)!;\r\n expect(timeline1Updated.json).equals(\"timeline1-json-updated\");\r\n\r\n vs1.deleteTimelineSync(timeline2Id);\r\n expect(vs1.findTimelineByName(\"timeline2\")).equals(0);\r\n\r\n const t1 = vs1.addTag({ name: \"tag1\", json: \"tag1-json\", owner: \"owner1\" });\r\n vs1.addTag({ name: \"tag2\", json: \"tag2-json\" });\r\n const tag1Id = vs1.findTagByName(\"tag1\");\r\n expect(tag1Id).equals(t1);\r\n const tag1 = vs1.getTag(tag1Id)!;\r\n expect(tag1.name).equals(\"tag1\");\r\n expect(tag1.json).equals(\"tag1-json\");\r\n expect(tag1.owner).equals(\"owner1\");\r\n for (let i = 0; i < 5; i++)\r\n vs1.addTag({ name: `test tag ${i}`, json: `newTag${i}-json` });\r\n\r\n vs1.addTagToView({ viewId: v1Id, tagId: tag1Id });\r\n vs1.addTagToView({ viewId: v1Id, tagId: 2 });\r\n vs1.addTagToView({ viewId: v103, tagId: 2 });\r\n vs1.addTagToView({ viewId: v104, tagId: 2 });\r\n vs1.addTagToView({ viewId: v1Id, tagId: 3 });\r\n const taggedViewIds = vs1.findViewsForTag(tag1Id);\r\n expect(taggedViewIds.length).equals(1);\r\n expect(taggedViewIds[0]).equals(v1Id);\r\n const tags = vs1.getTagsForView(v1Id)!;\r\n expect(tags.length).equals(3);\r\n expect(tags[0]).equals(\"tag1\");\r\n expect(tags[1]).equals(\"tag2\");\r\n expect(tags[2]).equals(\"test tag 0\");\r\n\r\n vs1.addViewRow({ className: \"BisCore:SpatialViewDefinition\", name: \"my private 2\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n vs1.addViewRow({ className: \"BisCore:OrthographicViewDefinition\", name: \"my private 3\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n vs1.addViewRow({ className: \"BisCore:SheetViewDefinition\", name: \"sheet 3\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n vs1.addViewRow({ className: \"BisCore:DrawingViewDefinition\", name: \"drawing 3\", json: \"json1\", owner: \"owner10\", isPrivate: true, groupId: 1, categorySel: c1, displayStyle: ds1 });\r\n\r\n let views = vs1.queryViewsSync({ group: \"/\" });\r\n expect(views.length).equals(3);\r\n expect(views[0].name).equals(\"another view\");\r\n expect(vs1.queryViewsSync({ group: \"group1\" }).length).equals(0);\r\n expect(vs1.queryViewsSync({ group: \"group2\" }).length).equal(100);\r\n expect(vs1.queryViewsSync({ group: \"group2\", offset: 20, limit: 10 }).length).equals(10);\r\n expect(vs1.queryViewsSync({ group: \"group2\", offset: 20, limit: 100 }).length).equals(80);\r\n views = vs1.queryViewsSync({ group: \"group2\", nameSearch: \"%20%\", nameCompare: \"LIKE\" });\r\n expect(views.length).equals(1);\r\n expect(views[0].name).equals(\"test view 20\");\r\n views = vs1.queryViewsSync({ group: \"group2\", nameSearch: \"*2*\", nameCompare: \"GLOB\" });\r\n expect(views.length).equals(19);\r\n expect(vs1.queryViewsSync({ group: \"group2\", tags: [\"tag1\"] }).length).equal(0);\r\n expect(vs1.queryViewsSync({ tags: [\"tag1\"] }).length).equal(1);\r\n views = vs1.queryViewsSync({ tags: [\"tag2\", \"tag1\"] });\r\n expect(views.length).equal(3);\r\n expect(views[2].tags?.length).equal(3);\r\n views = vs1.queryViewsSync({ owner: \"owner10\" });\r\n expect(views.length).equal(7);\r\n views = vs1.queryViewsSync({ owner: \"owner10\", nameSearch: \"my%\", nameCompare: \"LIKE\" });\r\n expect(views.length).equal(2);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [\"BisCore:SpatialViewDefinition\"] }).length).equal(1);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [\"BisCore:SpatialViewDefinition\", \"BisCore:OrthographicViewDefinition\"] }).length).equal(2);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [\"BisCore:DrawingViewDefinition\"] }).length).equal(1);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [\"BisCore:DrawingViewDefinition\", \"BisCore:SheetViewDefinition\"] }).length).equal(2);\r\n\r\n // query parameters may come from RPC callers, so values must never be interpreted as SQL\r\n const allPublicCount = vs1.queryViewsSync({}).length;\r\n const injectClause = \"x') OR 1=1 OR className IN('x\";\r\n expect(vs1.queryViewsSync({ classNames: [injectClause] }).length).equal(0);\r\n expect(vs1.queryViewsSync({ classNames: [\"foo') UNION SELECT Id,name,owner,private,1 FROM views -- \"] }).length).equal(0);\r\n expect(vs1.queryViewsSync({ tags: [injectClause] }).length).equal(0);\r\n expect(vs1.queryViewsSync({ classNames: [\"it's\"] }).length).equal(0); // quotes in values must not cause SQL errors\r\n expect(vs1.queryViewsSync({ tags: [\"it's\"] }).length).equal(0);\r\n expect(vs1.queryViewsSync({ nameSearch: \"' OR 1=1 --\" }).length).equal(0);\r\n expect(vs1.queryViewsSync({ group: \"group2\", offset: 95 }).length).equal(5); // offset without limit\r\n const badParams: any[] = [\r\n { nameSearch: \"x\", nameCompare: \"= @name OR 1=1 OR name =\" },\r\n { nameSearch: \"x\", nameCompare: \"like\" },\r\n { limit: \"1 UNION SELECT Id FROM views\" },\r\n { limit: 1.5 },\r\n { limit: -1 },\r\n { limit: 10, offset: \"1; --\" },\r\n { classNames: \"BisCore:SpatialViewDefinition\" },\r\n { classNames: [1] },\r\n { tags: [{}] },\r\n { owner: 1 },\r\n { nameSearch: { $ne: \"\" } },\r\n { group: 5 },\r\n { group: [\"group2\"] },\r\n null,\r\n undefined,\r\n ];\r\n for (const params of badParams) {\r\n // must be rejected by validation with a ViewStoreError, not fail later with a generic or native error\r\n expect(() => vs1.queryViewsSync(params), String(JSON.stringify(params))).throws().that.satisfies((e: unknown) => ViewStoreError.isError(e, \"invalid-value\"));\r\n }\r\n expect(vs1.queryViewsSync({ owner: \"\", nameSearch: \"\", group: \"\" }).length).equal(allPublicCount); // empty strings are treated as absent\r\n\r\n // owner is optional: without it only public views are returned; with it, that owner's private views are added\r\n expect(vs1.queryViewsSync({ group: \"/\" }).every((view) => !view.isPrivate)).to.be.true;\r\n expect(vs1.queryViewsSync({ group: \"/\", owner: \"someoneElse\" }).every((view) => !view.isPrivate)).to.be.true;\r\n expect(vs1.queryViewsSync({ group: \"/\", owner: \"owner10\" }).filter((view) => view.isPrivate).length).equal(4);\r\n expect(vs1.queryViewsSync({ nameSearch: \"my private 2\" }).length).equal(0);\r\n expect(vs1.queryViewsSync({ nameSearch: \"my private 2\", owner: \"someoneElse\" }).length).equal(0);\r\n expect(vs1.queryViewsSync({ nameSearch: \"my private 2\", owner: \"owner10\" }).length).equal(1);\r\n\r\n // a limit of 0 means no limit\r\n expect(vs1.queryViewsSync({ group: \"group2\", limit: 0 }).length).equal(100);\r\n expect(vs1.queryViewsSync({ group: \"group2\", limit: 0, offset: 0 }).length).equal(100);\r\n\r\n // the query statement is cached, so bindings from one call must not leak into the next\r\n expect(vs1.queryViewsSync({ owner: \"owner10\" }).length).equal(7);\r\n expect(vs1.queryViewsSync({}).length).equal(allPublicCount);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [\"BisCore:SpatialViewDefinition\"], nameSearch: \"my%\", nameCompare: \"LIKE\", limit: 1 }).length).equal(1);\r\n expect(vs1.queryViewsSync({ nameSearch: \"another view\" }).length).equal(1);\r\n expect(vs1.queryViewsSync({}).length).equal(allPublicCount);\r\n\r\n // arrays are bound as a single JSON value, so their size is not limited by SQLite's bound-variable limit\r\n const manyClassNames = Array.from({ length: 40000 }, (_, i) => `Fake:Class${i}`);\r\n expect(vs1.queryViewsSync({ owner: \"owner10\", classNames: [...manyClassNames, \"BisCore:DrawingViewDefinition\"] }).length).equal(1);\r\n expect(vs1.queryViewsSync({}).length).equal(allPublicCount);\r\n\r\n await vs1.renameTag({ oldName: \"tag2\", newName: \"tag2-renamed\" });\r\n views = vs1.queryViewsSync({ tags: [\"tag2-renamed\"] });\r\n expect(views.length).equal(3);\r\n\r\n vs1.deleteTagSync({ name: \"tag2-renamed\" });\r\n const tagIdsAfterDelete = vs1.getTagsForView(v1Id)!;\r\n expect(tagIdsAfterDelete.length).equals(2);\r\n expect(tagIdsAfterDelete[0]).equals(\"tag1\");\r\n expect(tagIdsAfterDelete[1]).equals(\"test tag 0\");\r\n\r\n await vs1.addSearch({ name: \"search1\", json: \"search1-json\" });\r\n const search2 = await vs1.addSearch({ name: \"search2\", json: \"search2-json\" });\r\n await expect(vs1.addSearch({ name: \"search1\", json: \"search1-json\" })).to.be.rejectedWith(\"UNIQUE\");\r\n const search1Id = vs1.findSearchByName(\"search1\");\r\n expect(search1Id).equals(1);\r\n const search1 = vs1.getSearch(search1Id)!;\r\n expect(search1.name).equals(\"search1\");\r\n expect(search1.json).equals(\"search1-json\");\r\n await vs1.renameSearch({ id: search1Id, name: \"search1-updated\" });\r\n const search1UpdatedNameId = vs1.findSearchByName(\"search1-updated\");\r\n expect(search1UpdatedNameId).equals(search1Id);\r\n vs1.updateSearchJson(search1Id, \"search1-json-updated\");\r\n const search1Updated = vs1.getSearch(search1Id)!;\r\n expect(search1Updated.json).equals(\"search1-json-updated\");\r\n vs1.deleteSearch(search2);\r\n expect(vs1.findSearchByName(\"search2\")).equals(0);\r\n\r\n const guids: GuidString[] = [];\r\n const rowIds: ViewStore.RowId[] = [];\r\n const nGuids = 1000;\r\n for (let i = 0; i < nGuids; i++) {\r\n const guid = Guid.createValue();\r\n const rowId = vs1.addGuid(guid);\r\n guids.push(guid);\r\n rowIds.push(rowId);\r\n }\r\n for (let i = 0; i < nGuids; i++) {\r\n expect(vs1.getGuid(rowIds[i])).equals(guids[i]);\r\n expect(vs1.addGuid(guids[i])).equals(rowIds[i]);\r\n }\r\n\r\n let count = 0;\r\n vs1.iterateGuids(rowIds, (guid: GuidString, row: ViewStore.RowId) => {\r\n count++;\r\n expect(guid).not.undefined;\r\n expect(guids.indexOf(guid)).not.equals(-1);\r\n const rowString1 = ViewStore.fromRowId(row);\r\n expect(rowString1.startsWith(\"@\")).true;\r\n expect(ViewStore.toRowId(rowString1)).equals(row); // round trip\r\n });\r\n expect(count).equals(nGuids);\r\n\r\n const largeNumber = 0x7ffffffffffff;\r\n expect(ViewStore.toRowId(ViewStore.fromRowId(largeNumber))).equals(largeNumber);\r\n\r\n vs1.vacuum();\r\n });\r\n\r\n it(\"selector queries should skip undefined and null bindings\", async () => {\r\n const dbName = join(KnownTestLocations.outputDir, \"viewStoreBindings.db\");\r\n if (IModelJsFs.existsSync(dbName))\r\n IModelJsFs.removeSync(dbName);\r\n const snapshot = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n const vs = new ViewStore.ViewDb({ guidMap: {} as any });\r\n try {\r\n ViewStore.ViewDb.createNewDb(dbName);\r\n vs.openDb(dbName, OpenMode.ReadWrite);\r\n vs.iModel = snapshot;\r\n\r\n const selectorId = await vs.addCategorySelector({ selector: { query: { from: \"BisCore:SpatialCategory\" } } });\r\n\r\n const baseline = vs.getCategorySelectorSync({ id: selectorId });\r\n expect(baseline.categories.length).greaterThan(0);\r\n\r\n // Undefined/null bindings not referenced by the query must be skipped (legacy ECSqlStatement.bindValues\r\n // semantics, per ViewStoreRpc.QueryBindings), not bound as NULL.\r\n const withUnusedUndefined = vs.getCategorySelectorSync({ id: selectorId, bindings: { parent: undefined } });\r\n expect(withUnusedUndefined.categories).deep.equal(baseline.categories);\r\n\r\n const withUnusedNull = vs.getCategorySelectorSync({ id: selectorId, bindings: { parent: null } });\r\n expect(withUnusedNull.categories).deep.equal(baseline.categories);\r\n } finally {\r\n if (vs.isOpen)\r\n vs.closeDb();\r\n if (snapshot.isOpen)\r\n snapshot.close();\r\n }\r\n });\r\n});\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsContainers.test.d.ts","sourceRoot":"","sources":["../../../../src/test/workspace/SettingsContainers.test.ts"],"names":[],"mappings":""}
|