@itwin/core-backend 5.8.0-dev.8 → 5.9.0-dev.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.
Files changed (503) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/lib/cjs/BackendHubAccess.js.map +1 -1
  3. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  4. package/lib/cjs/BisCoreSchema.js.map +1 -1
  5. package/lib/cjs/BlobContainerService.js.map +1 -1
  6. package/lib/cjs/BriefcaseManager.js.map +1 -1
  7. package/lib/cjs/CatalogDb.js.map +1 -1
  8. package/lib/cjs/Category.js.map +1 -1
  9. package/lib/cjs/ChangeSummaryManager.js +2 -2
  10. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  11. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  12. package/lib/cjs/ChangesetECAdaptor.js +248 -248
  13. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  14. package/lib/cjs/ChannelControl.js.map +1 -1
  15. package/lib/cjs/CheckpointManager.js.map +1 -1
  16. package/lib/cjs/ClassRegistry.js +5 -5
  17. package/lib/cjs/ClassRegistry.js.map +1 -1
  18. package/lib/cjs/CloudSqlite.js.map +1 -1
  19. package/lib/cjs/CodeService.js.map +1 -1
  20. package/lib/cjs/CodeSpecs.js.map +1 -1
  21. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  22. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  23. package/lib/cjs/DevTools.js.map +1 -1
  24. package/lib/cjs/DisplayStyle.js.map +1 -1
  25. package/lib/cjs/ECDb.js.map +1 -1
  26. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  27. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  28. package/lib/cjs/ECSqlStatement.js.map +1 -1
  29. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  30. package/lib/cjs/Element.js.map +1 -1
  31. package/lib/cjs/ElementAspect.js.map +1 -1
  32. package/lib/cjs/ElementGraphics.js.map +1 -1
  33. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  34. package/lib/cjs/Entity.js.map +1 -1
  35. package/lib/cjs/EntityReferences.js.map +1 -1
  36. package/lib/cjs/ExportGraphics.js.map +1 -1
  37. package/lib/cjs/ExternalSource.js.map +1 -1
  38. package/lib/cjs/FontFile.js.map +1 -1
  39. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  40. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  41. package/lib/cjs/GeometrySummary.js +47 -47
  42. package/lib/cjs/GeometrySummary.js.map +1 -1
  43. package/lib/cjs/IModelDb.d.ts +5 -0
  44. package/lib/cjs/IModelDb.d.ts.map +1 -1
  45. package/lib/cjs/IModelDb.js +20 -11
  46. package/lib/cjs/IModelDb.js.map +1 -1
  47. package/lib/cjs/IModelDbFonts.js.map +1 -1
  48. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  49. package/lib/cjs/IModelHost.js.map +1 -1
  50. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  51. package/lib/cjs/IModelJsFs.js.map +1 -1
  52. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  53. package/lib/cjs/IpcHost.d.ts.map +1 -1
  54. package/lib/cjs/IpcHost.js +28 -4
  55. package/lib/cjs/IpcHost.js.map +1 -1
  56. package/lib/cjs/LineStyle.d.ts +6 -0
  57. package/lib/cjs/LineStyle.d.ts.map +1 -1
  58. package/lib/cjs/LineStyle.js +41 -32
  59. package/lib/cjs/LineStyle.js.map +1 -1
  60. package/lib/cjs/LocalHub.d.ts +17 -10
  61. package/lib/cjs/LocalHub.d.ts.map +1 -1
  62. package/lib/cjs/LocalHub.js +127 -29
  63. package/lib/cjs/LocalHub.js.map +1 -1
  64. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  65. package/lib/cjs/LockControl.js.map +1 -1
  66. package/lib/cjs/Material.js.map +1 -1
  67. package/lib/cjs/Model.js.map +1 -1
  68. package/lib/cjs/NativeAppStorage.js.map +1 -1
  69. package/lib/cjs/NativeHost.js.map +1 -1
  70. package/lib/cjs/NavigationRelationship.js.map +1 -1
  71. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  72. package/lib/cjs/PropertyStore.js.map +1 -1
  73. package/lib/cjs/Relationship.js.map +1 -1
  74. package/lib/cjs/RpcBackend.js.map +1 -1
  75. package/lib/cjs/SQLiteDb.js.map +1 -1
  76. package/lib/cjs/Schema.js.map +1 -1
  77. package/lib/cjs/SchemaSync.js.map +1 -1
  78. package/lib/cjs/SchemaUtils.js.map +1 -1
  79. package/lib/cjs/SheetIndex.js.map +1 -1
  80. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  81. package/lib/cjs/SqliteStatement.js.map +1 -1
  82. package/lib/cjs/StashManager.js.map +1 -1
  83. package/lib/cjs/Texture.js.map +1 -1
  84. package/lib/cjs/TileStorage.js.map +1 -1
  85. package/lib/cjs/TxnManager.js.map +1 -1
  86. package/lib/cjs/ViewDefinition.js.map +1 -1
  87. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  88. package/lib/cjs/ViewStore.js.map +1 -1
  89. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  90. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  91. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  92. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  93. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  94. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  95. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  96. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  97. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  98. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  99. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  100. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  101. package/lib/cjs/core-backend.d.ts +2 -0
  102. package/lib/cjs/core-backend.d.ts.map +1 -1
  103. package/lib/cjs/core-backend.js +2 -0
  104. package/lib/cjs/core-backend.js.map +1 -1
  105. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  106. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  107. package/lib/cjs/domains/GenericElements.js.map +1 -1
  108. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  109. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  110. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  111. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  112. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  113. package/lib/cjs/internal/HubMock.js.map +1 -1
  114. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  115. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  116. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  117. package/lib/cjs/internal/NoLocks.js.map +1 -1
  118. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  119. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  120. package/lib/cjs/internal/Symbols.js.map +1 -1
  121. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  122. package/lib/cjs/internal/cross-package.js.map +1 -1
  123. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
  124. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  125. package/lib/cjs/internal/workspace/SettingsDbImpl.js +108 -0
  126. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
  127. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  128. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  129. package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
  130. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
  131. package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -0
  132. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  133. package/lib/cjs/internal/workspace/SettingsImpl.js +8 -4
  134. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  135. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  136. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  137. package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  138. package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
  139. package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
  140. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
  141. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  142. package/lib/cjs/internal/workspace/WorkspaceImpl.js +57 -14
  143. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  144. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  145. package/lib/cjs/rpc/multipart.js.map +1 -1
  146. package/lib/cjs/rpc/tracing.js.map +1 -1
  147. package/lib/cjs/rpc/web/logging.js.map +1 -1
  148. package/lib/cjs/rpc/web/request.js.map +1 -1
  149. package/lib/cjs/rpc/web/response.js.map +1 -1
  150. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  151. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  152. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  153. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  154. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  155. package/lib/cjs/workspace/Settings.d.ts +8 -0
  156. package/lib/cjs/workspace/Settings.d.ts.map +1 -1
  157. package/lib/cjs/workspace/Settings.js.map +1 -1
  158. package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
  159. package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
  160. package/lib/cjs/workspace/SettingsDb.js +19 -0
  161. package/lib/cjs/workspace/SettingsDb.js.map +1 -0
  162. package/lib/cjs/workspace/SettingsEditor.d.ts +250 -0
  163. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
  164. package/lib/cjs/workspace/SettingsEditor.js +53 -0
  165. package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
  166. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  167. package/lib/cjs/workspace/Workspace.d.ts +42 -19
  168. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  169. package/lib/cjs/workspace/Workspace.js.map +1 -1
  170. package/lib/cjs/workspace/WorkspaceEditor.d.ts +32 -1
  171. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  172. package/lib/cjs/workspace/WorkspaceEditor.js +19 -0
  173. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  174. package/lib/esm/BackendHubAccess.js.map +1 -1
  175. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  176. package/lib/esm/BisCoreSchema.js.map +1 -1
  177. package/lib/esm/BlobContainerService.js.map +1 -1
  178. package/lib/esm/BriefcaseManager.js.map +1 -1
  179. package/lib/esm/CatalogDb.js.map +1 -1
  180. package/lib/esm/Category.js.map +1 -1
  181. package/lib/esm/ChangeSummaryManager.js +2 -2
  182. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  183. package/lib/esm/ChangedElementsDb.js.map +1 -1
  184. package/lib/esm/ChangesetECAdaptor.js +248 -248
  185. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  186. package/lib/esm/ChannelControl.js.map +1 -1
  187. package/lib/esm/CheckpointManager.js.map +1 -1
  188. package/lib/esm/ClassRegistry.js +5 -5
  189. package/lib/esm/ClassRegistry.js.map +1 -1
  190. package/lib/esm/CloudSqlite.js.map +1 -1
  191. package/lib/esm/CodeService.js.map +1 -1
  192. package/lib/esm/CodeSpecs.js.map +1 -1
  193. package/lib/esm/ConcurrentQuery.js.map +1 -1
  194. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  195. package/lib/esm/DevTools.js.map +1 -1
  196. package/lib/esm/DisplayStyle.js.map +1 -1
  197. package/lib/esm/ECDb.js.map +1 -1
  198. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  199. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  200. package/lib/esm/ECSqlStatement.js.map +1 -1
  201. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  202. package/lib/esm/Element.js.map +1 -1
  203. package/lib/esm/ElementAspect.js.map +1 -1
  204. package/lib/esm/ElementGraphics.js.map +1 -1
  205. package/lib/esm/ElementTreeWalker.js.map +1 -1
  206. package/lib/esm/Entity.js.map +1 -1
  207. package/lib/esm/EntityReferences.js.map +1 -1
  208. package/lib/esm/ExportGraphics.js.map +1 -1
  209. package/lib/esm/ExternalSource.js.map +1 -1
  210. package/lib/esm/FontFile.js.map +1 -1
  211. package/lib/esm/GeoCoordConfig.js.map +1 -1
  212. package/lib/esm/GeographicCRSServices.js.map +1 -1
  213. package/lib/esm/GeometrySummary.js +47 -47
  214. package/lib/esm/GeometrySummary.js.map +1 -1
  215. package/lib/esm/IModelDb.d.ts +5 -0
  216. package/lib/esm/IModelDb.d.ts.map +1 -1
  217. package/lib/esm/IModelDb.js +20 -11
  218. package/lib/esm/IModelDb.js.map +1 -1
  219. package/lib/esm/IModelDbFonts.js.map +1 -1
  220. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  221. package/lib/esm/IModelHost.js.map +1 -1
  222. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  223. package/lib/esm/IModelJsFs.js.map +1 -1
  224. package/lib/esm/ImageSourceConversion.js.map +1 -1
  225. package/lib/esm/IpcHost.d.ts.map +1 -1
  226. package/lib/esm/IpcHost.js +28 -4
  227. package/lib/esm/IpcHost.js.map +1 -1
  228. package/lib/esm/LineStyle.d.ts +6 -0
  229. package/lib/esm/LineStyle.d.ts.map +1 -1
  230. package/lib/esm/LineStyle.js +41 -32
  231. package/lib/esm/LineStyle.js.map +1 -1
  232. package/lib/esm/LocalHub.d.ts +17 -10
  233. package/lib/esm/LocalHub.d.ts.map +1 -1
  234. package/lib/esm/LocalHub.js +128 -30
  235. package/lib/esm/LocalHub.js.map +1 -1
  236. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  237. package/lib/esm/LockControl.js.map +1 -1
  238. package/lib/esm/Material.js.map +1 -1
  239. package/lib/esm/Model.js.map +1 -1
  240. package/lib/esm/NativeAppStorage.js.map +1 -1
  241. package/lib/esm/NativeHost.js.map +1 -1
  242. package/lib/esm/NavigationRelationship.js.map +1 -1
  243. package/lib/esm/PromiseMemoizer.js.map +1 -1
  244. package/lib/esm/PropertyStore.js.map +1 -1
  245. package/lib/esm/Relationship.js.map +1 -1
  246. package/lib/esm/RpcBackend.js.map +1 -1
  247. package/lib/esm/SQLiteDb.js.map +1 -1
  248. package/lib/esm/Schema.js.map +1 -1
  249. package/lib/esm/SchemaSync.js.map +1 -1
  250. package/lib/esm/SchemaUtils.js.map +1 -1
  251. package/lib/esm/SheetIndex.js.map +1 -1
  252. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  253. package/lib/esm/SqliteStatement.js.map +1 -1
  254. package/lib/esm/StashManager.js.map +1 -1
  255. package/lib/esm/Texture.js.map +1 -1
  256. package/lib/esm/TileStorage.js.map +1 -1
  257. package/lib/esm/TxnManager.js.map +1 -1
  258. package/lib/esm/ViewDefinition.js.map +1 -1
  259. package/lib/esm/ViewStateHydrator.js.map +1 -1
  260. package/lib/esm/ViewStore.js.map +1 -1
  261. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  262. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  263. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  264. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  265. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  266. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  267. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  268. package/lib/esm/core-backend.d.ts +2 -0
  269. package/lib/esm/core-backend.d.ts.map +1 -1
  270. package/lib/esm/core-backend.js +2 -0
  271. package/lib/esm/core-backend.js.map +1 -1
  272. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  273. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  274. package/lib/esm/domains/GenericElements.js.map +1 -1
  275. package/lib/esm/domains/GenericSchema.js.map +1 -1
  276. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  277. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  278. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  279. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  280. package/lib/esm/internal/HubMock.js.map +1 -1
  281. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  282. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  283. package/lib/esm/internal/NativePlatform.js.map +1 -1
  284. package/lib/esm/internal/NoLocks.js.map +1 -1
  285. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  286. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  287. package/lib/esm/internal/Symbols.js.map +1 -1
  288. package/lib/esm/internal/annotations/fields.js.map +1 -1
  289. package/lib/esm/internal/cross-package.js.map +1 -1
  290. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
  291. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
  292. package/lib/esm/internal/workspace/SettingsDbImpl.js +104 -0
  293. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
  294. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  295. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  296. package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
  297. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
  298. package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -0
  299. package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
  300. package/lib/esm/internal/workspace/SettingsImpl.js +5 -2
  301. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  302. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  303. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
  304. package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
  305. package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
  306. package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
  307. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
  308. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  309. package/lib/esm/internal/workspace/WorkspaceImpl.js +57 -15
  310. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  311. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  312. package/lib/esm/rpc/multipart.js.map +1 -1
  313. package/lib/esm/rpc/tracing.js.map +1 -1
  314. package/lib/esm/rpc/web/logging.js.map +1 -1
  315. package/lib/esm/rpc/web/request.js.map +1 -1
  316. package/lib/esm/rpc/web/response.js.map +1 -1
  317. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  318. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  319. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  320. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  321. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  322. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  323. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  324. package/lib/esm/test/AttachDb.test.js +11 -11
  325. package/lib/esm/test/AttachDb.test.js.map +1 -1
  326. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  327. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  328. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  329. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  330. package/lib/esm/test/IModelHost.test.js.map +1 -1
  331. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  332. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  333. package/lib/esm/test/IpcHost.test.js +64 -13
  334. package/lib/esm/test/IpcHost.test.js.map +1 -1
  335. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  336. package/lib/esm/test/PrintElementTree.js.map +1 -1
  337. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  338. package/lib/esm/test/RevisionUtility.js.map +1 -1
  339. package/lib/esm/test/SchemaUtils.test.js +25 -25
  340. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  341. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  342. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
  343. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  344. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  345. package/lib/esm/test/TestUtils.js.map +1 -1
  346. package/lib/esm/test/annotations/Fields.test.js +53 -53
  347. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  348. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  349. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  350. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  351. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  352. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  353. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  354. package/lib/esm/test/categories/Category.test.js.map +1 -1
  355. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  356. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  357. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  358. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
  359. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  360. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  361. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  362. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  363. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  364. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  365. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  366. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  367. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  368. package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
  369. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  370. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  371. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  372. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  373. package/lib/esm/test/ecdb/QueryReaders.test.js +62 -27
  374. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  375. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  376. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
  377. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +4 -1
  378. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  379. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  380. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  381. package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts.map +1 -1
  382. package/lib/esm/test/ecsql/src/ECSqlTestParser.js +4 -0
  383. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  384. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +14 -2
  385. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  386. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  387. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  388. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  389. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  390. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  391. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  392. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  393. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  394. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  395. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  396. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  397. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  398. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  399. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  400. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  401. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  402. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  403. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  404. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  405. package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
  406. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  407. package/lib/esm/test/hubaccess/SemanticRebase.test.js +145 -145
  408. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  409. package/lib/esm/test/imageData.js.map +1 -1
  410. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  411. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  412. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  413. package/lib/esm/test/imodel/IModel.test.js +44 -44
  414. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  415. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  416. package/lib/esm/test/imodel/SchemaXmlImport.test.js +13 -13
  417. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  418. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  419. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  420. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  421. package/lib/esm/test/index.js.map +1 -1
  422. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  423. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  424. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  425. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  426. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  427. package/lib/esm/test/rpc/response.test.js.map +1 -1
  428. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  429. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  430. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  431. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  432. package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
  433. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  434. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
  435. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  436. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  437. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  438. package/lib/esm/test/standalone/ChangesetReader.test.js +135 -135
  439. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  440. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  441. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  442. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  443. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  444. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  445. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  446. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  447. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  448. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  449. package/lib/esm/test/standalone/HubMock.test.js +177 -7
  450. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  451. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  452. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  453. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  454. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  455. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  456. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  457. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  458. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  459. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  460. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  461. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  462. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  463. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  464. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  465. package/lib/esm/test/standalone/Settings.test.js +18 -0
  466. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  467. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  468. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  469. package/lib/esm/test/standalone/StandaloneDb.test.js +51 -1
  470. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  471. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  472. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  473. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  474. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  475. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  476. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  477. package/lib/esm/test/standalone/Workspace.test.js +160 -0
  478. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  479. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
  480. package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
  481. package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
  482. package/lib/esm/test/workspace/SettingsDb.test.js +465 -0
  483. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
  484. package/lib/esm/workspace/Settings.d.ts +8 -0
  485. package/lib/esm/workspace/Settings.d.ts.map +1 -1
  486. package/lib/esm/workspace/Settings.js.map +1 -1
  487. package/lib/esm/workspace/SettingsDb.d.ts +109 -0
  488. package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
  489. package/lib/esm/workspace/SettingsDb.js +16 -0
  490. package/lib/esm/workspace/SettingsDb.js.map +1 -0
  491. package/lib/esm/workspace/SettingsEditor.d.ts +250 -0
  492. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
  493. package/lib/esm/workspace/SettingsEditor.js +50 -0
  494. package/lib/esm/workspace/SettingsEditor.js.map +1 -0
  495. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  496. package/lib/esm/workspace/Workspace.d.ts +42 -19
  497. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  498. package/lib/esm/workspace/Workspace.js.map +1 -1
  499. package/lib/esm/workspace/WorkspaceEditor.d.ts +32 -1
  500. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  501. package/lib/esm/workspace/WorkspaceEditor.js +19 -0
  502. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  503. package/package.json +13 -13
@@ -40,11 +40,11 @@ class LocalHub {
40
40
  const db = this._hubDb = new SQLiteDb_1.SQLiteDb();
41
41
  db.createDb(this.mockDbName);
42
42
  db.executeSQL("CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)");
43
- db.executeSQL("CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,uncompressedSize BIGINT,\
43
+ db.executeSQL("CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,uncompressedSize BIGINT,\
44
44
  FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))");
45
45
  db.executeSQL("CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)");
46
46
  db.executeSQL("CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))");
47
- db.executeSQL("CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastCSetIndex INTEGER,briefcaseId INTEGER)");
47
+ db.executeSQL("CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastExclusiveReleaseChangesetIndex INTEGER,lastSharedReleaseChangesetIndex INTEGER,briefcaseId INTEGER)");
48
48
  db.executeSQL("CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))");
49
49
  db.executeSQL("CREATE INDEX LockIdx ON locks(briefcaseId)");
50
50
  db.executeSQL("CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)");
@@ -383,21 +383,23 @@ class LocalHub {
383
383
  return locks;
384
384
  }
385
385
  queryLockStatus(elementId) {
386
- return this.db.withPreparedSqliteStatement("SELECT lastCSetIndex,level,briefcaseId FROM locks WHERE id=?", (stmt) => {
386
+ return this.db.withPreparedSqliteStatement("SELECT lastSharedReleaseChangesetIndex,lastExclusiveReleaseChangesetIndex,level,briefcaseId FROM locks WHERE id=?", (stmt) => {
387
387
  stmt.bindId(1, elementId);
388
388
  const rc = stmt.step();
389
389
  if (core_bentley_1.DbResult.BE_SQLITE_ROW !== rc)
390
390
  return { state: core_common_1.LockState.None };
391
- const lastCsVal = stmt.getValue(0);
391
+ const lastSharedCsVal = stmt.getValue(0);
392
+ const lastExclusiveCsVal = stmt.getValue(1);
392
393
  const lock = {
393
- lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),
394
- state: stmt.getValueInteger(1),
394
+ lastSharedReleaseChangesetIndex: lastSharedCsVal.isNull ? undefined : lastSharedCsVal.getInteger(),
395
+ lastExclusiveReleaseChangesetIndex: lastExclusiveCsVal.isNull ? undefined : lastExclusiveCsVal.getInteger(),
396
+ state: stmt.getValueInteger(2),
395
397
  };
396
398
  switch (lock.state) {
397
399
  case core_common_1.LockState.None:
398
400
  return lock;
399
401
  case core_common_1.LockState.Exclusive:
400
- return { ...lock, briefcaseId: stmt.getValueInteger(2) };
402
+ return { ...lock, briefcaseId: stmt.getValueInteger(3) };
401
403
  case core_common_1.LockState.Shared:
402
404
  return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };
403
405
  default:
@@ -405,9 +407,37 @@ class LocalHub {
405
407
  }
406
408
  });
407
409
  }
410
+ doesBriefcaseRequirePullBeforeLock(currStatus, props, briefcase) {
411
+ if (props.state === core_common_1.LockState.None)
412
+ return false;
413
+ const briefcaseChangesetIndex = this.getIndexFromChangeset(briefcase.changeset);
414
+ const exclusiveIndexIsNewer = currStatus.lastExclusiveReleaseChangesetIndex !== undefined &&
415
+ currStatus.lastExclusiveReleaseChangesetIndex > briefcaseChangesetIndex;
416
+ if (props.state === core_common_1.LockState.Shared) {
417
+ // To acquire a shared lock, the briefcase must at least at the latest exclusive changeset index
418
+ return exclusiveIndexIsNewer;
419
+ }
420
+ else {
421
+ (0, core_bentley_1.assert)(props.state === core_common_1.LockState.Exclusive);
422
+ const sharedIndexIsNewer = currStatus.lastSharedReleaseChangesetIndex !== undefined &&
423
+ currStatus.lastSharedReleaseChangesetIndex > briefcaseChangesetIndex;
424
+ // To acquire the exclusive lock the briefcase must be at least at the greater of the two last-indexes
425
+ return exclusiveIndexIsNewer || sharedIndexIsNewer;
426
+ }
427
+ }
428
+ addSharedLockRecord(lockId, briefcaseId) {
429
+ this.db.withPreparedSqliteStatement("INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?) ON CONFLICT(lockId,briefcaseId) DO NOTHING", (stmt) => {
430
+ stmt.bindId(1, lockId);
431
+ stmt.bindInteger(2, briefcaseId);
432
+ const rc = stmt.step();
433
+ if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
434
+ throw new core_common_1.IModelError(rc, "cannot insert shared lock");
435
+ });
436
+ }
408
437
  reserveLock(currStatus, props, briefcase) {
409
- if (props.state === core_common_1.LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))
438
+ if (this.doesBriefcaseRequirePullBeforeLock(currStatus, props, briefcase)) {
410
439
  throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.PullIsRequired, "pull is required to obtain lock");
440
+ }
411
441
  const wantShared = props.state === core_common_1.LockState.Shared;
412
442
  if (wantShared && (currStatus.state === core_common_1.LockState.Exclusive))
413
443
  throw new Error("cannot acquire shared lock because an exclusive lock is already held");
@@ -420,15 +450,26 @@ class LocalHub {
420
450
  throw new core_common_1.IModelError(rc, "cannot insert lock");
421
451
  });
422
452
  if (wantShared) {
423
- this.db.withPreparedSqliteStatement("INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)", (stmt) => {
424
- stmt.bindId(1, props.id);
425
- stmt.bindInteger(2, briefcase.briefcaseId);
426
- const rc = stmt.step();
427
- if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
428
- throw new core_common_1.IModelError(rc, "cannot insert shared lock");
429
- });
453
+ this.addSharedLockRecord(props.id, briefcase.briefcaseId);
430
454
  }
431
455
  }
456
+ downgradeExclusiveLockToShared(lockId, briefcaseId) {
457
+ this.db.withPreparedSqliteStatement("UPDATE locks SET level=1,briefcaseId=NULL WHERE id=? AND briefcaseId=? AND level=2", (stmt) => {
458
+ stmt.bindId(1, lockId);
459
+ stmt.bindInteger(2, briefcaseId);
460
+ const rc = stmt.step();
461
+ if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
462
+ throw new core_common_1.IModelError(rc, "can't downgrade lock");
463
+ });
464
+ // Verify that the above actually updated a row. If it didn't, something has gone wrong with the downgrade.
465
+ // This shouldn't happen.
466
+ this.db.withPreparedSqliteStatement("SELECT CHANGES()", (stmt) => {
467
+ stmt.step();
468
+ if (stmt.getValueInteger(0) !== 1)
469
+ throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockOwnedByAnotherBriefcase, "lock not held by this briefcase or lock is not exclusive");
470
+ });
471
+ this.addSharedLockRecord(lockId, briefcaseId);
472
+ }
432
473
  clearLock(id) {
433
474
  this.db.withPreparedSqliteStatement("UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?", (stmt) => {
434
475
  stmt.bindId(1, id);
@@ -437,15 +478,26 @@ class LocalHub {
437
478
  throw new core_common_1.IModelError(rc, "can't release lock");
438
479
  });
439
480
  }
440
- updateLockChangeset(id, index) {
481
+ updateLockExclusiveChangeset(id, index) {
441
482
  if (index <= 0)
442
483
  return;
443
- this.db.withPreparedSqliteStatement("UPDATE locks SET lastCSetIndex=? WHERE id=?", (stmt) => {
484
+ this.db.withPreparedSqliteStatement("UPDATE locks SET lastExclusiveReleaseChangesetIndex=? WHERE id=?", (stmt) => {
444
485
  stmt.bindInteger(1, index);
445
486
  stmt.bindId(2, id);
446
487
  const rc = stmt.step();
447
488
  if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
448
- throw new core_common_1.IModelError(rc, "can't update lock changeSetId");
489
+ throw new core_common_1.IModelError(rc, "can't update lock exclusive changeSetId");
490
+ });
491
+ }
492
+ updateLockSharedChangeset(id, index) {
493
+ if (index <= 0)
494
+ return;
495
+ this.db.withPreparedSqliteStatement("UPDATE locks SET lastSharedReleaseChangesetIndex=? WHERE id=?", (stmt) => {
496
+ stmt.bindInteger(1, index);
497
+ stmt.bindId(2, id);
498
+ const rc = stmt.step();
499
+ if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
500
+ throw new core_common_1.IModelError(rc, "can't update lock shared changeSetId");
449
501
  });
450
502
  }
451
503
  requestLock(props, briefcase) {
@@ -485,23 +537,58 @@ class LocalHub {
485
537
  throw new core_common_1.IModelError(rc, "can't remove shared lock");
486
538
  });
487
539
  }
488
- releaseLock(props, arg) {
540
+ abandonLock(props, briefcase) {
541
+ // When abandoning (but not when releasing), props.state indicates which
542
+ // state we're abandoning _to_. Specifically, an Exclusive lock can be
543
+ // abandoned to either Shared or None.
544
+ // It makes no sense to abandon a lock _to_ the Exclusive state.
545
+ if (props.state === core_common_1.LockState.Exclusive)
546
+ throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.InvalidArgumentError, "must specify Shared or None when abandoning a lock");
489
547
  const lockId = props.id;
490
- const lockStatus = this.queryLockStatus(lockId);
491
- switch (lockStatus.state) {
548
+ const previousLockStatus = this.queryLockStatus(lockId);
549
+ switch (previousLockStatus.state) {
550
+ case core_common_1.LockState.None:
551
+ throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockDoesNotExist, "lock not held");
552
+ case core_common_1.LockState.Exclusive:
553
+ if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)
554
+ throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockOwnedByAnotherBriefcase, "lock not held by this briefcase");
555
+ if (props.state === core_common_1.LockState.Shared) {
556
+ // Exclusive -> Shared
557
+ this.downgradeExclusiveLockToShared(lockId, briefcase.briefcaseId);
558
+ }
559
+ else {
560
+ // Exclusive -> None
561
+ this.clearLock(lockId);
562
+ }
563
+ break;
564
+ case core_common_1.LockState.Shared:
565
+ if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))
566
+ throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockDoesNotExist, "shared lock not held by this briefcase");
567
+ this.removeSharedLock(lockId, briefcase.briefcaseId);
568
+ if (previousLockStatus.sharedBy.size === 1)
569
+ this.clearLock(lockId);
570
+ }
571
+ }
572
+ releaseLock(props, briefcase) {
573
+ // Unlike abandonLock above, release always releases the lock all the way back to the None state.
574
+ // So we ignore props.state. There's no such thing as a "downgrade" here.
575
+ const lockId = props.id;
576
+ const previousLockStatus = this.queryLockStatus(lockId);
577
+ switch (previousLockStatus.state) {
492
578
  case core_common_1.LockState.None:
493
579
  throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockDoesNotExist, "lock not held");
494
580
  case core_common_1.LockState.Exclusive:
495
- if (lockStatus.briefcaseId !== arg.briefcaseId)
581
+ if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)
496
582
  throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockOwnedByAnotherBriefcase, "lock not held by this briefcase");
497
- this.updateLockChangeset(lockId, arg.changesetIndex);
583
+ this.updateLockExclusiveChangeset(lockId, briefcase.changesetIndex);
498
584
  this.clearLock(lockId);
499
585
  break;
500
586
  case core_common_1.LockState.Shared:
501
- if (!lockStatus.sharedBy.has(arg.briefcaseId))
587
+ if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))
502
588
  throw new core_common_1.IModelError(core_bentley_1.IModelHubStatus.LockDoesNotExist, "shared lock not held by this briefcase");
503
- this.removeSharedLock(lockId, arg.briefcaseId);
504
- if (lockStatus.sharedBy.size === 1)
589
+ this.updateLockSharedChangeset(lockId, briefcase.changesetIndex);
590
+ this.removeSharedLock(lockId, briefcase.briefcaseId);
591
+ if (previousLockStatus.sharedBy.size === 1)
505
592
  this.clearLock(lockId);
506
593
  }
507
594
  }
@@ -527,10 +614,20 @@ class LocalHub {
527
614
  this.releaseLock(props, arg);
528
615
  this.db.saveChanges();
529
616
  }
617
+ abandonLocks(locks, arg) {
618
+ for (const props of locks)
619
+ this.abandonLock({ id: props[0], state: props[1] }, arg);
620
+ this.db.saveChanges();
621
+ }
530
622
  releaseAllLocks(arg) {
531
623
  const locks = this.queryAllLocks(arg.briefcaseId);
532
624
  this.releaseLocks(locks, arg);
533
625
  }
626
+ abandonAllLocks(arg) {
627
+ const locks = new Map();
628
+ this.queryAllLocks(arg.briefcaseId).forEach(lock => locks.set(lock.id, core_common_1.LockState.None));
629
+ this.abandonLocks(locks, arg);
630
+ }
534
631
  countTable(tableName) {
535
632
  return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {
536
633
  stmt.step();
@@ -553,13 +650,14 @@ class LocalHub {
553
650
  // for debugging
554
651
  queryLocks() {
555
652
  const locks = [];
556
- this.db.withPreparedSqliteStatement("SELECT id,level,lastCSetIndex,briefcaseId FROM locks", (stmt) => {
653
+ this.db.withPreparedSqliteStatement("SELECT id,level,lastExclusiveReleaseChangesetIndex,lastSharedReleaseChangesetIndex,briefcaseId FROM locks", (stmt) => {
557
654
  while (core_bentley_1.DbResult.BE_SQLITE_ROW === stmt.step())
558
655
  locks.push({
559
656
  id: stmt.getValueId(0),
560
657
  level: stmt.getValueInteger(1),
561
- lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),
562
- briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),
658
+ lastExclusiveReleaseChangesetIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),
659
+ lastSharedReleaseChangesetIndex: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),
660
+ briefcaseId: stmt.getValue(4).isNull ? undefined : stmt.getValueInteger(4),
563
661
  });
564
662
  });
565
663
  return locks;
@@ -1 +1 @@
1
- {"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { join } from \"path\";\r\nimport { DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\r\n ChangesetRange, IModelError, LocalDirName, LocalFileName, LockState,\r\n} from \"@itwin/core-common\";\r\nimport { LockConflict, LockMap, LockProps } from \"./BackendHubAccess\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { SQLiteDb } from \"./SQLiteDb\";\r\n\r\n// cspell:ignore rowid\r\n\r\n/** @internal */\r\ninterface MockBriefcaseIdProps {\r\n id: BriefcaseId;\r\n user: string; // Just an AccessToken that simulates a user\r\n alias: string;\r\n assigned: boolean;\r\n}\r\n\r\n/** @internal */\r\ninterface LocalHubProps {\r\n readonly iTwinId: GuidString;\r\n readonly iModelId: GuidString;\r\n readonly iModelName: string;\r\n readonly description?: string;\r\n readonly version0?: string;\r\n readonly noLocks?: true;\r\n}\r\n\r\ninterface LocksEntry {\r\n id: Id64String;\r\n level: LockState;\r\n lastCsIndex?: ChangesetIndex;\r\n briefcaseId?: BriefcaseId;\r\n}\r\n\r\ninterface LockStatusNone {\r\n state: LockState.None;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusExclusive {\r\n state: LockState.Exclusive;\r\n briefcaseId: BriefcaseId;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\n/** @internal exported for tests. */\r\nexport interface LockStatusShared {\r\n state: LockState.Shared;\r\n sharedBy: Set<BriefcaseId>;\r\n lastCsIndex?: ChangesetIndex;\r\n}\r\n\r\ninterface BriefcaseIdAndChangeset {\r\n changeset: ChangesetIdWithIndex;\r\n briefcaseId: BriefcaseId;\r\n}\r\n\r\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\r\n\r\n/**\r\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\r\n * @internal\r\n */\r\nexport class LocalHub {\r\n public readonly iTwinId: GuidString;\r\n public readonly iModelId: GuidString;\r\n public readonly iModelName: string;\r\n public readonly description?: string;\r\n private _hubDb?: SQLiteDb;\r\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\r\n private _latestChangesetIndex = 0;\r\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\r\n\r\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\r\n this.iTwinId = arg.iTwinId;\r\n this.iModelId = arg.iModelId;\r\n this.iModelName = arg.iModelName;\r\n this.description = arg.description;\r\n\r\n this.cleanup();\r\n\r\n IModelJsFs.recursiveMkDirSync(this.rootDir);\r\n IModelJsFs.mkdirSync(this.changesetDir);\r\n IModelJsFs.mkdirSync(this.checkpointDir);\r\n\r\n const db = this._hubDb = new SQLiteDb();\r\n db.createDb(this.mockDbName);\r\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\r\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,uncompressedSize BIGINT,\\\r\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\r\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\r\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\r\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastCSetIndex INTEGER,briefcaseId INTEGER)\");\r\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\r\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\r\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\r\n db.saveChanges();\r\n\r\n const version0Root = `${rootDir}_version0`;\r\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\r\n\r\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\r\n IModelJsFs.recursiveMkDirSync(version0Root);\r\n IModelJsFs.removeSync(version0);\r\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\r\n }\r\n\r\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\r\n if (!arg.version0)\r\n IModelJsFs.removeSync(version0);\r\n\r\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\r\n try {\r\n nativeDb.setITwinId(this.iTwinId);\r\n nativeDb.setIModelId(this.iModelId);\r\n nativeDb.saveChanges();\r\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\r\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\r\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\r\n nativeDb.saveChanges();\r\n } finally {\r\n nativeDb.closeFile();\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\r\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\r\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\r\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\r\n\r\n /** Acquire the next available briefcaseId and assign it to the supplied user */\r\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\r\n const db = this.db;\r\n const newId = this._nextBriefcaseId++;\r\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, newId);\r\n stmt.bindString(2, user);\r\n stmt.bindString(3, alias ?? `${user} (${newId})`);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\r\n });\r\n db.saveChanges();\r\n return newId;\r\n }\r\n\r\n /** Release a briefcaseId */\r\n public releaseBriefcaseId(id: BriefcaseId) {\r\n const db = this.db;\r\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\r\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Get an array of all of the currently assigned Briefcases */\r\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\r\n const briefcases: MockBriefcaseIdProps[] = [];\r\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\r\n if (onlyAssigned)\r\n sql += \" WHERE assigned=1\";\r\n\r\n this.db.withSqliteStatement(sql, (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n briefcases.push({\r\n id: stmt.getValueInteger(0),\r\n user: stmt.getValueString(1),\r\n alias: stmt.getValueString(2),\r\n assigned: stmt.getValueInteger(3) !== 0,\r\n });\r\n }\r\n });\r\n return briefcases;\r\n }\r\n\r\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\r\n public getBriefcaseIds(user: string): BriefcaseId[] {\r\n const briefcases: BriefcaseId[] = [];\r\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\r\n stmt.bindString(1, user);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.push(stmt.getValueInteger(0));\r\n });\r\n return briefcases;\r\n }\r\n\r\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\r\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\r\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\r\n });\r\n }\r\n\r\n private getChangesetFileName(index: ChangesetIndex) {\r\n return join(this.changesetDir, `changeset-${index}`);\r\n }\r\n\r\n /** Add a changeset to the timeline\r\n * @return the changesetIndex of the added changeset\r\n */\r\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\r\n const stats = IModelJsFs.lstatSync(changeset.pathname);\r\n if (!stats)\r\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\r\n\r\n const parentIndex = this.getChangesetById(changeset.parentId).index;\r\n if (parentIndex !== this.latestChangesetIndex)\r\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\r\n\r\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\r\n const db = this.db;\r\n changeset.index = this._latestChangesetIndex + 1;\r\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId,uncompressedSize) VALUES (?,?,?,?,?,?,?,?,?)\", (stmt) => {\r\n stmt.bindInteger(1, changeset.index);\r\n stmt.bindString(2, changeset.id);\r\n stmt.bindString(3, changeset.description);\r\n stmt.bindInteger(4, stats.size);\r\n stmt.bindInteger(5, changeset.changesType ?? 0);\r\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\r\n stmt.bindString(7, changeset.userCreated ?? \"\");\r\n stmt.bindInteger(8, changeset.briefcaseId);\r\n stmt.bindInteger(9, changeset.uncompressedSize ?? 0);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert changeset into mock db\");\r\n });\r\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\r\n db.saveChanges();\r\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\r\n return changeset.index;\r\n }\r\n\r\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\r\n return changeset.index ?? this.getChangesetIndex(changeset.id);\r\n }\r\n\r\n /** Get the index of a changeset by its Id */\r\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\r\n if (id === \"\")\r\n return 0;\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\r\n stmt.bindString(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset ${id} not found`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its Id */\r\n public getChangesetById(id: ChangesetId): ChangesetProps {\r\n return this.getChangesetByIndex(this.getChangesetIndex(id));\r\n }\r\n\r\n public getPreviousIndex(index: ChangesetIndex) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `cannot get previous index`);\r\n\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n public getParentId(index: ChangesetIndex): ChangesetId {\r\n if (index === 0)\r\n return \"\";\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, this.getPreviousIndex(index));\r\n stmt.step();\r\n return stmt.getValueString(0);\r\n });\r\n }\r\n\r\n /** Get the properties of a changeset by its index */\r\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\r\n if (index <= 0)\r\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0, size: 0, uncompressedSize: 0 };\r\n\r\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId,uncompressedSize FROM timeline WHERE csIndex=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `changeset at index ${index} not found`);\r\n\r\n return {\r\n description: stmt.getValueString(0),\r\n size: stmt.getValueDouble(1),\r\n changesType: stmt.getValueInteger(2),\r\n pushDate: stmt.getValueString(3),\r\n userCreated: stmt.getValueString(4),\r\n id: stmt.getValueString(5),\r\n briefcaseId: stmt.getValueInteger(6),\r\n index,\r\n parentId: this.getParentId(index),\r\n uncompressedSize: stmt.getValueInteger(7),\r\n };\r\n });\r\n }\r\n\r\n public getLatestChangeset(): ChangesetProps {\r\n return this.getChangesetByIndex(this.latestChangesetIndex);\r\n }\r\n\r\n public getChangesetId(index: ChangesetIndex): ChangesetId {\r\n return this.getChangesetByIndex(index).id;\r\n }\r\n\r\n /** Get an array of changesets starting with first to last, by index */\r\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\r\n const changesets: ChangesetProps[] = [];\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\r\n });\r\n return changesets;\r\n }\r\n\r\n /** Name a version */\r\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\r\n stmt.bindString(1, arg.versionName);\r\n stmt.bindInteger(2, arg.csIndex);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** Delete a named version */\r\n public deleteNamedVersion(versionName: string) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't delete named version\");\r\n });\r\n db.saveChanges();\r\n }\r\n\r\n /** find the changeset for a named version */\r\n public findNamedVersion(versionName: string): ChangesetProps {\r\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\r\n stmt.bindString(1, versionName);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\r\n return stmt.getValueInteger(0);\r\n });\r\n return this.getChangesetByIndex(index);\r\n }\r\n\r\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\r\n return `checkpoint-${csIndex}`;\r\n }\r\n\r\n /** \"upload\" a checkpoint */\r\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\r\n const db = this.db;\r\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\r\n stmt.bindInteger(1, arg.changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== res)\r\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\r\n });\r\n db.saveChanges();\r\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\r\n IModelJsFs.copySync(arg.localFile, outName);\r\n return outName;\r\n }\r\n\r\n /** Get an array of the indexes for a range of checkpoints */\r\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\r\n const first = range?.first ?? 0;\r\n const last = range?.end ?? this.latestChangesetIndex;\r\n\r\n const checkpoints: ChangesetIndex[] = [];\r\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\r\n stmt.bindInteger(1, first);\r\n stmt.bindInteger(2, last);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n checkpoints.push(stmt.getValueInteger(0));\r\n\r\n });\r\n return checkpoints;\r\n }\r\n\r\n /** Find the checkpoint that is no newer than a changesetIndex */\r\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\r\n if (changesetIndex <= 0)\r\n return 0;\r\n\r\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\r\n stmt.bindInteger(1, changesetIndex);\r\n const res = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== res)\r\n throw new IModelError(res, \"can't get previous checkpoint\");\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n /** \"download\" a checkpoint */\r\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\r\n const index = this.getIndexFromChangeset(arg.changeset);\r\n const prev = this.queryPreviousCheckpoint(index);\r\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\r\n const changeset = this.getChangesetByIndex(index);\r\n return { index, id: changeset.id };\r\n }\r\n\r\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\r\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\r\n return arg;\r\n }\r\n\r\n /** \"download\" a changeset */\r\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\r\n const cs = this.getChangesetByIndex(arg.index);\r\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\r\n return this.copyChangeset(csProps);\r\n }\r\n\r\n /** \"download\" all the changesets in a given range */\r\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\r\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\r\n for (const cs of cSets) {\r\n cs.pathname = join(arg.targetDir, cs.id);\r\n this.copyChangeset(cs);\r\n }\r\n return cSets;\r\n }\r\n\r\n private querySharedLockHolders(elementId: Id64String) {\r\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const briefcases = new Set<BriefcaseId>();\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n briefcases.add(stmt.getValueInteger(0));\r\n return briefcases;\r\n });\r\n }\r\n\r\n public queryAllLocks(briefcaseId: BriefcaseId) {\r\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\r\n const locks: LockProps[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\r\n });\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\r\n stmt.bindInteger(1, briefcaseId);\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\r\n });\r\n return locks;\r\n }\r\n\r\n public queryLockStatus(elementId: Id64String): LockStatus {\r\n return this.db.withPreparedSqliteStatement(\"SELECT lastCSetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n return { state: LockState.None };\r\n const lastCsVal = stmt.getValue(0);\r\n const lock = {\r\n lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),\r\n state: stmt.getValueInteger(1),\r\n };\r\n switch (lock.state) {\r\n case LockState.None:\r\n return lock;\r\n case LockState.Exclusive:\r\n return { ...lock, briefcaseId: stmt.getValueInteger(2) };\r\n case LockState.Shared:\r\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\r\n default:\r\n throw new Error(\"illegal lock state\");\r\n }\r\n });\r\n }\r\n\r\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))\r\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\r\n\r\n const wantShared = props.state === LockState.Shared;\r\n if (wantShared && (currStatus.state === LockState.Exclusive))\r\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\r\n\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, props.state);\r\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert lock\");\r\n });\r\n\r\n if (wantShared) {\r\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)\", (stmt) => {\r\n stmt.bindId(1, props.id);\r\n stmt.bindInteger(2, briefcase.briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"cannot insert shared lock\");\r\n });\r\n }\r\n }\r\n\r\n private clearLock(id: Id64String) {\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't release lock\");\r\n });\r\n }\r\n\r\n private updateLockChangeset(id: Id64String, index: ChangesetIndex) {\r\n if (index <= 0)\r\n return;\r\n\r\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastCSetIndex=? WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, index);\r\n stmt.bindId(2, id);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't update lock changeSetId\");\r\n });\r\n }\r\n\r\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n if (props.state === LockState.None)\r\n throw new Error(\"cannot request lock for LockState.None\");\r\n\r\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\r\n\r\n const lockStatus = this.queryLockStatus(props.id);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n return this.reserveLock(lockStatus, props, briefcase);\r\n\r\n case LockState.Shared:\r\n if (props.state === LockState.Shared) {\r\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\r\n this.reserveLock(lockStatus, props, briefcase);\r\n } else {\r\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\r\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\r\n const id = lockStatus.sharedBy.values().next().value!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\r\n }\r\n this.removeSharedLock(props.id, briefcase.briefcaseId);\r\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\r\n }\r\n return;\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\r\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\r\n }\r\n }\r\n\r\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\r\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\r\n stmt.bindId(1, lockId);\r\n stmt.bindInteger(2, briefcaseId);\r\n const rc = stmt.step();\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"can't remove shared lock\");\r\n });\r\n }\r\n\r\n private releaseLock(props: LockProps, arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const lockId = props.id;\r\n const lockStatus = this.queryLockStatus(lockId);\r\n switch (lockStatus.state) {\r\n case LockState.None:\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\r\n\r\n case LockState.Exclusive:\r\n if (lockStatus.briefcaseId !== arg.briefcaseId)\r\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\r\n this.updateLockChangeset(lockId, arg.changesetIndex);\r\n this.clearLock(lockId);\r\n break;\r\n\r\n case LockState.Shared:\r\n if (!lockStatus.sharedBy.has(arg.briefcaseId))\r\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\r\n this.removeSharedLock(lockId, arg.briefcaseId);\r\n if (lockStatus.sharedBy.size === 1)\r\n this.clearLock(lockId);\r\n }\r\n }\r\n\r\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\r\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\r\n try {\r\n for (const lock of locks)\r\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\r\n this.db.saveChanges(); // only after all locks have been acquired\r\n } catch (err) {\r\n this.db.abandonChanges(); // abandon all locks that may have been acquired\r\n throw err;\r\n }\r\n }\r\n\r\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\r\n const locks = new Map<Id64String, LockState>();\r\n locks.set(props.id, props.state);\r\n this.acquireLocks(locks, briefcase);\r\n }\r\n\r\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n for (const props of locks)\r\n this.releaseLock(props, arg);\r\n this.db.saveChanges();\r\n }\r\n\r\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\r\n const locks = this.queryAllLocks(arg.briefcaseId);\r\n this.releaseLocks(locks, arg);\r\n }\r\n\r\n private countTable(tableName: string): number {\r\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\r\n stmt.step();\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n // for debugging\r\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\r\n // for debugging\r\n public countLocks(): number { return this.countTable(\"locks\"); }\r\n\r\n // for debugging\r\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\r\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\r\n });\r\n return locks;\r\n }\r\n\r\n // for debugging\r\n public queryLocks(): LocksEntry[] {\r\n const locks: LocksEntry[] = [];\r\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastCSetIndex,briefcaseId FROM locks\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step())\r\n locks.push({\r\n id: stmt.getValueId(0),\r\n level: stmt.getValueInteger(1),\r\n lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\r\n briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\r\n });\r\n });\r\n return locks;\r\n }\r\n\r\n public removeDir(dirName: string) {\r\n if (IModelJsFs.existsSync(dirName)) {\r\n IModelJsFs.purgeDirSync(dirName);\r\n IModelJsFs.rmdirSync(dirName);\r\n }\r\n\r\n }\r\n public cleanup() {\r\n if (this._hubDb) {\r\n this._hubDb.closeDb();\r\n this._hubDb = undefined;\r\n }\r\n try {\r\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\r\n this.removeDir(this.rootDir);\r\n } catch {\r\n // eslint-disable-next-line no-console\r\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { join } from \"path\";\nimport { assert, DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\nimport {\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\n ChangesetRange, IModelError, LocalDirName, LocalFileName, LockState,\n} from \"@itwin/core-common\";\nimport { BriefcaseIdArg, LockConflict, LockMap, LockProps } from \"./BackendHubAccess\";\nimport { BriefcaseManager } from \"./BriefcaseManager\";\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\nimport { IModelJsFs } from \"./IModelJsFs\";\nimport { SQLiteDb } from \"./SQLiteDb\";\n\n// cspell:ignore rowid\n\n/** @internal */\ninterface MockBriefcaseIdProps {\n id: BriefcaseId;\n user: string; // Just an AccessToken that simulates a user\n alias: string;\n assigned: boolean;\n}\n\n/** @internal */\ninterface LocalHubProps {\n readonly iTwinId: GuidString;\n readonly iModelId: GuidString;\n readonly iModelName: string;\n readonly description?: string;\n readonly version0?: string;\n readonly noLocks?: true;\n}\n\ninterface LockLastReleaseChangesetIndices {\n lastExclusiveReleaseChangesetIndex?: ChangesetIndex;\n lastSharedReleaseChangesetIndex?: ChangesetIndex;\n}\n\ninterface LocksEntry extends LockLastReleaseChangesetIndices {\n id: Id64String;\n level: LockState;\n briefcaseId?: BriefcaseId;\n}\n\ninterface LockStatusNone extends LockLastReleaseChangesetIndices {\n state: LockState.None;\n}\n\n/** @internal exported for tests. */\nexport interface LockStatusExclusive extends LockLastReleaseChangesetIndices {\n state: LockState.Exclusive;\n briefcaseId: BriefcaseId;\n}\n\n/** @internal exported for tests. */\nexport interface LockStatusShared extends LockLastReleaseChangesetIndices {\n state: LockState.Shared;\n sharedBy: Set<BriefcaseId>;\n}\n\ninterface BriefcaseIdAndChangeset {\n changeset: ChangesetIdWithIndex;\n briefcaseId: BriefcaseId;\n}\n\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\n\n/**\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\n * @internal\n */\nexport class LocalHub {\n public readonly iTwinId: GuidString;\n public readonly iModelId: GuidString;\n public readonly iModelName: string;\n public readonly description?: string;\n private _hubDb?: SQLiteDb;\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\n private _latestChangesetIndex = 0;\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\n\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\n this.iTwinId = arg.iTwinId;\n this.iModelId = arg.iModelId;\n this.iModelName = arg.iModelName;\n this.description = arg.description;\n\n this.cleanup();\n\n IModelJsFs.recursiveMkDirSync(this.rootDir);\n IModelJsFs.mkdirSync(this.changesetDir);\n IModelJsFs.mkdirSync(this.checkpointDir);\n\n const db = this._hubDb = new SQLiteDb();\n db.createDb(this.mockDbName);\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,uncompressedSize BIGINT,\\\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastExclusiveReleaseChangesetIndex INTEGER,lastSharedReleaseChangesetIndex INTEGER,briefcaseId INTEGER)\");\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\n db.saveChanges();\n\n const version0Root = `${rootDir}_version0`;\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\n\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\n IModelJsFs.recursiveMkDirSync(version0Root);\n IModelJsFs.removeSync(version0);\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\n }\n\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\n if (!arg.version0)\n IModelJsFs.removeSync(version0);\n\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\n try {\n nativeDb.setITwinId(this.iTwinId);\n nativeDb.setIModelId(this.iModelId);\n nativeDb.saveChanges();\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\n nativeDb.saveChanges();\n } finally {\n nativeDb.closeFile();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\n\n /** Acquire the next available briefcaseId and assign it to the supplied user */\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\n const db = this.db;\n const newId = this._nextBriefcaseId++;\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\n stmt.bindInteger(1, newId);\n stmt.bindString(2, user);\n stmt.bindString(3, alias ?? `${user} (${newId})`);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\n });\n db.saveChanges();\n return newId;\n }\n\n /** Release a briefcaseId */\n public releaseBriefcaseId(id: BriefcaseId) {\n const db = this.db;\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, id);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\n });\n db.saveChanges();\n }\n\n /** Get an array of all of the currently assigned Briefcases */\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\n const briefcases: MockBriefcaseIdProps[] = [];\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\n if (onlyAssigned)\n sql += \" WHERE assigned=1\";\n\n this.db.withSqliteStatement(sql, (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n briefcases.push({\n id: stmt.getValueInteger(0),\n user: stmt.getValueString(1),\n alias: stmt.getValueString(2),\n assigned: stmt.getValueInteger(3) !== 0,\n });\n }\n });\n return briefcases;\n }\n\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\n public getBriefcaseIds(user: string): BriefcaseId[] {\n const briefcases: BriefcaseId[] = [];\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\n stmt.bindString(1, user);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n briefcases.push(stmt.getValueInteger(0));\n });\n return briefcases;\n }\n\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, id);\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\n });\n }\n\n private getChangesetFileName(index: ChangesetIndex) {\n return join(this.changesetDir, `changeset-${index}`);\n }\n\n /** Add a changeset to the timeline\n * @return the changesetIndex of the added changeset\n */\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\n const stats = IModelJsFs.lstatSync(changeset.pathname);\n if (!stats)\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\n\n const parentIndex = this.getChangesetById(changeset.parentId).index;\n if (parentIndex !== this.latestChangesetIndex)\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\n\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\n const db = this.db;\n changeset.index = this._latestChangesetIndex + 1;\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId,uncompressedSize) VALUES (?,?,?,?,?,?,?,?,?)\", (stmt) => {\n stmt.bindInteger(1, changeset.index);\n stmt.bindString(2, changeset.id);\n stmt.bindString(3, changeset.description);\n stmt.bindInteger(4, stats.size);\n stmt.bindInteger(5, changeset.changesType ?? 0);\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\n stmt.bindString(7, changeset.userCreated ?? \"\");\n stmt.bindInteger(8, changeset.briefcaseId);\n stmt.bindInteger(9, changeset.uncompressedSize ?? 0);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert changeset into mock db\");\n });\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\n db.saveChanges();\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\n return changeset.index;\n }\n\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\n return changeset.index ?? this.getChangesetIndex(changeset.id);\n }\n\n /** Get the index of a changeset by its Id */\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\n if (id === \"\")\n return 0;\n\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\n stmt.bindString(1, id);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `changeset ${id} not found`);\n\n return stmt.getValueInteger(0);\n });\n }\n\n /** Get the properties of a changeset by its Id */\n public getChangesetById(id: ChangesetId): ChangesetProps {\n return this.getChangesetByIndex(this.getChangesetIndex(id));\n }\n\n public getPreviousIndex(index: ChangesetIndex) {\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\n stmt.bindInteger(1, index);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `cannot get previous index`);\n\n return stmt.getValueInteger(0);\n });\n }\n\n public getParentId(index: ChangesetIndex): ChangesetId {\n if (index === 0)\n return \"\";\n\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\n stmt.bindInteger(1, this.getPreviousIndex(index));\n stmt.step();\n return stmt.getValueString(0);\n });\n }\n\n /** Get the properties of a changeset by its index */\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\n if (index <= 0)\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0, size: 0, uncompressedSize: 0 };\n\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId,uncompressedSize FROM timeline WHERE csIndex=?\", (stmt) => {\n stmt.bindInteger(1, index);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `changeset at index ${index} not found`);\n\n return {\n description: stmt.getValueString(0),\n size: stmt.getValueDouble(1),\n changesType: stmt.getValueInteger(2),\n pushDate: stmt.getValueString(3),\n userCreated: stmt.getValueString(4),\n id: stmt.getValueString(5),\n briefcaseId: stmt.getValueInteger(6),\n index,\n parentId: this.getParentId(index),\n uncompressedSize: stmt.getValueInteger(7),\n };\n });\n }\n\n public getLatestChangeset(): ChangesetProps {\n return this.getChangesetByIndex(this.latestChangesetIndex);\n }\n\n public getChangesetId(index: ChangesetIndex): ChangesetId {\n return this.getChangesetByIndex(index).id;\n }\n\n /** Get an array of changesets starting with first to last, by index */\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\n const changesets: ChangesetProps[] = [];\n const first = range?.first ?? 0;\n const last = range?.end ?? this.latestChangesetIndex;\n\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\n stmt.bindInteger(1, first);\n stmt.bindInteger(2, last);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\n });\n return changesets;\n }\n\n /** Name a version */\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\n const db = this.db;\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\n stmt.bindString(1, arg.versionName);\n stmt.bindInteger(2, arg.csIndex);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert named version\");\n });\n db.saveChanges();\n }\n\n /** Delete a named version */\n public deleteNamedVersion(versionName: string) {\n const db = this.db;\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\n stmt.bindString(1, versionName);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't delete named version\");\n });\n db.saveChanges();\n }\n\n /** find the changeset for a named version */\n public findNamedVersion(versionName: string): ChangesetProps {\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\n stmt.bindString(1, versionName);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\n return stmt.getValueInteger(0);\n });\n return this.getChangesetByIndex(index);\n }\n\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\n return `checkpoint-${csIndex}`;\n }\n\n /** \"upload\" a checkpoint */\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\n const db = this.db;\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\n stmt.bindInteger(1, arg.changesetIndex);\n const res = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== res)\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\n });\n db.saveChanges();\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\n IModelJsFs.copySync(arg.localFile, outName);\n return outName;\n }\n\n /** Get an array of the indexes for a range of checkpoints */\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\n const first = range?.first ?? 0;\n const last = range?.end ?? this.latestChangesetIndex;\n\n const checkpoints: ChangesetIndex[] = [];\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\n stmt.bindInteger(1, first);\n stmt.bindInteger(2, last);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n checkpoints.push(stmt.getValueInteger(0));\n\n });\n return checkpoints;\n }\n\n /** Find the checkpoint that is no newer than a changesetIndex */\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\n if (changesetIndex <= 0)\n return 0;\n\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\n stmt.bindInteger(1, changesetIndex);\n const res = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== res)\n throw new IModelError(res, \"can't get previous checkpoint\");\n return stmt.getValueInteger(0);\n });\n }\n\n /** \"download\" a checkpoint */\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\n const index = this.getIndexFromChangeset(arg.changeset);\n const prev = this.queryPreviousCheckpoint(index);\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\n const changeset = this.getChangesetByIndex(index);\n return { index, id: changeset.id };\n }\n\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\n return arg;\n }\n\n /** \"download\" a changeset */\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\n const cs = this.getChangesetByIndex(arg.index);\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\n return this.copyChangeset(csProps);\n }\n\n /** \"download\" all the changesets in a given range */\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\n for (const cs of cSets) {\n cs.pathname = join(arg.targetDir, cs.id);\n this.copyChangeset(cs);\n }\n return cSets;\n }\n\n private querySharedLockHolders(elementId: Id64String) {\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\n stmt.bindId(1, elementId);\n const briefcases = new Set<BriefcaseId>();\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n briefcases.add(stmt.getValueInteger(0));\n return briefcases;\n });\n }\n\n public queryAllLocks(briefcaseId: BriefcaseId) {\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\n const locks: LockProps[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\n stmt.bindInteger(1, briefcaseId);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\n });\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\n stmt.bindInteger(1, briefcaseId);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\n });\n return locks;\n }\n\n public queryLockStatus(elementId: Id64String): LockStatus {\n return this.db.withPreparedSqliteStatement(\"SELECT lastSharedReleaseChangesetIndex,lastExclusiveReleaseChangesetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\n stmt.bindId(1, elementId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n return { state: LockState.None };\n const lastSharedCsVal = stmt.getValue(0);\n const lastExclusiveCsVal = stmt.getValue(1);\n const lock = {\n lastSharedReleaseChangesetIndex: lastSharedCsVal.isNull ? undefined : lastSharedCsVal.getInteger(),\n lastExclusiveReleaseChangesetIndex: lastExclusiveCsVal.isNull ? undefined : lastExclusiveCsVal.getInteger(),\n state: stmt.getValueInteger(2),\n };\n switch (lock.state) {\n case LockState.None:\n return lock;\n case LockState.Exclusive:\n return { ...lock, briefcaseId: stmt.getValueInteger(3) };\n case LockState.Shared:\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\n default:\n throw new Error(\"illegal lock state\");\n }\n });\n }\n\n private doesBriefcaseRequirePullBeforeLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset): boolean {\n if (props.state === LockState.None)\n return false;\n\n const briefcaseChangesetIndex = this.getIndexFromChangeset(briefcase.changeset);\n const exclusiveIndexIsNewer = currStatus.lastExclusiveReleaseChangesetIndex !== undefined &&\n currStatus.lastExclusiveReleaseChangesetIndex > briefcaseChangesetIndex;\n\n if (props.state === LockState.Shared) {\n // To acquire a shared lock, the briefcase must at least at the latest exclusive changeset index\n return exclusiveIndexIsNewer;\n } else {\n assert(props.state === LockState.Exclusive);\n\n const sharedIndexIsNewer = currStatus.lastSharedReleaseChangesetIndex !== undefined &&\n currStatus.lastSharedReleaseChangesetIndex > briefcaseChangesetIndex;\n\n // To acquire the exclusive lock the briefcase must be at least at the greater of the two last-indexes\n return exclusiveIndexIsNewer || sharedIndexIsNewer;\n }\n }\n\n private addSharedLockRecord(lockId: Id64String, briefcaseId: BriefcaseId) {\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?) ON CONFLICT(lockId,briefcaseId) DO NOTHING\", (stmt) => {\n stmt.bindId(1, lockId);\n stmt.bindInteger(2, briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"cannot insert shared lock\");\n });\n }\n\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n if (this.doesBriefcaseRequirePullBeforeLock(currStatus, props, briefcase)) {\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\n }\n\n const wantShared = props.state === LockState.Shared;\n if (wantShared && (currStatus.state === LockState.Exclusive))\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\n\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\n stmt.bindId(1, props.id);\n stmt.bindInteger(2, props.state);\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"cannot insert lock\");\n });\n\n if (wantShared) {\n this.addSharedLockRecord(props.id, briefcase.briefcaseId);\n }\n }\n\n private downgradeExclusiveLockToShared(lockId: Id64String, briefcaseId: BriefcaseId) {\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=1,briefcaseId=NULL WHERE id=? AND briefcaseId=? AND level=2\", (stmt) => {\n stmt.bindId(1, lockId);\n stmt.bindInteger(2, briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't downgrade lock\");\n });\n\n // Verify that the above actually updated a row. If it didn't, something has gone wrong with the downgrade.\n // This shouldn't happen.\n this.db.withPreparedSqliteStatement(\"SELECT CHANGES()\", (stmt) => {\n stmt.step();\n if (stmt.getValueInteger(0) !== 1)\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase or lock is not exclusive\");\n });\n\n this.addSharedLockRecord(lockId, briefcaseId);\n }\n\n private clearLock(id: Id64String) {\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\n stmt.bindId(1, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't release lock\");\n });\n }\n\n private updateLockExclusiveChangeset(id: Id64String, index: ChangesetIndex) {\n if (index <= 0)\n return;\n\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastExclusiveReleaseChangesetIndex=? WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, index);\n stmt.bindId(2, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't update lock exclusive changeSetId\");\n });\n }\n\n private updateLockSharedChangeset(id: Id64String, index: ChangesetIndex) {\n if (index <= 0)\n return;\n\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastSharedReleaseChangesetIndex=? WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, index);\n stmt.bindId(2, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't update lock shared changeSetId\");\n });\n }\n\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n if (props.state === LockState.None)\n throw new Error(\"cannot request lock for LockState.None\");\n\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\n\n const lockStatus = this.queryLockStatus(props.id);\n switch (lockStatus.state) {\n case LockState.None:\n return this.reserveLock(lockStatus, props, briefcase);\n\n case LockState.Shared:\n if (props.state === LockState.Shared) {\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\n this.reserveLock(lockStatus, props, briefcase);\n } else {\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\n const id = lockStatus.sharedBy.values().next().value!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\n }\n this.removeSharedLock(props.id, briefcase.briefcaseId);\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\n }\n return;\n\n case LockState.Exclusive:\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\n }\n }\n\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\n stmt.bindId(1, lockId);\n stmt.bindInteger(2, briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't remove shared lock\");\n });\n }\n\n private abandonLock(props: LockProps, briefcase: BriefcaseIdArg) {\n // When abandoning (but not when releasing), props.state indicates which\n // state we're abandoning _to_. Specifically, an Exclusive lock can be\n // abandoned to either Shared or None.\n\n // It makes no sense to abandon a lock _to_ the Exclusive state.\n if (props.state === LockState.Exclusive)\n throw new IModelError(IModelHubStatus.InvalidArgumentError, \"must specify Shared or None when abandoning a lock\");\n\n const lockId = props.id;\n const previousLockStatus = this.queryLockStatus(lockId);\n switch (previousLockStatus.state) {\n case LockState.None:\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\n\n case LockState.Exclusive:\n if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\n if (props.state === LockState.Shared) {\n // Exclusive -> Shared\n this.downgradeExclusiveLockToShared(lockId, briefcase.briefcaseId);\n } else {\n // Exclusive -> None\n this.clearLock(lockId);\n }\n break;\n\n case LockState.Shared:\n if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\n this.removeSharedLock(lockId, briefcase.briefcaseId);\n if (previousLockStatus.sharedBy.size === 1)\n this.clearLock(lockId);\n }\n }\n\n private releaseLock(props: LockProps, briefcase: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n // Unlike abandonLock above, release always releases the lock all the way back to the None state.\n // So we ignore props.state. There's no such thing as a \"downgrade\" here.\n\n const lockId = props.id;\n const previousLockStatus = this.queryLockStatus(lockId);\n switch (previousLockStatus.state) {\n case LockState.None:\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\n\n case LockState.Exclusive:\n if (previousLockStatus.briefcaseId !== briefcase.briefcaseId)\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\n this.updateLockExclusiveChangeset(lockId, briefcase.changesetIndex);\n this.clearLock(lockId);\n break;\n\n case LockState.Shared:\n if (!previousLockStatus.sharedBy.has(briefcase.briefcaseId))\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\n this.updateLockSharedChangeset(lockId, briefcase.changesetIndex);\n this.removeSharedLock(lockId, briefcase.briefcaseId);\n if (previousLockStatus.sharedBy.size === 1)\n this.clearLock(lockId);\n }\n }\n\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\n try {\n for (const lock of locks)\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\n this.db.saveChanges(); // only after all locks have been acquired\n } catch (err) {\n this.db.abandonChanges(); // abandon all locks that may have been acquired\n throw err;\n }\n }\n\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n const locks = new Map<Id64String, LockState>();\n locks.set(props.id, props.state);\n this.acquireLocks(locks, briefcase);\n }\n\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n for (const props of locks)\n this.releaseLock(props, arg);\n this.db.saveChanges();\n }\n\n public abandonLocks(locks: LockMap, arg: BriefcaseIdArg) {\n for (const props of locks)\n this.abandonLock({ id: props[0], state: props[1] }, arg);\n this.db.saveChanges();\n }\n\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n const locks = this.queryAllLocks(arg.briefcaseId);\n this.releaseLocks(locks, arg);\n }\n\n public abandonAllLocks(arg: BriefcaseIdArg) {\n const locks = new Map<Id64String, LockState>();\n this.queryAllLocks(arg.briefcaseId).forEach(lock => locks.set(lock.id, LockState.None));\n this.abandonLocks(locks, arg);\n }\n\n private countTable(tableName: string): number {\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\n stmt.step();\n return stmt.getValueInteger(0);\n });\n }\n\n // for debugging\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\n // for debugging\n public countLocks(): number { return this.countTable(\"locks\"); }\n\n // for debugging\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\n });\n return locks;\n }\n\n // for debugging\n public queryLocks(): LocksEntry[] {\n const locks: LocksEntry[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastExclusiveReleaseChangesetIndex,lastSharedReleaseChangesetIndex,briefcaseId FROM locks\", (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({\n id: stmt.getValueId(0),\n level: stmt.getValueInteger(1),\n lastExclusiveReleaseChangesetIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\n lastSharedReleaseChangesetIndex: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\n briefcaseId: stmt.getValue(4).isNull ? undefined : stmt.getValueInteger(4),\n });\n });\n return locks;\n }\n\n public removeDir(dirName: string) {\n if (IModelJsFs.existsSync(dirName)) {\n IModelJsFs.purgeDirSync(dirName);\n IModelJsFs.rmdirSync(dirName);\n }\n\n }\n public cleanup() {\n if (this._hubDb) {\n this._hubDb.closeDb();\n this._hubDb = undefined;\n }\n try {\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\n this.removeDir(this.rootDir);\n } catch {\n // eslint-disable-next-line no-console\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalhostIpcHost.js","sourceRoot":"","sources":["../../src/LocalhostIpcHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelHost\r\n */\r\n\r\nimport * as ws from \"ws\";\r\nimport {\r\n InterceptedRpcRequest, IpcWebSocket, IpcWebSocketBackend, IpcWebSocketMessage, IpcWebSocketTransport, rpcOverIpcStrings, RpcSessionInvocation,\r\n} from \"@itwin/core-common\";\r\nimport { IModelHostOptions } from \"./IModelHost\";\r\nimport { IpcHandler, IpcHost } from \"./IpcHost\";\r\n\r\n/** @internal */\r\nexport interface LocalhostIpcHostOpts {\r\n socketPort?: number;\r\n host?: string;\r\n noServer?: boolean;\r\n}\r\n\r\nclass LocalTransport extends IpcWebSocketTransport {\r\n private _server: ws.Server | undefined;\r\n private _connections: Map<ws, number> = new Map();\r\n\r\n public constructor(opts: LocalhostIpcHostOpts) {\r\n super();\r\n\r\n if (!opts.noServer) {\r\n this._server = new ws.Server({ port: opts.socketPort ?? 3002, host: opts.host ?? \"127.0.0.1\" });\r\n this._server.on(\"connection\", (connection) => LocalhostIpcHost.connect(connection));\r\n }\r\n }\r\n\r\n public send(message: IpcWebSocketMessage): void {\r\n this._connections.forEach((last, connection) => {\r\n message.sequence = last + 1;\r\n this._connections.set(connection, message.sequence);\r\n const parts = this.serialize(message);\r\n parts.forEach((part) => connection.send(part));\r\n });\r\n }\r\n\r\n public connect(connection: ws) {\r\n this._connections.set(connection, -1);\r\n\r\n connection.on(\"message\", async (data) => {\r\n const message = await this.notifyIncoming(data, connection);\r\n if (IpcWebSocketMessage.skip(message)) {\r\n return;\r\n }\r\n\r\n for (const listener of IpcWebSocket.receivers) {\r\n listener({} as Event, message);\r\n }\r\n });\r\n\r\n connection.on(\"close\", () => {\r\n this._connections.delete(connection);\r\n this.notifyClose(connection);\r\n });\r\n }\r\n}\r\n\r\nclass RpcHandler extends IpcHandler {\r\n public channelName = rpcOverIpcStrings.channelName;\r\n\r\n public async request(info: InterceptedRpcRequest) {\r\n const invocation = RpcSessionInvocation.create(info);\r\n const fulfillment = await invocation.fulfillment;\r\n return invocation.rejected ? Promise.reject(fulfillment.rawResult) : fulfillment.rawResult; // eslint-disable-line @typescript-eslint/prefer-promise-reject-errors\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class LocalhostIpcHost {\r\n private static _initialized = false;\r\n public static socket: IpcWebSocketBackend;\r\n\r\n public static connect(connection: ws) {\r\n (IpcWebSocket.transport as LocalTransport).connect(connection);\r\n }\r\n\r\n public static async startup(opts?: { localhostIpcHost?: LocalhostIpcHostOpts, iModelHost?: IModelHostOptions }) {\r\n let registerHandler = false;\r\n\r\n if (!this._initialized) {\r\n registerHandler = true;\r\n IpcWebSocket.transport = new LocalTransport(opts?.localhostIpcHost ?? {});\r\n this.socket = new IpcWebSocketBackend();\r\n this._initialized = true;\r\n }\r\n\r\n await IpcHost.startup({ ipcHost: { socket: this.socket }, iModelHost: opts?.iModelHost });\r\n\r\n if (registerHandler)\r\n RpcHandler.register();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"LocalhostIpcHost.js","sourceRoot":"","sources":["../../src/LocalhostIpcHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module IModelHost\n */\n\nimport * as ws from \"ws\";\nimport {\n InterceptedRpcRequest, IpcWebSocket, IpcWebSocketBackend, IpcWebSocketMessage, IpcWebSocketTransport, rpcOverIpcStrings, RpcSessionInvocation,\n} from \"@itwin/core-common\";\nimport { IModelHostOptions } from \"./IModelHost\";\nimport { IpcHandler, IpcHost } from \"./IpcHost\";\n\n/** @internal */\nexport interface LocalhostIpcHostOpts {\n socketPort?: number;\n host?: string;\n noServer?: boolean;\n}\n\nclass LocalTransport extends IpcWebSocketTransport {\n private _server: ws.Server | undefined;\n private _connections: Map<ws, number> = new Map();\n\n public constructor(opts: LocalhostIpcHostOpts) {\n super();\n\n if (!opts.noServer) {\n this._server = new ws.Server({ port: opts.socketPort ?? 3002, host: opts.host ?? \"127.0.0.1\" });\n this._server.on(\"connection\", (connection) => LocalhostIpcHost.connect(connection));\n }\n }\n\n public send(message: IpcWebSocketMessage): void {\n this._connections.forEach((last, connection) => {\n message.sequence = last + 1;\n this._connections.set(connection, message.sequence);\n const parts = this.serialize(message);\n parts.forEach((part) => connection.send(part));\n });\n }\n\n public connect(connection: ws) {\n this._connections.set(connection, -1);\n\n connection.on(\"message\", async (data) => {\n const message = await this.notifyIncoming(data, connection);\n if (IpcWebSocketMessage.skip(message)) {\n return;\n }\n\n for (const listener of IpcWebSocket.receivers) {\n listener({} as Event, message);\n }\n });\n\n connection.on(\"close\", () => {\n this._connections.delete(connection);\n this.notifyClose(connection);\n });\n }\n}\n\nclass RpcHandler extends IpcHandler {\n public channelName = rpcOverIpcStrings.channelName;\n\n public async request(info: InterceptedRpcRequest) {\n const invocation = RpcSessionInvocation.create(info);\n const fulfillment = await invocation.fulfillment;\n return invocation.rejected ? Promise.reject(fulfillment.rawResult) : fulfillment.rawResult; // eslint-disable-line @typescript-eslint/prefer-promise-reject-errors\n }\n}\n\n/** @internal */\nexport class LocalhostIpcHost {\n private static _initialized = false;\n public static socket: IpcWebSocketBackend;\n\n public static connect(connection: ws) {\n (IpcWebSocket.transport as LocalTransport).connect(connection);\n }\n\n public static async startup(opts?: { localhostIpcHost?: LocalhostIpcHostOpts, iModelHost?: IModelHostOptions }) {\n let registerHandler = false;\n\n if (!this._initialized) {\n registerHandler = true;\n IpcWebSocket.transport = new LocalTransport(opts?.localhostIpcHost ?? {});\n this.socket = new IpcWebSocketBackend();\n this._initialized = true;\n }\n\n await IpcHost.startup({ ipcHost: { socket: this.socket }, iModelHost: opts?.iModelHost });\n\n if (registerHandler)\n RpcHandler.register();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LockControl.js","sourceRoot":"","sources":["../../src/LockControl.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;AAGH,gDAA6G","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\nimport { Id64Arg, Id64String } from \"@itwin/core-bentley\";\r\nimport { _close, _elementWasCreated, _implementationProhibited, _releaseAllLocks } from \"./internal/Symbols\";\r\n\r\n/**\r\n * Interface for acquiring element locks to [coordinate simultaneous edits]($docs/learning/backend/ConcurrencyControl.md) from multiple briefcases.\r\n * @see [[IModelDb.locks]] to access the locks for an iModel.\r\n * @public\r\n */\r\nexport interface LockControl {\r\n /** @internal*/\r\n readonly [_implementationProhibited]: unknown;\r\n\r\n /**\r\n * true if this LockControl uses a server-based concurrency approach.\r\n */\r\n readonly isServerBased: boolean;\r\n\r\n /**\r\n * Close the local lock control database\r\n * @internal\r\n */\r\n [_close]: () => void;\r\n\r\n /**\r\n * Notification that a new element was just created. Called by [[Element.onInserted]]\r\n * @internal\r\n */\r\n [_elementWasCreated]: (id: Id64String) => void;\r\n\r\n /**\r\n * Throw if locks are required and the exclusive lock is not held on the supplied element.\r\n * Note: there is no need to check the shared locks on parents/models since an element cannot hold the exclusive lock without first obtaining them.\r\n * Called by functions like [[Element.onUpdate]], [[Element.onDelete]], etc.\r\n */\r\n checkExclusiveLock(id: Id64String, type: string, operation: string): void;\r\n\r\n /**\r\n * Throw if locks are required and a shared lock is not held on the supplied element.\r\n * Called by [[Element.onInsert]] to ensure shared lock is held on the new element's model and parent element.\r\n */\r\n checkSharedLock(id: Id64String, type: string, operation: string): void;\r\n\r\n /**\r\n * Determine whether the owning iModel currently holds the exclusive lock on the specified element.\r\n */\r\n holdsExclusiveLock(id: Id64String): boolean;\r\n\r\n /**\r\n * Determine whether the owning iModel currently holds a shared lock on the specified element.\r\n */\r\n holdsSharedLock(id: Id64String): boolean;\r\n\r\n /**\r\n * Acquire locks on one or more elements from the lock server, if required and not already held.\r\n * If any required lock is not available, this method throws an exception and *none* of the requested locks are acquired.\r\n * @note Acquiring the exclusive lock on an element requires also obtaining a shared lock on all its owner elements. This method will\r\n * attempt to acquire all necessary locks for both sets of input ids.\r\n */\r\n acquireLocks(arg: {\r\n /** if present, one or more elements to obtain shared lock */\r\n shared?: Id64Arg;\r\n /** if present, one or more elements to obtain exclusive lock */\r\n exclusive?: Id64Arg;\r\n }): Promise<void>;\r\n\r\n /** Release all locks currently held by this briefcase from the locker server.\r\n * This is typically done on your behalf by [[BriefcaseDb.pushChanges]].\r\n * You may want to do it manually when abandoning all of your briefcase's local changes.\r\n * You cannot release your locks if your briefcase contains local changes.\r\n * @throws Error if the briefcase has local changes, or if any other error occurs while releasing the locks.\r\n */\r\n releaseAllLocks(): Promise<void>;\r\n\r\n /**\r\n * Release all locks currently held by this Briefcase from the lock server.\r\n * Not possible to release locks unless push or abandon all changes. Should only be called internally.\r\n * @internal\r\n */\r\n [_releaseAllLocks]: () => Promise<void>;\r\n}\r\n"]}
1
+ {"version":3,"file":"LockControl.js","sourceRoot":"","sources":["../../src/LockControl.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;AAGH,gDAA6G","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module iModels\n */\n\nimport { Id64Arg, Id64String } from \"@itwin/core-bentley\";\nimport { _close, _elementWasCreated, _implementationProhibited, _releaseAllLocks } from \"./internal/Symbols\";\n\n/**\n * Interface for acquiring element locks to [coordinate simultaneous edits]($docs/learning/backend/ConcurrencyControl.md) from multiple briefcases.\n * @see [[IModelDb.locks]] to access the locks for an iModel.\n * @public\n */\nexport interface LockControl {\n /** @internal*/\n readonly [_implementationProhibited]: unknown;\n\n /**\n * true if this LockControl uses a server-based concurrency approach.\n */\n readonly isServerBased: boolean;\n\n /**\n * Close the local lock control database\n * @internal\n */\n [_close]: () => void;\n\n /**\n * Notification that a new element was just created. Called by [[Element.onInserted]]\n * @internal\n */\n [_elementWasCreated]: (id: Id64String) => void;\n\n /**\n * Throw if locks are required and the exclusive lock is not held on the supplied element.\n * Note: there is no need to check the shared locks on parents/models since an element cannot hold the exclusive lock without first obtaining them.\n * Called by functions like [[Element.onUpdate]], [[Element.onDelete]], etc.\n */\n checkExclusiveLock(id: Id64String, type: string, operation: string): void;\n\n /**\n * Throw if locks are required and a shared lock is not held on the supplied element.\n * Called by [[Element.onInsert]] to ensure shared lock is held on the new element's model and parent element.\n */\n checkSharedLock(id: Id64String, type: string, operation: string): void;\n\n /**\n * Determine whether the owning iModel currently holds the exclusive lock on the specified element.\n */\n holdsExclusiveLock(id: Id64String): boolean;\n\n /**\n * Determine whether the owning iModel currently holds a shared lock on the specified element.\n */\n holdsSharedLock(id: Id64String): boolean;\n\n /**\n * Acquire locks on one or more elements from the lock server, if required and not already held.\n * If any required lock is not available, this method throws an exception and *none* of the requested locks are acquired.\n * @note Acquiring the exclusive lock on an element requires also obtaining a shared lock on all its owner elements. This method will\n * attempt to acquire all necessary locks for both sets of input ids.\n */\n acquireLocks(arg: {\n /** if present, one or more elements to obtain shared lock */\n shared?: Id64Arg;\n /** if present, one or more elements to obtain exclusive lock */\n exclusive?: Id64Arg;\n }): Promise<void>;\n\n /** Release all locks currently held by this briefcase from the locker server.\n * This is typically done on your behalf by [[BriefcaseDb.pushChanges]].\n * You may want to do it manually when abandoning all of your briefcase's local changes.\n * You cannot release your locks if your briefcase contains local changes.\n * @throws Error if the briefcase has local changes, or if any other error occurs while releasing the locks.\n */\n releaseAllLocks(): Promise<void>;\n\n /**\n * Release all locks currently held by this Briefcase from the lock server.\n * Not possible to release locks unless push or abandon all changes. Should only be called internally.\n * @internal\n */\n [_releaseAllLocks]: () => Promise<void>;\n}\n"]}