@itwin/core-backend 5.10.0-dev.5 → 5.10.0-dev.6

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 +28 -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.d.ts +14 -62
  7. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  8. package/lib/cjs/BriefcaseManager.js +29 -162
  9. package/lib/cjs/BriefcaseManager.js.map +1 -1
  10. package/lib/cjs/CatalogDb.js.map +1 -1
  11. package/lib/cjs/Category.d.ts +4 -4
  12. package/lib/cjs/Category.js.map +1 -1
  13. package/lib/cjs/ChangeSummaryManager.js +2 -2
  14. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  15. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  16. package/lib/cjs/ChangesetECAdaptor.d.ts +6 -6
  17. package/lib/cjs/ChangesetECAdaptor.js +252 -252
  18. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  19. package/lib/cjs/ChangesetReader.js.map +1 -1
  20. package/lib/cjs/ChangesetReaderTypes.js.map +1 -1
  21. package/lib/cjs/ChannelControl.js.map +1 -1
  22. package/lib/cjs/CheckpointManager.js.map +1 -1
  23. package/lib/cjs/ClassRegistry.js +5 -5
  24. package/lib/cjs/ClassRegistry.js.map +1 -1
  25. package/lib/cjs/CloudSqlite.js.map +1 -1
  26. package/lib/cjs/CodeService.js.map +1 -1
  27. package/lib/cjs/CodeSpecs.d.ts +3 -3
  28. package/lib/cjs/CodeSpecs.js.map +1 -1
  29. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  30. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  31. package/lib/cjs/DevTools.js.map +1 -1
  32. package/lib/cjs/DisplayStyle.d.ts +2 -2
  33. package/lib/cjs/DisplayStyle.js.map +1 -1
  34. package/lib/cjs/ECDb.js.map +1 -1
  35. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  36. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  37. package/lib/cjs/ECSqlStatement.js.map +1 -1
  38. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  39. package/lib/cjs/EditTxn.js.map +1 -1
  40. package/lib/cjs/Element.d.ts +10 -10
  41. package/lib/cjs/Element.d.ts.map +1 -1
  42. package/lib/cjs/Element.js +2 -2
  43. package/lib/cjs/Element.js.map +1 -1
  44. package/lib/cjs/ElementAspect.d.ts +1 -1
  45. package/lib/cjs/ElementAspect.js.map +1 -1
  46. package/lib/cjs/ElementGraphics.js.map +1 -1
  47. package/lib/cjs/ElementTreeWalker.d.ts +5 -5
  48. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  49. package/lib/cjs/Entity.js.map +1 -1
  50. package/lib/cjs/EntityReferences.js.map +1 -1
  51. package/lib/cjs/ExportGraphics.js.map +1 -1
  52. package/lib/cjs/ExternalSource.d.ts +2 -2
  53. package/lib/cjs/ExternalSource.d.ts.map +1 -1
  54. package/lib/cjs/ExternalSource.js.map +1 -1
  55. package/lib/cjs/FontFile.js.map +1 -1
  56. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  57. package/lib/cjs/GeographicCRSServices.js.map +1 -1
  58. package/lib/cjs/GeometrySummary.js +47 -47
  59. package/lib/cjs/GeometrySummary.js.map +1 -1
  60. package/lib/cjs/IModelDb.d.ts +22 -22
  61. package/lib/cjs/IModelDb.js +28 -28
  62. package/lib/cjs/IModelDb.js.map +1 -1
  63. package/lib/cjs/IModelDbFonts.js.map +1 -1
  64. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  65. package/lib/cjs/IModelHost.js.map +1 -1
  66. package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
  67. package/lib/cjs/IModelJsFs.d.ts +2 -0
  68. package/lib/cjs/IModelJsFs.d.ts.map +1 -1
  69. package/lib/cjs/IModelJsFs.js +14 -0
  70. package/lib/cjs/IModelJsFs.js.map +1 -1
  71. package/lib/cjs/ImageSourceConversion.js.map +1 -1
  72. package/lib/cjs/IpcHost.js.map +1 -1
  73. package/lib/cjs/LineStyle.d.ts +6 -6
  74. package/lib/cjs/LineStyle.js.map +1 -1
  75. package/lib/cjs/LocalHub.js +1 -1
  76. package/lib/cjs/LocalHub.js.map +1 -1
  77. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  78. package/lib/cjs/LockControl.js.map +1 -1
  79. package/lib/cjs/Material.d.ts +1 -1
  80. package/lib/cjs/Material.js.map +1 -1
  81. package/lib/cjs/Model.d.ts +6 -6
  82. package/lib/cjs/Model.d.ts.map +1 -1
  83. package/lib/cjs/Model.js.map +1 -1
  84. package/lib/cjs/NativeAppStorage.js.map +1 -1
  85. package/lib/cjs/NativeHost.js.map +1 -1
  86. package/lib/cjs/NavigationRelationship.js.map +1 -1
  87. package/lib/cjs/PartialChangeUnifier.js +7 -7
  88. package/lib/cjs/PartialChangeUnifier.js.map +1 -1
  89. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  90. package/lib/cjs/PropertyStore.js.map +1 -1
  91. package/lib/cjs/Relationship.d.ts +10 -10
  92. package/lib/cjs/Relationship.js +6 -6
  93. package/lib/cjs/Relationship.js.map +1 -1
  94. package/lib/cjs/RpcBackend.js.map +1 -1
  95. package/lib/cjs/SQLiteDb.js.map +1 -1
  96. package/lib/cjs/Schema.js.map +1 -1
  97. package/lib/cjs/SchemaSync.js.map +1 -1
  98. package/lib/cjs/SchemaUtils.js.map +1 -1
  99. package/lib/cjs/SheetIndex.d.ts +4 -4
  100. package/lib/cjs/SheetIndex.d.ts.map +1 -1
  101. package/lib/cjs/SheetIndex.js.map +1 -1
  102. package/lib/cjs/SqliteChangesetReader.js.map +1 -1
  103. package/lib/cjs/SqliteStatement.js.map +1 -1
  104. package/lib/cjs/StashManager.js.map +1 -1
  105. package/lib/cjs/Texture.d.ts +1 -1
  106. package/lib/cjs/Texture.js.map +1 -1
  107. package/lib/cjs/TileStorage.js.map +1 -1
  108. package/lib/cjs/TxnManager.d.ts +3 -0
  109. package/lib/cjs/TxnManager.d.ts.map +1 -1
  110. package/lib/cjs/TxnManager.js +95 -13
  111. package/lib/cjs/TxnManager.js.map +1 -1
  112. package/lib/cjs/ViewDefinition.d.ts +6 -6
  113. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  114. package/lib/cjs/ViewDefinition.js.map +1 -1
  115. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  116. package/lib/cjs/ViewStore.js.map +1 -1
  117. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
  118. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  119. package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
  120. package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
  121. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  122. package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
  123. package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
  124. package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
  125. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  126. package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
  127. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
  128. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
  129. package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
  130. package/lib/cjs/core-backend.js.map +1 -1
  131. package/lib/cjs/domains/FunctionalElements.d.ts +1 -1
  132. package/lib/cjs/domains/FunctionalElements.d.ts.map +1 -1
  133. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  134. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  135. package/lib/cjs/domains/GenericElements.d.ts +2 -2
  136. package/lib/cjs/domains/GenericElements.d.ts.map +1 -1
  137. package/lib/cjs/domains/GenericElements.js.map +1 -1
  138. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  139. package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
  140. package/lib/cjs/internal/ChannelAdmin.d.ts +2 -2
  141. package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
  142. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  143. package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
  144. package/lib/cjs/internal/FontFileImpl.js.map +1 -1
  145. package/lib/cjs/internal/HubMock.js.map +1 -1
  146. package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
  147. package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
  148. package/lib/cjs/internal/NativePlatform.js.map +1 -1
  149. package/lib/cjs/internal/NoLocks.js.map +1 -1
  150. package/lib/cjs/internal/OnlineStatus.js.map +1 -1
  151. package/lib/cjs/internal/ServerBasedLocks.js +33 -33
  152. package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
  153. package/lib/cjs/internal/Symbols.js.map +1 -1
  154. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  155. package/lib/cjs/internal/cross-package.js.map +1 -1
  156. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -1
  157. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  158. package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  159. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  160. package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  161. package/lib/cjs/rpc/multipart.js.map +1 -1
  162. package/lib/cjs/rpc/tracing.js.map +1 -1
  163. package/lib/cjs/rpc/web/logging.js.map +1 -1
  164. package/lib/cjs/rpc/web/request.js.map +1 -1
  165. package/lib/cjs/rpc/web/response.js.map +1 -1
  166. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  167. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  168. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  169. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  170. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  171. package/lib/cjs/workspace/Settings.js.map +1 -1
  172. package/lib/cjs/workspace/SettingsDb.js.map +1 -1
  173. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  174. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  175. package/lib/cjs/workspace/Workspace.js.map +1 -1
  176. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  177. package/lib/esm/BackendHubAccess.js.map +1 -1
  178. package/lib/esm/BackendLoggerCategory.js.map +1 -1
  179. package/lib/esm/BisCoreSchema.js.map +1 -1
  180. package/lib/esm/BlobContainerService.js.map +1 -1
  181. package/lib/esm/BriefcaseManager.d.ts +14 -62
  182. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  183. package/lib/esm/BriefcaseManager.js +30 -163
  184. package/lib/esm/BriefcaseManager.js.map +1 -1
  185. package/lib/esm/CatalogDb.js.map +1 -1
  186. package/lib/esm/Category.d.ts +4 -4
  187. package/lib/esm/Category.js.map +1 -1
  188. package/lib/esm/ChangeSummaryManager.js +2 -2
  189. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  190. package/lib/esm/ChangedElementsDb.js.map +1 -1
  191. package/lib/esm/ChangesetECAdaptor.d.ts +6 -6
  192. package/lib/esm/ChangesetECAdaptor.js +252 -252
  193. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  194. package/lib/esm/ChangesetReader.js.map +1 -1
  195. package/lib/esm/ChangesetReaderTypes.js.map +1 -1
  196. package/lib/esm/ChannelControl.js.map +1 -1
  197. package/lib/esm/CheckpointManager.js.map +1 -1
  198. package/lib/esm/ClassRegistry.js +5 -5
  199. package/lib/esm/ClassRegistry.js.map +1 -1
  200. package/lib/esm/CloudSqlite.js.map +1 -1
  201. package/lib/esm/CodeService.js.map +1 -1
  202. package/lib/esm/CodeSpecs.d.ts +3 -3
  203. package/lib/esm/CodeSpecs.js.map +1 -1
  204. package/lib/esm/ConcurrentQuery.js.map +1 -1
  205. package/lib/esm/CustomViewState3dCreator.js.map +1 -1
  206. package/lib/esm/DevTools.js.map +1 -1
  207. package/lib/esm/DisplayStyle.d.ts +2 -2
  208. package/lib/esm/DisplayStyle.js.map +1 -1
  209. package/lib/esm/ECDb.js.map +1 -1
  210. package/lib/esm/ECSchemaXmlContext.js.map +1 -1
  211. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  212. package/lib/esm/ECSqlStatement.js.map +1 -1
  213. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  214. package/lib/esm/EditTxn.js.map +1 -1
  215. package/lib/esm/Element.d.ts +10 -10
  216. package/lib/esm/Element.d.ts.map +1 -1
  217. package/lib/esm/Element.js +2 -2
  218. package/lib/esm/Element.js.map +1 -1
  219. package/lib/esm/ElementAspect.d.ts +1 -1
  220. package/lib/esm/ElementAspect.js.map +1 -1
  221. package/lib/esm/ElementGraphics.js.map +1 -1
  222. package/lib/esm/ElementTreeWalker.d.ts +5 -5
  223. package/lib/esm/ElementTreeWalker.js.map +1 -1
  224. package/lib/esm/Entity.js.map +1 -1
  225. package/lib/esm/EntityReferences.js.map +1 -1
  226. package/lib/esm/ExportGraphics.js.map +1 -1
  227. package/lib/esm/ExternalSource.d.ts +2 -2
  228. package/lib/esm/ExternalSource.d.ts.map +1 -1
  229. package/lib/esm/ExternalSource.js.map +1 -1
  230. package/lib/esm/FontFile.js.map +1 -1
  231. package/lib/esm/GeoCoordConfig.js.map +1 -1
  232. package/lib/esm/GeographicCRSServices.js.map +1 -1
  233. package/lib/esm/GeometrySummary.js +47 -47
  234. package/lib/esm/GeometrySummary.js.map +1 -1
  235. package/lib/esm/IModelDb.d.ts +22 -22
  236. package/lib/esm/IModelDb.js +28 -28
  237. package/lib/esm/IModelDb.js.map +1 -1
  238. package/lib/esm/IModelDbFonts.js.map +1 -1
  239. package/lib/esm/IModelElementCloneContext.js.map +1 -1
  240. package/lib/esm/IModelHost.js.map +1 -1
  241. package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
  242. package/lib/esm/IModelJsFs.d.ts +2 -0
  243. package/lib/esm/IModelJsFs.d.ts.map +1 -1
  244. package/lib/esm/IModelJsFs.js +14 -0
  245. package/lib/esm/IModelJsFs.js.map +1 -1
  246. package/lib/esm/ImageSourceConversion.js.map +1 -1
  247. package/lib/esm/IpcHost.js.map +1 -1
  248. package/lib/esm/LineStyle.d.ts +6 -6
  249. package/lib/esm/LineStyle.js.map +1 -1
  250. package/lib/esm/LocalHub.js +1 -1
  251. package/lib/esm/LocalHub.js.map +1 -1
  252. package/lib/esm/LocalhostIpcHost.js.map +1 -1
  253. package/lib/esm/LockControl.js.map +1 -1
  254. package/lib/esm/Material.d.ts +1 -1
  255. package/lib/esm/Material.js.map +1 -1
  256. package/lib/esm/Model.d.ts +6 -6
  257. package/lib/esm/Model.d.ts.map +1 -1
  258. package/lib/esm/Model.js.map +1 -1
  259. package/lib/esm/NativeAppStorage.js.map +1 -1
  260. package/lib/esm/NativeHost.js.map +1 -1
  261. package/lib/esm/NavigationRelationship.js.map +1 -1
  262. package/lib/esm/PartialChangeUnifier.js +7 -7
  263. package/lib/esm/PartialChangeUnifier.js.map +1 -1
  264. package/lib/esm/PromiseMemoizer.js.map +1 -1
  265. package/lib/esm/PropertyStore.js.map +1 -1
  266. package/lib/esm/Relationship.d.ts +10 -10
  267. package/lib/esm/Relationship.js +6 -6
  268. package/lib/esm/Relationship.js.map +1 -1
  269. package/lib/esm/RpcBackend.js.map +1 -1
  270. package/lib/esm/SQLiteDb.js.map +1 -1
  271. package/lib/esm/Schema.js.map +1 -1
  272. package/lib/esm/SchemaSync.js.map +1 -1
  273. package/lib/esm/SchemaUtils.js.map +1 -1
  274. package/lib/esm/SheetIndex.d.ts +4 -4
  275. package/lib/esm/SheetIndex.d.ts.map +1 -1
  276. package/lib/esm/SheetIndex.js.map +1 -1
  277. package/lib/esm/SqliteChangesetReader.js.map +1 -1
  278. package/lib/esm/SqliteStatement.js.map +1 -1
  279. package/lib/esm/StashManager.js.map +1 -1
  280. package/lib/esm/Texture.d.ts +1 -1
  281. package/lib/esm/Texture.js.map +1 -1
  282. package/lib/esm/TileStorage.js.map +1 -1
  283. package/lib/esm/TxnManager.d.ts +3 -0
  284. package/lib/esm/TxnManager.d.ts.map +1 -1
  285. package/lib/esm/TxnManager.js +96 -14
  286. package/lib/esm/TxnManager.js.map +1 -1
  287. package/lib/esm/ViewDefinition.d.ts +6 -6
  288. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  289. package/lib/esm/ViewDefinition.js.map +1 -1
  290. package/lib/esm/ViewStateHydrator.js.map +1 -1
  291. package/lib/esm/ViewStore.js.map +1 -1
  292. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +1 -1
  293. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  294. package/lib/esm/annotations/FrameGeometry.js.map +1 -1
  295. package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
  296. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  297. package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
  298. package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
  299. package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
  300. package/lib/esm/core-backend.js.map +1 -1
  301. package/lib/esm/domains/FunctionalElements.d.ts +1 -1
  302. package/lib/esm/domains/FunctionalElements.d.ts.map +1 -1
  303. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  304. package/lib/esm/domains/FunctionalSchema.js.map +1 -1
  305. package/lib/esm/domains/GenericElements.d.ts +2 -2
  306. package/lib/esm/domains/GenericElements.d.ts.map +1 -1
  307. package/lib/esm/domains/GenericElements.js.map +1 -1
  308. package/lib/esm/domains/GenericSchema.js.map +1 -1
  309. package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
  310. package/lib/esm/internal/ChannelAdmin.d.ts +2 -2
  311. package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
  312. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  313. package/lib/esm/internal/ElementLRUCache.js.map +1 -1
  314. package/lib/esm/internal/FontFileImpl.js.map +1 -1
  315. package/lib/esm/internal/HubMock.js.map +1 -1
  316. package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
  317. package/lib/esm/internal/IntegrityCheck.js.map +1 -1
  318. package/lib/esm/internal/NativePlatform.js.map +1 -1
  319. package/lib/esm/internal/NoLocks.js.map +1 -1
  320. package/lib/esm/internal/OnlineStatus.js.map +1 -1
  321. package/lib/esm/internal/ServerBasedLocks.js +33 -33
  322. package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
  323. package/lib/esm/internal/Symbols.js.map +1 -1
  324. package/lib/esm/internal/annotations/fields.js.map +1 -1
  325. package/lib/esm/internal/cross-package.js.map +1 -1
  326. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -1
  327. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  328. package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
  329. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  330. package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
  331. package/lib/esm/rpc/multipart.js.map +1 -1
  332. package/lib/esm/rpc/tracing.js.map +1 -1
  333. package/lib/esm/rpc/web/logging.js.map +1 -1
  334. package/lib/esm/rpc/web/request.js.map +1 -1
  335. package/lib/esm/rpc/web/response.js.map +1 -1
  336. package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  337. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  338. package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  339. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  340. package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  341. package/lib/esm/test/AdvancedEqual.js.map +1 -1
  342. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  343. package/lib/esm/test/AttachDb.test.js +11 -11
  344. package/lib/esm/test/AttachDb.test.js.map +1 -1
  345. package/lib/esm/test/ElementDrivesElement.test.js +23 -23
  346. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  347. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  348. package/lib/esm/test/GeometryTestUtil.js.map +1 -1
  349. package/lib/esm/test/IModelHost.test.js.map +1 -1
  350. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  351. package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
  352. package/lib/esm/test/IpcHost.test.js.map +1 -1
  353. package/lib/esm/test/KnownTestLocations.js.map +1 -1
  354. package/lib/esm/test/PrintElementTree.js.map +1 -1
  355. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  356. package/lib/esm/test/RevisionUtility.js.map +1 -1
  357. package/lib/esm/test/SchemaUtils.test.js +25 -25
  358. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  359. package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
  360. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
  361. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  362. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  363. package/lib/esm/test/TestEditTxn.js.map +1 -1
  364. package/lib/esm/test/TestUtils.js.map +1 -1
  365. package/lib/esm/test/annotations/Fields.test.js +53 -53
  366. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  367. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  368. package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
  369. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  370. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  371. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  372. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  373. package/lib/esm/test/categories/Category.test.js.map +1 -1
  374. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  375. package/lib/esm/test/ecdb/CTE.test.js +88 -88
  376. package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
  377. package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
  378. package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
  379. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
  380. package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
  381. package/lib/esm/test/ecdb/ECDb.test.js +72 -72
  382. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  383. package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
  384. package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
  385. package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
  386. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  387. package/lib/esm/test/ecdb/ECSqlQuery.test.js +4 -4
  388. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  389. package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
  390. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  391. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  392. package/lib/esm/test/ecdb/QueryReaders.test.js +31 -31
  393. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  394. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  395. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  396. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
  397. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  398. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  399. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  400. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  401. package/lib/esm/test/element/ElementAspect.test.js +22 -22
  402. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  403. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  404. package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
  405. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  406. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  407. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  408. package/lib/esm/test/element/NullStructArray.test.js +13 -13
  409. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  410. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  411. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  412. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  413. package/lib/esm/test/font/FontFile.test.js.map +1 -1
  414. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  415. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
  416. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  417. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  418. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  419. package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
  420. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  421. package/lib/esm/test/hubaccess/SemanticRebase.test.js +2387 -213
  422. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  423. package/lib/esm/test/imageData.js.map +1 -1
  424. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  425. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  426. package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
  427. package/lib/esm/test/imodel/IModel.test.js +44 -44
  428. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  429. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  430. package/lib/esm/test/imodel/SchemaXmlImport.test.js +21 -21
  431. package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
  432. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  433. package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
  434. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  435. package/lib/esm/test/index.js.map +1 -1
  436. package/lib/esm/test/misc/DevTools.test.js.map +1 -1
  437. package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
  438. package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
  439. package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
  440. package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
  441. package/lib/esm/test/rpc/response.test.js.map +1 -1
  442. package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
  443. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  444. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  445. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  446. package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
  447. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  448. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
  449. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  450. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  451. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  452. package/lib/esm/test/standalone/ChangesetReader.test.js +246 -246
  453. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  454. package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
  455. package/lib/esm/test/standalone/DeleteElements.test.js.map +1 -1
  456. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  457. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  458. package/lib/esm/test/standalone/EditTxn.test.js.map +1 -1
  459. package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
  460. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  461. package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
  462. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  463. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  464. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  465. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  466. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  467. package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
  468. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  469. package/lib/esm/test/standalone/ITwinWorkspace.test.js.map +1 -1
  470. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  471. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  472. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  473. package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
  474. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  475. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  476. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  477. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js +135 -135
  478. package/lib/esm/test/standalone/SQliteChangesetReaderAndChangesetECAdaptor.test.js.map +1 -1
  479. package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
  480. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  481. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  482. package/lib/esm/test/standalone/Setting.test.js.map +1 -1
  483. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  484. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  485. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  486. package/lib/esm/test/standalone/StandaloneDb.test.js +20 -20
  487. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  488. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  489. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  490. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  491. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  492. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  493. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  494. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  495. package/lib/esm/test/standalone/iModelDb.test.js.map +1 -1
  496. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  497. package/lib/esm/workspace/Settings.js.map +1 -1
  498. package/lib/esm/workspace/SettingsDb.js.map +1 -1
  499. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  500. package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
  501. package/lib/esm/workspace/Workspace.js.map +1 -1
  502. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  503. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"IModelDbFontsImpl.js","sourceRoot":"","sources":["../../../src/internal/IModelDbFontsImpl.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 iModels\n */\n\nimport { FontFamilyDescriptor, FontFamilySelector, FontId, FontProps, FontType } from \"@itwin/core-common\";\nimport { _faceProps, _getData, _implementationProhibited, _key, _nativeDb } from \"./Symbols\";\nimport { IModelDb } from \"../IModelDb\";\nimport { EmbedFontFileArgs, IModelDbFonts, QueryMappedFamiliesArgs } from \"../IModelDbFonts\";\nimport { EmbeddedFontFile } from \"./FontFileImpl\";\nimport { assert, DbResult, Logger } from \"@itwin/core-bentley\";\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\nimport { FontFile } from \"../FontFile\";\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\n\nclass IModelDbFontsImpl implements IModelDbFonts {\n public readonly [_implementationProhibited] = undefined;\n readonly #db: IModelDb;\n\n public constructor(iModel: IModelDb) {\n this.#db = iModel;\n }\n\n public queryMappedFamilies(args?: QueryMappedFamiliesArgs): Iterable<FontProps> {\n const fontProps = this.#queryFontTable();\n if (args?.includeNonEmbedded) {\n return fontProps;\n }\n\n const fontNames = this.#getEmbeddedFontNames();\n return fontProps.filter((x) => fontNames.includes(x.name));\n }\n\n public queryEmbeddedFontFiles(): Iterable<FontFile> {\n const files: FontFile[] = [];\n this.#db.withSqliteStatement(`SELECT Id,StrData FROM be_Prop WHERE Namespace=\"dgn_Font\" AND Name=\"EmbeddedFaceData\"`, (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n let faces;\n try {\n faces = JSON.parse(stmt.getValueString(1)) as IModelJsNative.FontFaceProps[];\n } catch (e) {\n Logger.logError(BackendLoggerCategory.IModelDb, e);\n }\n\n if (!Array.isArray(faces) || faces.length === 0) {\n continue;\n }\n\n let type = faces[0].type;\n if (type !== FontType.Rsc && type !== FontType.Shx) {\n type = FontType.TrueType;\n }\n\n files.push(new EmbeddedFontFile(this.#db, stmt.getValueInteger(0), type, faces));\n }\n });\n\n return files;\n }\n\n public async embedFontFile(args: EmbedFontFileArgs): Promise<void> {\n this.#requireWritable();\n\n if (!args.file.isEmbeddable) {\n throw new Error(\"Font does not permit embedding\");\n }\n\n const file = args.file;\n for (const existing of this.queryEmbeddedFontFiles()) {\n if (existing[_key] === file[_key]) {\n // Already embedded - it's a no-op.\n return;\n }\n }\n\n let id = 0;\n const codes = this.#db.codeService?.internalCodes;\n if (codes) {\n id = await codes.writeLocker.reserveEmbeddedFaceDataId(args.file[_key]);\n } else {\n // CodeService not configured - schema lock required to prevent conflicting Ids in be_Prop table.\n await this.#db.acquireSchemaLock();\n const sql = `SELECT MAX(Id) FROM be_Prop WHERE Namespace=\"dgn_Font\" AND Name=\"EmbeddedFaceData\"`;\n id = this.#db.withSqliteStatement(sql, (stmt) => stmt.nextRow() ? stmt.getValueInteger(0) + 1 : 1);\n }\n\n assert(id > 0);\n const data = file[_getData]();\n this.#db[_nativeDb].embedFontFile(id, file[_faceProps], data, true);\n\n if (!args.skipFontIdAllocation) {\n const familyNames = new Set<string>(args.file.faces.map((x) => x.familyName));\n const acquireIds = Array.from(familyNames).map(async (x) => this.#acquireId({ name: x, type: args.file.type }, true).catch());\n await Promise.allSettled(acquireIds);\n }\n\n this.#db.clearFontMap();\n }\n\n public findId(selector: FontFamilySelector): FontId | undefined {\n let id;\n const sqlPostlude = undefined === selector.type ? \" ORDER BY Type ASC\" : \" AND Type=?\";\n const sql = `SELECT Id FROM dgn_Font WHERE Name=?${sqlPostlude}`;\n this.#db.withPreparedSqliteStatement(sql, (stmt) => {\n stmt.bindString(1, selector.name);\n if (undefined !== selector.type) {\n stmt.bindInteger(2, selector.type);\n }\n\n if (DbResult.BE_SQLITE_ROW === stmt.step()) {\n id = stmt.getValueInteger(0);\n }\n });\n\n return id;\n }\n\n public findDescriptor(id: FontId): FontFamilyDescriptor | undefined {\n let name, type;\n this.#db.withPreparedSqliteStatement(\"SELECT Name,Type FROM dgn_Font WHERE Id=?\", (stmt) => {\n stmt.bindInteger(1, id);\n if (DbResult.BE_SQLITE_ROW === stmt.step()) {\n const stmtName = stmt.getValueString(0);\n if (stmtName.length > 0) {\n name = stmtName;\n const typeCode = stmt.getValueInteger(1);\n type = (typeCode === FontType.Shx || typeCode === FontType.Rsc) ? typeCode : FontType.TrueType;\n }\n }\n });\n\n return undefined !== name && undefined !== type ? { name, type } : undefined;\n }\n\n public async acquireId(descriptor: FontFamilyDescriptor): Promise<FontId> {\n this.#requireWritable();\n return this.#acquireId(descriptor, false);\n }\n\n async #acquireId(descriptor: FontFamilyDescriptor, embeddingFaceData: boolean): Promise<FontId> {\n let id = this.findId(descriptor);\n if (undefined !== id) {\n return id;\n }\n\n const codes = this.#db.codeService?.internalCodes;\n if (codes) {\n id = await codes.writeLocker.reserveFontId({ fontName: descriptor.name, fontType: descriptor.type });\n } else {\n // If we're being called from `embedFontFile` then the schema lock is already held, don't bother re-acquiring it.\n if (!embeddingFaceData) {\n // No CodeService configured. We must obtain the schema lock and use the next available Id.\n await this.#db.acquireSchemaLock();\n }\n\n id = this.#db.withSqliteStatement(`SELECT MAX(Id) FROM dgn_Font`, (stmt) => stmt.nextRow() ? stmt.getValueInteger(0) + 1 : 1);\n }\n\n this.#db.withSqliteStatement(`INSERT INTO dgn_Font (Id,Type,Name) VALUES (?,?,?)`, (stmt) => {\n stmt.bindInteger(1, id);\n stmt.bindInteger(2, descriptor.type);\n stmt.bindString(3, descriptor.name);\n\n if (DbResult.BE_SQLITE_DONE !== stmt.step()) {\n throw new Error(\"Failed to insert font Id mapping\");\n }\n });\n\n this.#db.clearFontMap();\n\n return id;\n }\n\n #requireWritable(): void {\n if (this.#db.isReadonly) {\n throw new Error(\"iModel is read-only\");\n }\n }\n\n #getEmbeddedFontNames(): string[] {\n const names: string[] = [];\n\n const sql = `select DISTINCT json_extract(face.value, '$.familyName') from be_Prop, json_each(be_Prop.StrData) as face where namespace=\"dgn_Font\" and name=\"EmbeddedFaceData\"`;\n this.#db.withPreparedSqliteStatement(sql, (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n names.push(stmt.getValueString(0));\n }\n });\n\n return names;\n }\n\n #queryFontTable(): Array<FontProps> {\n const fonts: FontProps[] = [];\n const sql = `SELECT Id,Name,Type FROM dgn_Font`;\n this.#db.withPreparedSqliteStatement(sql, (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n const name = stmt.getValueString(1);\n const typeCode = stmt.getValueInteger(2);\n const type = (typeCode === FontType.Shx || typeCode === FontType.Rsc) ? typeCode : FontType.TrueType;\n if (name.length > 0) {\n fonts.push({\n name,\n type,\n id: stmt.getValueInteger(0),\n });\n }\n }\n });\n\n return fonts;\n }\n}\n\nexport function createIModelDbFonts(db: IModelDb): IModelDbFonts {\n return new IModelDbFontsImpl(db);\n}\n"]}
1
+ {"version":3,"file":"IModelDbFontsImpl.js","sourceRoot":"","sources":["../../../src/internal/IModelDbFontsImpl.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 iModels\r\n */\r\n\r\nimport { FontFamilyDescriptor, FontFamilySelector, FontId, FontProps, FontType } from \"@itwin/core-common\";\r\nimport { _faceProps, _getData, _implementationProhibited, _key, _nativeDb } from \"./Symbols\";\r\nimport { IModelDb } from \"../IModelDb\";\r\nimport { EmbedFontFileArgs, IModelDbFonts, QueryMappedFamiliesArgs } from \"../IModelDbFonts\";\r\nimport { EmbeddedFontFile } from \"./FontFileImpl\";\r\nimport { assert, DbResult, Logger } from \"@itwin/core-bentley\";\r\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { FontFile } from \"../FontFile\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\n\r\nclass IModelDbFontsImpl implements IModelDbFonts {\r\n public readonly [_implementationProhibited] = undefined;\r\n readonly #db: IModelDb;\r\n\r\n public constructor(iModel: IModelDb) {\r\n this.#db = iModel;\r\n }\r\n\r\n public queryMappedFamilies(args?: QueryMappedFamiliesArgs): Iterable<FontProps> {\r\n const fontProps = this.#queryFontTable();\r\n if (args?.includeNonEmbedded) {\r\n return fontProps;\r\n }\r\n\r\n const fontNames = this.#getEmbeddedFontNames();\r\n return fontProps.filter((x) => fontNames.includes(x.name));\r\n }\r\n\r\n public queryEmbeddedFontFiles(): Iterable<FontFile> {\r\n const files: FontFile[] = [];\r\n this.#db.withSqliteStatement(`SELECT Id,StrData FROM be_Prop WHERE Namespace=\"dgn_Font\" AND Name=\"EmbeddedFaceData\"`, (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n let faces;\r\n try {\r\n faces = JSON.parse(stmt.getValueString(1)) as IModelJsNative.FontFaceProps[];\r\n } catch (e) {\r\n Logger.logError(BackendLoggerCategory.IModelDb, e);\r\n }\r\n\r\n if (!Array.isArray(faces) || faces.length === 0) {\r\n continue;\r\n }\r\n\r\n let type = faces[0].type;\r\n if (type !== FontType.Rsc && type !== FontType.Shx) {\r\n type = FontType.TrueType;\r\n }\r\n\r\n files.push(new EmbeddedFontFile(this.#db, stmt.getValueInteger(0), type, faces));\r\n }\r\n });\r\n\r\n return files;\r\n }\r\n\r\n public async embedFontFile(args: EmbedFontFileArgs): Promise<void> {\r\n this.#requireWritable();\r\n\r\n if (!args.file.isEmbeddable) {\r\n throw new Error(\"Font does not permit embedding\");\r\n }\r\n\r\n const file = args.file;\r\n for (const existing of this.queryEmbeddedFontFiles()) {\r\n if (existing[_key] === file[_key]) {\r\n // Already embedded - it's a no-op.\r\n return;\r\n }\r\n }\r\n\r\n let id = 0;\r\n const codes = this.#db.codeService?.internalCodes;\r\n if (codes) {\r\n id = await codes.writeLocker.reserveEmbeddedFaceDataId(args.file[_key]);\r\n } else {\r\n // CodeService not configured - schema lock required to prevent conflicting Ids in be_Prop table.\r\n await this.#db.acquireSchemaLock();\r\n const sql = `SELECT MAX(Id) FROM be_Prop WHERE Namespace=\"dgn_Font\" AND Name=\"EmbeddedFaceData\"`;\r\n id = this.#db.withSqliteStatement(sql, (stmt) => stmt.nextRow() ? stmt.getValueInteger(0) + 1 : 1);\r\n }\r\n\r\n assert(id > 0);\r\n const data = file[_getData]();\r\n this.#db[_nativeDb].embedFontFile(id, file[_faceProps], data, true);\r\n\r\n if (!args.skipFontIdAllocation) {\r\n const familyNames = new Set<string>(args.file.faces.map((x) => x.familyName));\r\n const acquireIds = Array.from(familyNames).map(async (x) => this.#acquireId({ name: x, type: args.file.type }, true).catch());\r\n await Promise.allSettled(acquireIds);\r\n }\r\n\r\n this.#db.clearFontMap();\r\n }\r\n\r\n public findId(selector: FontFamilySelector): FontId | undefined {\r\n let id;\r\n const sqlPostlude = undefined === selector.type ? \" ORDER BY Type ASC\" : \" AND Type=?\";\r\n const sql = `SELECT Id FROM dgn_Font WHERE Name=?${sqlPostlude}`;\r\n this.#db.withPreparedSqliteStatement(sql, (stmt) => {\r\n stmt.bindString(1, selector.name);\r\n if (undefined !== selector.type) {\r\n stmt.bindInteger(2, selector.type);\r\n }\r\n\r\n if (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n id = stmt.getValueInteger(0);\r\n }\r\n });\r\n\r\n return id;\r\n }\r\n\r\n public findDescriptor(id: FontId): FontFamilyDescriptor | undefined {\r\n let name, type;\r\n this.#db.withPreparedSqliteStatement(\"SELECT Name,Type FROM dgn_Font WHERE Id=?\", (stmt) => {\r\n stmt.bindInteger(1, id);\r\n if (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n const stmtName = stmt.getValueString(0);\r\n if (stmtName.length > 0) {\r\n name = stmtName;\r\n const typeCode = stmt.getValueInteger(1);\r\n type = (typeCode === FontType.Shx || typeCode === FontType.Rsc) ? typeCode : FontType.TrueType;\r\n }\r\n }\r\n });\r\n\r\n return undefined !== name && undefined !== type ? { name, type } : undefined;\r\n }\r\n\r\n public async acquireId(descriptor: FontFamilyDescriptor): Promise<FontId> {\r\n this.#requireWritable();\r\n return this.#acquireId(descriptor, false);\r\n }\r\n\r\n async #acquireId(descriptor: FontFamilyDescriptor, embeddingFaceData: boolean): Promise<FontId> {\r\n let id = this.findId(descriptor);\r\n if (undefined !== id) {\r\n return id;\r\n }\r\n\r\n const codes = this.#db.codeService?.internalCodes;\r\n if (codes) {\r\n id = await codes.writeLocker.reserveFontId({ fontName: descriptor.name, fontType: descriptor.type });\r\n } else {\r\n // If we're being called from `embedFontFile` then the schema lock is already held, don't bother re-acquiring it.\r\n if (!embeddingFaceData) {\r\n // No CodeService configured. We must obtain the schema lock and use the next available Id.\r\n await this.#db.acquireSchemaLock();\r\n }\r\n\r\n id = this.#db.withSqliteStatement(`SELECT MAX(Id) FROM dgn_Font`, (stmt) => stmt.nextRow() ? stmt.getValueInteger(0) + 1 : 1);\r\n }\r\n\r\n this.#db.withSqliteStatement(`INSERT INTO dgn_Font (Id,Type,Name) VALUES (?,?,?)`, (stmt) => {\r\n stmt.bindInteger(1, id);\r\n stmt.bindInteger(2, descriptor.type);\r\n stmt.bindString(3, descriptor.name);\r\n\r\n if (DbResult.BE_SQLITE_DONE !== stmt.step()) {\r\n throw new Error(\"Failed to insert font Id mapping\");\r\n }\r\n });\r\n\r\n this.#db.clearFontMap();\r\n\r\n return id;\r\n }\r\n\r\n #requireWritable(): void {\r\n if (this.#db.isReadonly) {\r\n throw new Error(\"iModel is read-only\");\r\n }\r\n }\r\n\r\n #getEmbeddedFontNames(): string[] {\r\n const names: string[] = [];\r\n\r\n const sql = `select DISTINCT json_extract(face.value, '$.familyName') from be_Prop, json_each(be_Prop.StrData) as face where namespace=\"dgn_Font\" and name=\"EmbeddedFaceData\"`;\r\n this.#db.withPreparedSqliteStatement(sql, (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n names.push(stmt.getValueString(0));\r\n }\r\n });\r\n\r\n return names;\r\n }\r\n\r\n #queryFontTable(): Array<FontProps> {\r\n const fonts: FontProps[] = [];\r\n const sql = `SELECT Id,Name,Type FROM dgn_Font`;\r\n this.#db.withPreparedSqliteStatement(sql, (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n const name = stmt.getValueString(1);\r\n const typeCode = stmt.getValueInteger(2);\r\n const type = (typeCode === FontType.Shx || typeCode === FontType.Rsc) ? typeCode : FontType.TrueType;\r\n if (name.length > 0) {\r\n fonts.push({\r\n name,\r\n type,\r\n id: stmt.getValueInteger(0),\r\n });\r\n }\r\n }\r\n });\r\n\r\n return fonts;\r\n }\r\n}\r\n\r\nexport function createIModelDbFonts(db: IModelDb): IModelDbFonts {\r\n return new IModelDbFontsImpl(db);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IntegrityCheck.js","sourceRoot":"","sources":["../../../src/internal/IntegrityCheck.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 { IModelStatus } from \"@itwin/core-bentley\";\nimport { IModelError } from \"@itwin/core-common\";\nimport { IModelDb } from \"../IModelDb\";\n\n/**\n * Information about each integrity check type, including the name, expected result type, and SQL query to execute\n * @internal\n */\nexport const integrityCheckTypeMap = {\n checkDataColumns: {\n name: \"Check Data Columns\",\n resultType: \"CheckDataColumnsResultRow\",\n sqlCommand: \"check_data_columns\",\n sqlQuery: `PRAGMA integrity_check(check_data_columns) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n checkECProfile: {\n name: \"Check EC Profile\",\n resultType: \"CheckECProfileResultRow\",\n sqlCommand: \"check_ec_profile\",\n sqlQuery: `PRAGMA integrity_check(check_ec_profile) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n checkNavigationClassIds: {\n name: \"Check Navigation Class Ids\",\n resultType: \"CheckNavClassIdsResultRow\",\n sqlCommand: \"check_nav_class_ids\",\n sqlQuery: `PRAGMA integrity_check(check_nav_class_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n checkNavigationIds: {\n name: \"Check Navigation Ids\",\n resultType: \"CheckNavIdsResultRow\",\n sqlCommand: \"check_nav_ids\",\n sqlQuery: `PRAGMA integrity_check(check_nav_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n checkLinktableForeignKeyClassIds: {\n name: \"Check Link Table Foreign Key Class Ids\",\n resultType: \"CheckLinkTableFkClassIdsResultRow\",\n sqlCommand: \"check_linktable_fk_class_ids\",\n sqlQuery: `PRAGMA integrity_check(check_linktable_fk_class_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n checkLinktableForeignKeyIds: {\n name: \"Check Link Table Foreign Key Ids\",\n resultType: \"CheckLinkTableFkIdsResultRow\",\n sqlCommand: \"check_linktable_fk_ids\",\n sqlQuery: `PRAGMA integrity_check(check_linktable_fk_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n checkClassIds: {\n name: \"Check Class Ids\",\n resultType: \"CheckClassIdsResultRow\",\n sqlCommand: \"check_class_ids\",\n sqlQuery: `PRAGMA integrity_check(check_class_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n checkDataSchema: {\n name: \"Check Data Schema\",\n resultType: \"CheckDataSchemaResultRow\",\n sqlCommand: \"check_data_schema\",\n sqlQuery: `PRAGMA integrity_check(check_data_schema) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n checkSchemaLoad: {\n name: \"Check Schema Load\",\n resultType: \"CheckSchemaLoadResultRow\",\n sqlCommand: \"check_schema_load\",\n sqlQuery: `PRAGMA integrity_check(check_schema_load) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n checkMissingChildRows: {\n name: \"Check Missing Child Rows\",\n resultType: \"CheckMissingChildRowsResultRow\",\n sqlCommand: \"check_missing_child_rows\",\n sqlQuery: `PRAGMA integrity_check(check_missing_child_rows) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\n },\n} as const;\n\n/**\n * Type representing the keys of the integrityCheckType map, which correspond to the different types of integrity checks that can be performed.\n */\nexport type IntegrityCheckKey = keyof typeof integrityCheckTypeMap;\n\n/** Map of integrity check keys to their result row types */\ninterface IntegrityCheckResultTypeMap {\n checkDataColumns: CheckDataColumnsResultRow;\n checkECProfile: CheckECProfileResultRow;\n checkNavigationClassIds: CheckNavClassIdsResultRow;\n checkNavigationIds: CheckNavIdsResultRow;\n checkLinktableForeignKeyClassIds: CheckLinkTableFkClassIdsResultRow;\n checkLinktableForeignKeyIds: CheckLinkTableFkIdsResultRow;\n checkClassIds: CheckClassIdsResultRow;\n checkDataSchema: CheckDataSchemaResultRow;\n checkSchemaLoad: CheckSchemaLoadResultRow;\n checkMissingChildRows: CheckMissingChildRowsResultRow;\n}\n\n/** Checks the Map to give the return type of a specific integrity check */\ntype IntegrityCheckResultRow<K extends IntegrityCheckKey> = IntegrityCheckResultTypeMap[K];\n\n/**\n * Return type for quick integrity check\n */\nexport interface QuickIntegrityCheckResultRow {\n check: string;\n passed: boolean;\n elapsedSeconds: string;\n}\n\n/**\n * Return type for Check Data Columns integrity check\n */\nexport interface CheckDataColumnsResultRow {\n sno: number;\n table: string;\n column: string;\n}\n\n/**\n * Return type for Check EC Profile integrity check\n */\nexport interface CheckECProfileResultRow {\n sno: number;\n type: string;\n name: string;\n issue: string;\n}\n\n/**\n * Return type for Check Navigation Class Ids integrity check\n */\nexport interface CheckNavClassIdsResultRow {\n sno: number;\n id: string;\n class: string;\n property: string;\n navId: string;\n navClassId: string;\n}\n\n/**\n * Return type for Check Navigation Ids integrity check\n */\nexport interface CheckNavIdsResultRow {\n sno: number;\n id: string;\n class: string;\n property: string;\n navId: string;\n primaryClass: string;\n}\n\n/**\n * Return type for Check Link Table Foreign Key Class Ids integrity check\n */\nexport interface CheckLinkTableFkClassIdsResultRow {\n sno: number;\n id: string;\n relationship: string;\n property: string;\n keyId: string;\n keyClassId: string;\n}\n\n/**\n * Return type for Check Link Table Foreign Key Ids integrity check\n */\nexport interface CheckLinkTableFkIdsResultRow {\n sno: number;\n id: string;\n relationship: string;\n property: string;\n keyId: string;\n primaryClass: string;\n}\n\n/**\n * Return type for Check Class Ids integrity check\n */\nexport interface CheckClassIdsResultRow {\n sno: number;\n class: string;\n id: string;\n classId: string;\n type: string;\n}\n\n/**\n * Return type for Check Data Schema integrity check\n */\nexport interface CheckDataSchemaResultRow {\n sno: number;\n type: string;\n name: string;\n}\n\n/**\n * Return type for Check Schema Load integrity check\n */\nexport interface CheckSchemaLoadResultRow {\n sno: number;\n schema: string;\n}\n\n/**\n * Return type for Check Missing Child Rows integrity check\n */\nexport interface CheckMissingChildRowsResultRow {\n sno: number;\n class: string;\n id: string;\n classId: string;\n missingRowInTables: string;\n}\n\n/**\n * Return type for integrity check results, including the check name, whether it passed, and the specific results (if any)\n */\nexport interface IntegrityCheckResult {\n /** The name of the integrity check that was performed */\n check: string;\n /** Whether the integrity check passed (i.e. no issues were found = true) */\n passed: boolean;\n /** The specific results returned by the integrity check, which may include details about any issues that were found.\n * In the case where issues are found, this will be an array of result rows specific to the type of check that was performed,\n * or an array of quick integrity check results if it was a quick check. */\n results: IntegrityCheckResultRow<IntegrityCheckKey>[] | QuickIntegrityCheckResultRow[];\n}\n\n/**\n * Gets the user-friendly name of an integrity check based on its key or SQL command.\n * It first attempts to find a direct match for the key in the integrityCheckTypeMap. If not found, it searches for a match based on the SQL command.\n * If still not found, it returns the original check string.\n * @param check - The integrity check key or SQL command to get the name of\n * @returns The user-friendly name of the integrity check, or the original check string if no match is found\n * @internal\n */\nexport function getIntegrityCheckName(check: string): string {\n // First try direct lookup by key\n const directLookup = integrityCheckTypeMap[check as IntegrityCheckKey];\n if (directLookup) {\n return directLookup.name;\n }\n // If not found, search by sqlCommand\n for (const [, value] of Object.entries(integrityCheckTypeMap)) {\n if (value.sqlCommand === check) {\n return value.name;\n }\n }\n // Fallback to the original check string\n return check;\n}\n\n/**\n * Performs a quick integrity check on the given iModel.\n * @param iModel The IModelDb instance to perform the integrity check on\n * @returns An array of results for each check performed, including the check name, whether it passed, and the elapsed time in seconds\n * @internal\n */\nexport async function performQuickIntegrityCheck(iModel: IModelDb): Promise<QuickIntegrityCheckResultRow[]> {\n const integrityCheckQuery = \"PRAGMA integrity_check ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\";\n const integrityCheckResults: QuickIntegrityCheckResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckQuery, undefined, { usePrimaryConn: true })) {\n integrityCheckResults.push({ check: getIntegrityCheckName(row.check), passed: row.result, elapsedSeconds: row.elapsed_sec});\n };\n return integrityCheckResults;\n}\n\n/**\n * Performs a specific integrity check on the given iModel based on the provided check key, and returns the results specific to that check type.\n * @param iModel The IModelDb instance to perform the integrity check on\n * @param check The key of the specific integrity check to perform\n * @return An array of results specific to the integrity check that was performed. The type of the result rows will depend on the check that was executed.\n * @throws IModelError with status BadRequest if an unknown integrity check key is provided\n * @internal\n */\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkDataColumns\"): Promise<IntegrityCheckResultRow<\"checkDataColumns\">[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkECProfile\"): Promise<IntegrityCheckResultRow<\"checkECProfile\">[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkNavigationClassIds\"): Promise<IntegrityCheckResultRow<\"checkNavigationClassIds\">[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkNavigationIds\"): Promise<IntegrityCheckResultRow<\"checkNavigationIds\">[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkLinktableForeignKeyClassIds\"): Promise<IntegrityCheckResultRow<\"checkLinktableForeignKeyClassIds\">[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkLinktableForeignKeyIds\"): Promise<IntegrityCheckResultRow<\"checkLinktableForeignKeyIds\">[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkClassIds\"): Promise<IntegrityCheckResultRow<\"checkClassIds\">[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkDataSchema\"): Promise<IntegrityCheckResultRow<\"checkDataSchema\">[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkSchemaLoad\"): Promise<IntegrityCheckResultRow<\"checkSchemaLoad\">[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkMissingChildRows\"): Promise<IntegrityCheckResultRow<\"checkMissingChildRows\">[]>;\nexport async function performSpecificIntegrityCheck<K extends IntegrityCheckKey>(iModel: IModelDb, check: K): Promise<IntegrityCheckResultRow<K>[]>;\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: IntegrityCheckKey): Promise<IntegrityCheckResultRow<IntegrityCheckKey>[]> {\n switch (check) {\n case \"checkDataColumns\": {\n const results: CheckDataColumnsResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkDataColumns.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, table: row.table, column: row.column });\n }\n return results;\n }\n case \"checkECProfile\": {\n const results: CheckECProfileResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkECProfile.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, type: row.type, name: row.name, issue: row.issue });\n }\n return results;\n }\n case \"checkNavigationClassIds\": {\n const results: CheckNavClassIdsResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkNavigationClassIds.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, id: row.id, class: row.class, property: row.property, navId: row.nav_id, navClassId: row.nav_classId });\n }\n return results;\n }\n case \"checkNavigationIds\": {\n const results: CheckNavIdsResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkNavigationIds.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, id: row.id, class: row.class, property: row.property, navId: row.nav_id, primaryClass: row.primary_class });\n }\n return results;\n }\n case \"checkLinktableForeignKeyClassIds\": {\n const results: CheckLinkTableFkClassIdsResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkLinktableForeignKeyClassIds.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, id: row.id, relationship: row.relationship, property: row.property, keyId: row.key_id, keyClassId: row.key_classId });\n }\n return results;\n }\n case \"checkLinktableForeignKeyIds\": {\n const results: CheckLinkTableFkIdsResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkLinktableForeignKeyIds.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, id: row.id, relationship: row.relationship, property: row.property, keyId: row.key_id, primaryClass: row.primary_class });\n }\n return results;\n }\n case \"checkClassIds\": {\n const results: CheckClassIdsResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkClassIds.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, class: row.class, id: row.id, classId: row.class_id, type: row.type });\n }\n return results;\n }\n case \"checkDataSchema\": {\n const results: CheckDataSchemaResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkDataSchema.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, type: row.type, name: row.name });\n }\n return results;\n }\n case \"checkSchemaLoad\": {\n const results: CheckSchemaLoadResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkSchemaLoad.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, schema: row.schema });\n }\n return results;\n }\n case \"checkMissingChildRows\": {\n const results: CheckMissingChildRowsResultRow[] = [];\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkMissingChildRows.sqlQuery, undefined, { usePrimaryConn: true })) {\n results.push({ sno: row.sno, class: row.class, id: row.id, classId: row.class_id, missingRowInTables: row.MissingRowInTables });\n }\n return results;\n }\n default:\n throw new IModelError(IModelStatus.BadRequest, `Unknown integrity check type`);\n }\n}"]}
1
+ {"version":3,"file":"IntegrityCheck.js","sourceRoot":"","sources":["../../../src/internal/IntegrityCheck.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 { IModelStatus } from \"@itwin/core-bentley\";\r\nimport { IModelError } from \"@itwin/core-common\";\r\nimport { IModelDb } from \"../IModelDb\";\r\n\r\n/**\r\n * Information about each integrity check type, including the name, expected result type, and SQL query to execute\r\n * @internal\r\n */\r\nexport const integrityCheckTypeMap = {\r\n checkDataColumns: {\r\n name: \"Check Data Columns\",\r\n resultType: \"CheckDataColumnsResultRow\",\r\n sqlCommand: \"check_data_columns\",\r\n sqlQuery: `PRAGMA integrity_check(check_data_columns) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n checkECProfile: {\r\n name: \"Check EC Profile\",\r\n resultType: \"CheckECProfileResultRow\",\r\n sqlCommand: \"check_ec_profile\",\r\n sqlQuery: `PRAGMA integrity_check(check_ec_profile) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n checkNavigationClassIds: {\r\n name: \"Check Navigation Class Ids\",\r\n resultType: \"CheckNavClassIdsResultRow\",\r\n sqlCommand: \"check_nav_class_ids\",\r\n sqlQuery: `PRAGMA integrity_check(check_nav_class_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n checkNavigationIds: {\r\n name: \"Check Navigation Ids\",\r\n resultType: \"CheckNavIdsResultRow\",\r\n sqlCommand: \"check_nav_ids\",\r\n sqlQuery: `PRAGMA integrity_check(check_nav_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n checkLinktableForeignKeyClassIds: {\r\n name: \"Check Link Table Foreign Key Class Ids\",\r\n resultType: \"CheckLinkTableFkClassIdsResultRow\",\r\n sqlCommand: \"check_linktable_fk_class_ids\",\r\n sqlQuery: `PRAGMA integrity_check(check_linktable_fk_class_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n checkLinktableForeignKeyIds: {\r\n name: \"Check Link Table Foreign Key Ids\",\r\n resultType: \"CheckLinkTableFkIdsResultRow\",\r\n sqlCommand: \"check_linktable_fk_ids\",\r\n sqlQuery: `PRAGMA integrity_check(check_linktable_fk_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n checkClassIds: {\r\n name: \"Check Class Ids\",\r\n resultType: \"CheckClassIdsResultRow\",\r\n sqlCommand: \"check_class_ids\",\r\n sqlQuery: `PRAGMA integrity_check(check_class_ids) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n checkDataSchema: {\r\n name: \"Check Data Schema\",\r\n resultType: \"CheckDataSchemaResultRow\",\r\n sqlCommand: \"check_data_schema\",\r\n sqlQuery: `PRAGMA integrity_check(check_data_schema) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n checkSchemaLoad: {\r\n name: \"Check Schema Load\",\r\n resultType: \"CheckSchemaLoadResultRow\",\r\n sqlCommand: \"check_schema_load\",\r\n sqlQuery: `PRAGMA integrity_check(check_schema_load) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n checkMissingChildRows: {\r\n name: \"Check Missing Child Rows\",\r\n resultType: \"CheckMissingChildRowsResultRow\",\r\n sqlCommand: \"check_missing_child_rows\",\r\n sqlQuery: `PRAGMA integrity_check(check_missing_child_rows) ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`,\r\n },\r\n} as const;\r\n\r\n/**\r\n * Type representing the keys of the integrityCheckType map, which correspond to the different types of integrity checks that can be performed.\r\n */\r\nexport type IntegrityCheckKey = keyof typeof integrityCheckTypeMap;\r\n\r\n/** Map of integrity check keys to their result row types */\r\ninterface IntegrityCheckResultTypeMap {\r\n checkDataColumns: CheckDataColumnsResultRow;\r\n checkECProfile: CheckECProfileResultRow;\r\n checkNavigationClassIds: CheckNavClassIdsResultRow;\r\n checkNavigationIds: CheckNavIdsResultRow;\r\n checkLinktableForeignKeyClassIds: CheckLinkTableFkClassIdsResultRow;\r\n checkLinktableForeignKeyIds: CheckLinkTableFkIdsResultRow;\r\n checkClassIds: CheckClassIdsResultRow;\r\n checkDataSchema: CheckDataSchemaResultRow;\r\n checkSchemaLoad: CheckSchemaLoadResultRow;\r\n checkMissingChildRows: CheckMissingChildRowsResultRow;\r\n}\r\n\r\n/** Checks the Map to give the return type of a specific integrity check */\r\ntype IntegrityCheckResultRow<K extends IntegrityCheckKey> = IntegrityCheckResultTypeMap[K];\r\n\r\n/**\r\n * Return type for quick integrity check\r\n */\r\nexport interface QuickIntegrityCheckResultRow {\r\n check: string;\r\n passed: boolean;\r\n elapsedSeconds: string;\r\n}\r\n\r\n/**\r\n * Return type for Check Data Columns integrity check\r\n */\r\nexport interface CheckDataColumnsResultRow {\r\n sno: number;\r\n table: string;\r\n column: string;\r\n}\r\n\r\n/**\r\n * Return type for Check EC Profile integrity check\r\n */\r\nexport interface CheckECProfileResultRow {\r\n sno: number;\r\n type: string;\r\n name: string;\r\n issue: string;\r\n}\r\n\r\n/**\r\n * Return type for Check Navigation Class Ids integrity check\r\n */\r\nexport interface CheckNavClassIdsResultRow {\r\n sno: number;\r\n id: string;\r\n class: string;\r\n property: string;\r\n navId: string;\r\n navClassId: string;\r\n}\r\n\r\n/**\r\n * Return type for Check Navigation Ids integrity check\r\n */\r\nexport interface CheckNavIdsResultRow {\r\n sno: number;\r\n id: string;\r\n class: string;\r\n property: string;\r\n navId: string;\r\n primaryClass: string;\r\n}\r\n\r\n/**\r\n * Return type for Check Link Table Foreign Key Class Ids integrity check\r\n */\r\nexport interface CheckLinkTableFkClassIdsResultRow {\r\n sno: number;\r\n id: string;\r\n relationship: string;\r\n property: string;\r\n keyId: string;\r\n keyClassId: string;\r\n}\r\n\r\n/**\r\n * Return type for Check Link Table Foreign Key Ids integrity check\r\n */\r\nexport interface CheckLinkTableFkIdsResultRow {\r\n sno: number;\r\n id: string;\r\n relationship: string;\r\n property: string;\r\n keyId: string;\r\n primaryClass: string;\r\n}\r\n\r\n/**\r\n * Return type for Check Class Ids integrity check\r\n */\r\nexport interface CheckClassIdsResultRow {\r\n sno: number;\r\n class: string;\r\n id: string;\r\n classId: string;\r\n type: string;\r\n}\r\n\r\n/**\r\n * Return type for Check Data Schema integrity check\r\n */\r\nexport interface CheckDataSchemaResultRow {\r\n sno: number;\r\n type: string;\r\n name: string;\r\n}\r\n\r\n/**\r\n * Return type for Check Schema Load integrity check\r\n */\r\nexport interface CheckSchemaLoadResultRow {\r\n sno: number;\r\n schema: string;\r\n}\r\n\r\n/**\r\n * Return type for Check Missing Child Rows integrity check\r\n */\r\nexport interface CheckMissingChildRowsResultRow {\r\n sno: number;\r\n class: string;\r\n id: string;\r\n classId: string;\r\n missingRowInTables: string;\r\n}\r\n\r\n/**\r\n * Return type for integrity check results, including the check name, whether it passed, and the specific results (if any)\r\n */\r\nexport interface IntegrityCheckResult {\r\n /** The name of the integrity check that was performed */\r\n check: string;\r\n /** Whether the integrity check passed (i.e. no issues were found = true) */\r\n passed: boolean;\r\n /** The specific results returned by the integrity check, which may include details about any issues that were found.\r\n * In the case where issues are found, this will be an array of result rows specific to the type of check that was performed,\r\n * or an array of quick integrity check results if it was a quick check. */\r\n results: IntegrityCheckResultRow<IntegrityCheckKey>[] | QuickIntegrityCheckResultRow[];\r\n}\r\n\r\n/**\r\n * Gets the user-friendly name of an integrity check based on its key or SQL command.\r\n * It first attempts to find a direct match for the key in the integrityCheckTypeMap. If not found, it searches for a match based on the SQL command.\r\n * If still not found, it returns the original check string.\r\n * @param check - The integrity check key or SQL command to get the name of\r\n * @returns The user-friendly name of the integrity check, or the original check string if no match is found\r\n * @internal\r\n */\r\nexport function getIntegrityCheckName(check: string): string {\r\n // First try direct lookup by key\r\n const directLookup = integrityCheckTypeMap[check as IntegrityCheckKey];\r\n if (directLookup) {\r\n return directLookup.name;\r\n }\r\n // If not found, search by sqlCommand\r\n for (const [, value] of Object.entries(integrityCheckTypeMap)) {\r\n if (value.sqlCommand === check) {\r\n return value.name;\r\n }\r\n }\r\n // Fallback to the original check string\r\n return check;\r\n}\r\n\r\n/**\r\n * Performs a quick integrity check on the given iModel.\r\n * @param iModel The IModelDb instance to perform the integrity check on\r\n * @returns An array of results for each check performed, including the check name, whether it passed, and the elapsed time in seconds\r\n * @internal\r\n */\r\nexport async function performQuickIntegrityCheck(iModel: IModelDb): Promise<QuickIntegrityCheckResultRow[]> {\r\n const integrityCheckQuery = \"PRAGMA integrity_check ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES\";\r\n const integrityCheckResults: QuickIntegrityCheckResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckQuery, undefined, { usePrimaryConn: true })) {\r\n integrityCheckResults.push({ check: getIntegrityCheckName(row.check), passed: row.result, elapsedSeconds: row.elapsed_sec});\r\n };\r\n return integrityCheckResults;\r\n}\r\n\r\n/**\r\n * Performs a specific integrity check on the given iModel based on the provided check key, and returns the results specific to that check type.\r\n * @param iModel The IModelDb instance to perform the integrity check on\r\n * @param check The key of the specific integrity check to perform\r\n * @return An array of results specific to the integrity check that was performed. The type of the result rows will depend on the check that was executed.\r\n * @throws IModelError with status BadRequest if an unknown integrity check key is provided\r\n * @internal\r\n */\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkDataColumns\"): Promise<IntegrityCheckResultRow<\"checkDataColumns\">[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkECProfile\"): Promise<IntegrityCheckResultRow<\"checkECProfile\">[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkNavigationClassIds\"): Promise<IntegrityCheckResultRow<\"checkNavigationClassIds\">[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkNavigationIds\"): Promise<IntegrityCheckResultRow<\"checkNavigationIds\">[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkLinktableForeignKeyClassIds\"): Promise<IntegrityCheckResultRow<\"checkLinktableForeignKeyClassIds\">[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkLinktableForeignKeyIds\"): Promise<IntegrityCheckResultRow<\"checkLinktableForeignKeyIds\">[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkClassIds\"): Promise<IntegrityCheckResultRow<\"checkClassIds\">[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkDataSchema\"): Promise<IntegrityCheckResultRow<\"checkDataSchema\">[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkSchemaLoad\"): Promise<IntegrityCheckResultRow<\"checkSchemaLoad\">[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: \"checkMissingChildRows\"): Promise<IntegrityCheckResultRow<\"checkMissingChildRows\">[]>;\r\nexport async function performSpecificIntegrityCheck<K extends IntegrityCheckKey>(iModel: IModelDb, check: K): Promise<IntegrityCheckResultRow<K>[]>;\r\nexport async function performSpecificIntegrityCheck(iModel: IModelDb, check: IntegrityCheckKey): Promise<IntegrityCheckResultRow<IntegrityCheckKey>[]> {\r\n switch (check) {\r\n case \"checkDataColumns\": {\r\n const results: CheckDataColumnsResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkDataColumns.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, table: row.table, column: row.column });\r\n }\r\n return results;\r\n }\r\n case \"checkECProfile\": {\r\n const results: CheckECProfileResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkECProfile.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, type: row.type, name: row.name, issue: row.issue });\r\n }\r\n return results;\r\n }\r\n case \"checkNavigationClassIds\": {\r\n const results: CheckNavClassIdsResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkNavigationClassIds.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, id: row.id, class: row.class, property: row.property, navId: row.nav_id, navClassId: row.nav_classId });\r\n }\r\n return results;\r\n }\r\n case \"checkNavigationIds\": {\r\n const results: CheckNavIdsResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkNavigationIds.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, id: row.id, class: row.class, property: row.property, navId: row.nav_id, primaryClass: row.primary_class });\r\n }\r\n return results;\r\n }\r\n case \"checkLinktableForeignKeyClassIds\": {\r\n const results: CheckLinkTableFkClassIdsResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkLinktableForeignKeyClassIds.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, id: row.id, relationship: row.relationship, property: row.property, keyId: row.key_id, keyClassId: row.key_classId });\r\n }\r\n return results;\r\n }\r\n case \"checkLinktableForeignKeyIds\": {\r\n const results: CheckLinkTableFkIdsResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkLinktableForeignKeyIds.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, id: row.id, relationship: row.relationship, property: row.property, keyId: row.key_id, primaryClass: row.primary_class });\r\n }\r\n return results;\r\n }\r\n case \"checkClassIds\": {\r\n const results: CheckClassIdsResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkClassIds.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, class: row.class, id: row.id, classId: row.class_id, type: row.type });\r\n }\r\n return results;\r\n }\r\n case \"checkDataSchema\": {\r\n const results: CheckDataSchemaResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkDataSchema.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, type: row.type, name: row.name });\r\n }\r\n return results;\r\n }\r\n case \"checkSchemaLoad\": {\r\n const results: CheckSchemaLoadResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkSchemaLoad.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, schema: row.schema });\r\n }\r\n return results;\r\n }\r\n case \"checkMissingChildRows\": {\r\n const results: CheckMissingChildRowsResultRow[] = [];\r\n for await (const row of iModel.createQueryReader(integrityCheckTypeMap.checkMissingChildRows.sqlQuery, undefined, { usePrimaryConn: true })) {\r\n results.push({ sno: row.sno, class: row.class, id: row.id, classId: row.class_id, missingRowInTables: row.MissingRowInTables });\r\n }\r\n return results;\r\n }\r\n default:\r\n throw new IModelError(IModelStatus.BadRequest, `Unknown integrity check type`);\r\n }\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"NativePlatform.js","sourceRoot":"","sources":["../../../src/internal/NativePlatform.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAkB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE9D,IAAI,cAAiD,CAAC;AAEtD,IAAI,2BAAqD,CAAC;AAE1D,SAAS,mBAAmB;IAC1B,IAAI,2BAA2B,EAAE,CAAC;QAChC,2BAA2B,EAAE,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,cAAc,EAAE,kBAAkB,EAAE,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IAChB,MAAM,KAAK,QAAQ;QACxB,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB;IAChC,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACjC,cAAc,GAAG,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAE,OAAe,CAAC,cAAc,CAAC,gBAAgB,CAA0B,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACxJ,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC;QAC/B,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,2BAA2B,CAAC,IAAiB;IAC3D,2BAA2B,GAAG,IAAI,CAAC;AACrC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module IModelHost\n */\n\nimport { IModelJsNative, NativeLibrary } from \"@bentley/imodeljs-native\";\nimport { Logger, ProcessDetector } from \"@itwin/core-bentley\";\n\nlet nativePlatform: typeof IModelJsNative | undefined;\n\nlet syncNativeLogLevelsOverride: (() => void) | undefined;\n\nfunction syncNativeLogLevels() {\n if (syncNativeLogLevelsOverride) {\n syncNativeLogLevelsOverride();\n } else {\n nativePlatform?.clearLogLevelCache();\n }\n}\n\n/** Provides access to the internal APIs defined in @bentley/imodeljs-native.\n * @internal\n */\nexport class IModelNative {\n public static get platform(): typeof IModelJsNative {\n if (undefined === nativePlatform) {\n throw new Error(\"IModelHost.startup must be called first\");\n }\n\n return nativePlatform;\n }\n}\n\n/** @internal Strictly to be called by IModelHost.startup. */\nexport function loadNativePlatform(): void {\n if (undefined === nativePlatform) {\n nativePlatform = ProcessDetector.isMobileAppBackend ? (process as any)._linkedBinding(\"iModelJsNative\") as typeof IModelJsNative : NativeLibrary.load();\n nativePlatform.logger = Logger;\n Logger.onLogLevelChanged.addListener(() => syncNativeLogLevels());\n }\n}\n\n/** @internal Strictly for tests. */\nexport function overrideSyncNativeLogLevels(func?: () => void): void {\n syncNativeLogLevelsOverride = func;\n}\n"]}
1
+ {"version":3,"file":"NativePlatform.js","sourceRoot":"","sources":["../../../src/internal/NativePlatform.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAkB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE9D,IAAI,cAAiD,CAAC;AAEtD,IAAI,2BAAqD,CAAC;AAE1D,SAAS,mBAAmB;IAC1B,IAAI,2BAA2B,EAAE,CAAC;QAChC,2BAA2B,EAAE,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,cAAc,EAAE,kBAAkB,EAAE,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IAChB,MAAM,KAAK,QAAQ;QACxB,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB;IAChC,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QACjC,cAAc,GAAG,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAE,OAAe,CAAC,cAAc,CAAC,gBAAgB,CAA0B,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QACxJ,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC;QAC/B,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,2BAA2B,CAAC,IAAiB;IAC3D,2BAA2B,GAAG,IAAI,CAAC;AACrC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelHost\r\n */\r\n\r\nimport { IModelJsNative, NativeLibrary } from \"@bentley/imodeljs-native\";\r\nimport { Logger, ProcessDetector } from \"@itwin/core-bentley\";\r\n\r\nlet nativePlatform: typeof IModelJsNative | undefined;\r\n\r\nlet syncNativeLogLevelsOverride: (() => void) | undefined;\r\n\r\nfunction syncNativeLogLevels() {\r\n if (syncNativeLogLevelsOverride) {\r\n syncNativeLogLevelsOverride();\r\n } else {\r\n nativePlatform?.clearLogLevelCache();\r\n }\r\n}\r\n\r\n/** Provides access to the internal APIs defined in @bentley/imodeljs-native.\r\n * @internal\r\n */\r\nexport class IModelNative {\r\n public static get platform(): typeof IModelJsNative {\r\n if (undefined === nativePlatform) {\r\n throw new Error(\"IModelHost.startup must be called first\");\r\n }\r\n\r\n return nativePlatform;\r\n }\r\n}\r\n\r\n/** @internal Strictly to be called by IModelHost.startup. */\r\nexport function loadNativePlatform(): void {\r\n if (undefined === nativePlatform) {\r\n nativePlatform = ProcessDetector.isMobileAppBackend ? (process as any)._linkedBinding(\"iModelJsNative\") as typeof IModelJsNative : NativeLibrary.load();\r\n nativePlatform.logger = Logger;\r\n Logger.onLogLevelChanged.addListener(() => syncNativeLogLevels());\r\n }\r\n}\r\n\r\n/** @internal Strictly for tests. */\r\nexport function overrideSyncNativeLogLevels(func?: () => void): void {\r\n syncNativeLogLevelsOverride = func;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"NoLocks.js","sourceRoot":"","sources":["../../../src/internal/NoLocks.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEpG,yJAAyJ;AACzJ,MAAM,OAAO;IACK,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;IACxD,IAAW,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC,MAAM,CAAC,KAAW,CAAC;IACpB,aAAa,KAAW,CAAC;IACzB,kBAAkB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IAC/C,eAAe,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IAC5C,kBAAkB,KAAW,CAAC;IAC9B,eAAe,KAAW,CAAC;IAC3B,CAAC,kBAAkB,CAAC,KAAW,CAAC;IAChC,KAAK,CAAC,YAAY,KAAK,CAAC;IACxB,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAoB,CAAC;IAC7C,KAAK,CAAC,eAAe,KAAoB,CAAC;IAC1C,KAAK,CAAC,eAAe,KAAoB,CAAC;IAC1C,KAAK,CAAC,0BAA0B,KAAuB,OAAO,KAAK,CAAC,CAAC,CAAC;IACtE,KAAK,CAAC,gCAAgC,KAAuB,OAAO,KAAK,CAAC,CAAC,CAAC;IAC5E,KAAK,CAAC,6BAA6B,KAAuB,OAAO,KAAK,CAAC,CAAC,CAAC;IACzE,oCAAoC,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;IAChE,mBAAmB,KAAW,CAAC;CACvC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,OAAO,EAAE,CAAC;AACvB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module iModels\n */\n\nimport { LockControl } from \"../LockControl\";\nimport { _close, _elementWasCreated, _implementationProhibited, _releaseAllLocks } from \"./Symbols\";\n\n/** A null-implementation of LockControl that does not attempt to limit access between briefcases. This relies on change-merging to resolve conflicts. */\nclass NoLocks implements LockControl {\n public readonly [_implementationProhibited] = undefined;\n public get isServerBased() { return false; }\n public [_close](): void { }\n public clearAllLocks(): void { }\n public holdsExclusiveLock(): boolean { return false; }\n public holdsSharedLock(): boolean { return false; }\n public checkExclusiveLock(): void { }\n public checkSharedLock(): void { }\n public [_elementWasCreated](): void { }\n public async acquireLocks() { }\n public async [_releaseAllLocks](): Promise<void> { }\n public async releaseAllLocks(): Promise<void> { }\n public async abandonAllLocks(): Promise<void> { }\n public async abandonLocksForReversedTxn(): Promise<boolean> { return false; }\n public async abandonLocksForCurrentUnsavedTxn(): Promise<boolean> { return false; }\n public async acquireLocksForReinstatingTxn(): Promise<boolean> { return false; }\n public holdsNecessaryLocksForReinstatingTxn(): boolean { return true; }\n public clearTxnLockRecords(): void { }\n}\n\nexport function createNoOpLockControl(): LockControl {\n return new NoLocks();\n}\n"]}
1
+ {"version":3,"file":"NoLocks.js","sourceRoot":"","sources":["../../../src/internal/NoLocks.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAO/F,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEpG,yJAAyJ;AACzJ,MAAM,OAAO;IACK,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;IACxD,IAAW,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC,MAAM,CAAC,KAAW,CAAC;IACpB,aAAa,KAAW,CAAC;IACzB,kBAAkB,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IAC/C,eAAe,KAAc,OAAO,KAAK,CAAC,CAAC,CAAC;IAC5C,kBAAkB,KAAW,CAAC;IAC9B,eAAe,KAAW,CAAC;IAC3B,CAAC,kBAAkB,CAAC,KAAW,CAAC;IAChC,KAAK,CAAC,YAAY,KAAK,CAAC;IACxB,KAAK,CAAC,CAAC,gBAAgB,CAAC,KAAoB,CAAC;IAC7C,KAAK,CAAC,eAAe,KAAoB,CAAC;IAC1C,KAAK,CAAC,eAAe,KAAoB,CAAC;IAC1C,KAAK,CAAC,0BAA0B,KAAuB,OAAO,KAAK,CAAC,CAAC,CAAC;IACtE,KAAK,CAAC,gCAAgC,KAAuB,OAAO,KAAK,CAAC,CAAC,CAAC;IAC5E,KAAK,CAAC,6BAA6B,KAAuB,OAAO,KAAK,CAAC,CAAC,CAAC;IACzE,oCAAoC,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;IAChE,mBAAmB,KAAW,CAAC;CACvC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,OAAO,EAAE,CAAC;AACvB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\nimport { LockControl } from \"../LockControl\";\r\nimport { _close, _elementWasCreated, _implementationProhibited, _releaseAllLocks } from \"./Symbols\";\r\n\r\n/** A null-implementation of LockControl that does not attempt to limit access between briefcases. This relies on change-merging to resolve conflicts. */\r\nclass NoLocks implements LockControl {\r\n public readonly [_implementationProhibited] = undefined;\r\n public get isServerBased() { return false; }\r\n public [_close](): void { }\r\n public clearAllLocks(): void { }\r\n public holdsExclusiveLock(): boolean { return false; }\r\n public holdsSharedLock(): boolean { return false; }\r\n public checkExclusiveLock(): void { }\r\n public checkSharedLock(): void { }\r\n public [_elementWasCreated](): void { }\r\n public async acquireLocks() { }\r\n public async [_releaseAllLocks](): Promise<void> { }\r\n public async releaseAllLocks(): Promise<void> { }\r\n public async abandonAllLocks(): Promise<void> { }\r\n public async abandonLocksForReversedTxn(): Promise<boolean> { return false; }\r\n public async abandonLocksForCurrentUnsavedTxn(): Promise<boolean> { return false; }\r\n public async acquireLocksForReinstatingTxn(): Promise<boolean> { return false; }\r\n public holdsNecessaryLocksForReinstatingTxn(): boolean { return true; }\r\n public clearTxnLockRecords(): void { }\r\n}\r\n\r\nexport function createNoOpLockControl(): LockControl {\r\n return new NoLocks();\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"OnlineStatus.js","sourceRoot":"","sources":["../../../src/internal/OnlineStatus.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,IAAI,QAAQ,GAAG,IAAI,CAAC;AAEpB;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,QAAQ,GAAG,MAAM,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nlet isOnline = true;\n\n/**\n * Sets the online status of the backend that will be returned by `getOnlineStatus`.\n * @param online The new online status.\n * @internal\n */\nexport function setOnlineStatus(online: boolean) {\n isOnline = online;\n}\n\n/**\n * Determine whether the backend is currently considered online.\n * @note This only works if `setOnlineStatus` has been called by something to update the status.\n * `NativeHost` does this whenever the connectivity changes. If `setOnlineStatus` has never been\n * called, this will return `true`.\n * @internal\n */\nexport function getOnlineStatus(): boolean {\n return isOnline;\n}\n"]}
1
+ {"version":3,"file":"OnlineStatus.js","sourceRoot":"","sources":["../../../src/internal/OnlineStatus.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,IAAI,QAAQ,GAAG,IAAI,CAAC;AAEpB;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,QAAQ,GAAG,MAAM,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nlet isOnline = true;\r\n\r\n/**\r\n * Sets the online status of the backend that will be returned by `getOnlineStatus`.\r\n * @param online The new online status.\r\n * @internal\r\n */\r\nexport function setOnlineStatus(online: boolean) {\r\n isOnline = online;\r\n}\r\n\r\n/**\r\n * Determine whether the backend is currently considered online.\r\n * @note This only works if `setOnlineStatus` has been called by something to update the status.\r\n * `NativeHost` does this whenever the connectivity changes. If `setOnlineStatus` has never been\r\n * called, this will return `true`.\r\n * @internal\r\n */\r\nexport function getOnlineStatus(): boolean {\r\n return isOnline;\r\n}\r\n"]}
@@ -29,13 +29,13 @@ export class ServerBasedLocks {
29
29
  // Tracks the locks that are actively held.
30
30
  this.lockDb.executeSQL("CREATE TABLE IF NOT EXISTS locks(id INTEGER PRIMARY KEY NOT NULL,state INTEGER NOT NULL,origin INTEGER)");
31
31
  // Tracks the locks that are required by each Txn. They may or may not currently be held.
32
- this.lockDb.executeSQL(`
33
- CREATE TABLE IF NOT EXISTS txn_locks(
34
- txnId INTEGER NOT NULL,
35
- elementId INTEGER NOT NULL,
36
- state INTEGER NOT NULL,
37
- origin INTEGER NOT NULL,
38
- abandoned BOOLEAN NOT NULL,
32
+ this.lockDb.executeSQL(`
33
+ CREATE TABLE IF NOT EXISTS txn_locks(
34
+ txnId INTEGER NOT NULL,
35
+ elementId INTEGER NOT NULL,
36
+ state INTEGER NOT NULL,
37
+ origin INTEGER NOT NULL,
38
+ abandoned BOOLEAN NOT NULL,
39
39
  PRIMARY KEY (txnId, elementId))`);
40
40
  this.lockDb.saveChanges();
41
41
  this._removeOnCommitListener = this.briefcase.txns.onCommit.addListener(() => {
@@ -134,13 +134,13 @@ export class ServerBasedLocks {
134
134
  // So use a placeholder txn id for now, and we'll update to the real txn id on commit.
135
135
  // This is important to distinguish new locks acquired in the current txn from locks acquired in previous reversed txns, which will only
136
136
  // be cleared (no longer reinstateable) on commit.
137
- this.lockDb.withPreparedSqliteStatement(`
138
- INSERT INTO txn_locks(txnId,elementId,state,origin,abandoned)
139
- VALUES (?,?,?,?,FALSE)
140
- ON CONFLICT(txnId,elementId)
141
- DO UPDATE SET
142
- state=excluded.state,
143
- origin=excluded.origin,
137
+ this.lockDb.withPreparedSqliteStatement(`
138
+ INSERT INTO txn_locks(txnId,elementId,state,origin,abandoned)
139
+ VALUES (?,?,?,?,FALSE)
140
+ ON CONFLICT(txnId,elementId)
141
+ DO UPDATE SET
142
+ state=excluded.state,
143
+ origin=excluded.origin,
144
144
  abandoned=excluded.abandoned`, (stmt) => {
145
145
  stmt.bindId(1, this._unsavedChangesTxnId);
146
146
  stmt.bindId(2, id);
@@ -273,25 +273,25 @@ export class ServerBasedLocks {
273
273
  // Exclusive lock, we should restore the Shared lock.
274
274
  const allTxnLocks = new Map();
275
275
  const locksToRelease = new Map();
276
- this.lockDb.withPreparedSqliteStatement(`
277
- SELECT
278
- current.elementId,
279
- current.origin,
280
- IFNULL(
281
- (SELECT previous.state
282
- FROM txn_locks previous
283
- WHERE previous.elementId = current.elementId
284
- AND previous.txnId < ?2
285
- AND previous.abandoned=FALSE
286
- ORDER BY previous.txnId DESC
287
- LIMIT 1
288
- ),
289
- ?1
290
- ) AS previousState
291
- FROM txn_locks current
292
- WHERE current.txnId>=?2
293
- AND current.abandoned=FALSE
294
- ORDER BY current.txnId DESC
276
+ this.lockDb.withPreparedSqliteStatement(`
277
+ SELECT
278
+ current.elementId,
279
+ current.origin,
280
+ IFNULL(
281
+ (SELECT previous.state
282
+ FROM txn_locks previous
283
+ WHERE previous.elementId = current.elementId
284
+ AND previous.txnId < ?2
285
+ AND previous.abandoned=FALSE
286
+ ORDER BY previous.txnId DESC
287
+ LIMIT 1
288
+ ),
289
+ ?1
290
+ ) AS previousState
291
+ FROM txn_locks current
292
+ WHERE current.txnId>=?2
293
+ AND current.abandoned=FALSE
294
+ ORDER BY current.txnId DESC
295
295
  `, (stmt) => {
296
296
  stmt.bindInteger(1, LockState.None);
297
297
  stmt.bindId(2, txnId);
@@ -1 +1 @@
1
- {"version":3,"file":"ServerBasedLocks.js","sourceRoot":"","sources":["../../../src/internal/ServerBasedLocks.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\n/** @packageDocumentation\n * @module iModels\n */\n\nimport { DbResult, Id64, Id64Arg, Id64String, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\nimport { IModel, IModelError, LockState, ServerBasedLocksError } from \"@itwin/core-common\";\nimport { LockMap } from \"../BackendHubAccess\";\nimport { BriefcaseDb } from \"../IModelDb\";\nimport { LockControl } from \"../LockControl\";\nimport { IModelHost } from \"../IModelHost\";\nimport { SQLiteDb } from \"../SQLiteDb\";\nimport { _close, _elementWasCreated, _hubAccess, _implementationProhibited, _nativeDb, _releaseAllLocks } from \"./Symbols\";\n\n/**\n * Both the Model and Parent of an element are considered \"owners\" of their member elements. That means:\n * 1) they must hold at least a shared lock before an exclusive lock can be acquired for their members\n * 2) if they hold an exclusive lock, then all of their members are exclusively locked implicitly.\n */\ninterface ElementOwners {\n readonly modelId: Id64String;\n readonly parentId: Id64String | undefined;\n}\n\n// eslint-disable-next-line no-restricted-syntax\nconst enum LockOrigin {\n Acquired = 0,\n NewElement = 1,\n Discovered = 2,\n}\n\nexport class ServerBasedLocks implements LockControl {\n public readonly [_implementationProhibited] = undefined;\n\n public get isServerBased() { return true; }\n protected readonly lockDb = new SQLiteDb();\n protected readonly briefcase: BriefcaseDb;\n private _removeOnCommitListener: () => void;\n private readonly _unsavedChangesTxnId = \"0x7FFFFFFFFFFFFFFF\"; // a placeholder txn id for locks acquired in the current unsaved Txn\n\n public constructor(iModel: BriefcaseDb) {\n this.briefcase = iModel;\n const dbName = `${iModel[_nativeDb].getTempFileBaseName()}-locks`;\n\n try {\n this.lockDb.openDb(dbName, OpenMode.ReadWrite);\n } catch {\n this.lockDb.createDb(dbName);\n }\n\n // Tracks the locks that are actively held.\n this.lockDb.executeSQL(\"CREATE TABLE IF NOT EXISTS locks(id INTEGER PRIMARY KEY NOT NULL,state INTEGER NOT NULL,origin INTEGER)\");\n // Tracks the locks that are required by each Txn. They may or may not currently be held.\n this.lockDb.executeSQL(`\n CREATE TABLE IF NOT EXISTS txn_locks(\n txnId INTEGER NOT NULL,\n elementId INTEGER NOT NULL,\n state INTEGER NOT NULL,\n origin INTEGER NOT NULL,\n abandoned BOOLEAN NOT NULL,\n PRIMARY KEY (txnId, elementId))`);\n this.lockDb.saveChanges();\n\n this._removeOnCommitListener = this.briefcase.txns.onCommit.addListener(() => {\n const committedTxnId = this.briefcase.txns.queryPreviousTxnId(this.briefcase.txns.getCurrentTxnId())\n\n // With this commit, any reversed txns with the committed txn's ID or greater are no longer reinstatable,\n // so clear out the record of their locks. If the locks are still held, sorry, it's too late!\n this.clearTxnLockRecords(committedTxnId);\n\n // All of the \"current\" changes are now part of a real txn, so update the txn id accordingly.\n this.lockDb.withPreparedSqliteStatement(\"UPDATE txn_locks SET txnId=? WHERE txnId=?\", (stmt) => {\n stmt.bindId(1, committedTxnId);\n stmt.bindId(2, this._unsavedChangesTxnId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't update locks database with txn ID of unsaved changes txn upon saving (error code ${rc})`);\n });\n\n this.lockDb.saveChanges();\n });\n }\n\n public [_close]() {\n this._removeOnCommitListener();\n\n if (this.lockDb.isOpen)\n this.lockDb.closeDb();\n }\n\n private getOwners(id: Id64String): ElementOwners {\n return this.briefcase.withPreparedSqliteStatement(\"SELECT ModelId,ParentId FROM bis_Element WHERE id=?\", (stmt) => {\n stmt.bindId(1, id);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `element ${id} not found`);\n\n return { modelId: stmt.getValueId(0), parentId: stmt.getValueId(1) };\n });\n }\n\n private getLockState(id?: Id64String): LockState | undefined {\n return (id === undefined || !Id64.isValid(id)) ? undefined : this.lockDb.withPreparedSqliteStatement(\"SELECT state FROM locks WHERE id=?\", (stmt) => {\n stmt.bindId(1, id);\n return (DbResult.BE_SQLITE_ROW === stmt.step()) ? stmt.getValueInteger(0) : undefined;\n });\n }\n\n /** Clear the cache of locally held locks.\n * Note: does *not* release locks from server.\n */\n private clearAllLocks() {\n this.lockDb.executeSQL(\"DELETE FROM locks\");\n this.lockDb.executeSQL(\"DELETE FROM txn_locks\");\n this.lockDb.saveChanges();\n }\n\n /** only for tests */\n public getLockCount(state: LockState): number {\n return this.lockDb.withSqliteStatement(\"SELECT count(*) FROM locks WHERE state=?\", (stmt) => {\n stmt.bindInteger(1, state);\n stmt.step();\n return stmt.getValueInteger(0);\n });\n }\n\n public async [_releaseAllLocks](): Promise<void> {\n await IModelHost[_hubAccess].releaseAllLocks(this.briefcase); // throws if unsuccessful\n this.clearAllLocks();\n }\n\n public async releaseAllLocks(): Promise<void> {\n if (this.briefcase.txns.hasLocalChanges) {\n ServerBasedLocksError.throwError(\"has-unsaved-changes\", \"Locks cannot be released while the briefcase contains local changes\");\n }\n\n return this[_releaseAllLocks]();\n }\n\n public async abandonAllLocks(): Promise<void> {\n if (this.briefcase.txns.hasLocalChanges) {\n ServerBasedLocksError.throwError(\"has-unsaved-changes\", \"Locks cannot be abandoned while the briefcase contains local changes\");\n }\n\n if (IModelHost[_hubAccess].abandonAllLocks === undefined) {\n // If the IModelHub doesn't support an explicit abandon, call release with a blank changeset to indicate\n // that locks should be released without updating the changeset associated with the locks.\n await IModelHost[_hubAccess].releaseAllLocks({\n iModelId: this.briefcase.iModelId,\n briefcaseId: this.briefcase.briefcaseId,\n changeset: { id: \"\", index: 0 }\n });\n } else {\n await IModelHost[_hubAccess].abandonAllLocks(this.briefcase);\n }\n\n this.clearAllLocks();\n }\n\n private insertLock(id: Id64String, state: LockState, origin: LockOrigin): true {\n this.lockDb.withPreparedSqliteStatement(\"INSERT INTO locks(id,state,origin) VALUES (?,?,?) ON CONFLICT(id) DO UPDATE SET state=excluded.state,origin=excluded.origin\", (stmt) => {\n stmt.bindId(1, id);\n stmt.bindInteger(2, state);\n stmt.bindInteger(3, origin);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert lock into database\");\n });\n\n return true;\n }\n\n private insertTxnLockRecord(id: Id64String, state: LockState, origin: LockOrigin): void {\n // Locks are always acquired in the current txn, which isn't a real txn until it's committed.\n // So use a placeholder txn id for now, and we'll update to the real txn id on commit.\n // This is important to distinguish new locks acquired in the current txn from locks acquired in previous reversed txns, which will only\n // be cleared (no longer reinstateable) on commit.\n this.lockDb.withPreparedSqliteStatement(`\n INSERT INTO txn_locks(txnId,elementId,state,origin,abandoned)\n VALUES (?,?,?,?,FALSE)\n ON CONFLICT(txnId,elementId)\n DO UPDATE SET\n state=excluded.state,\n origin=excluded.origin,\n abandoned=excluded.abandoned`, (stmt) => {\n stmt.bindId(1, this._unsavedChangesTxnId);\n stmt.bindId(2, id);\n stmt.bindInteger(3, state);\n stmt.bindInteger(4, origin);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't insert txn lock record into database (error code ${rc})`);\n });\n }\n\n private ownerHoldsExclusiveLock(id: Id64String | undefined): boolean {\n if (id === undefined || id === IModel.rootSubjectId)\n return false; // has no owners\n\n const { modelId, parentId } = this.getOwners(id);\n if (this.getLockState(modelId) === LockState.Exclusive || this.getLockState(parentId) === LockState.Exclusive)\n return true;\n\n // see if this model is exclusively locked by one of its owners. If so, save that fact on modelId so future tests won't have to descend.\n if (this.ownerHoldsExclusiveLock(modelId))\n return this.insertLock(modelId, LockState.Exclusive, LockOrigin.Discovered);\n\n // see if the parent is exclusively locked by one of its owners. If so, save that fact on parentId so future tests won't have to descend.\n return this.ownerHoldsExclusiveLock(parentId) ? this.insertLock(parentId!, LockState.Exclusive, LockOrigin.Discovered) : false; // eslint-disable-line @typescript-eslint/no-non-null-assertion\n }\n\n /** Determine whether an the exclusive lock is already held by an element (or one of its owners) */\n public holdsExclusiveLock(id: Id64String): boolean {\n // see if we hold the exclusive lock. or if one of the element's owners is exclusively locked (recursively)\n return this.getLockState(id) === LockState.Exclusive || this.ownerHoldsExclusiveLock(id);\n }\n\n public holdsSharedLock(id: Id64String): boolean {\n const state = this.getLockState(id);\n // see if we hold shared or exclusive lock, or if an owner has exclusive lock. If so we implicitly have shared lock, but owner holding shared lock doesn't help.\n return (state === LockState.Shared || state === LockState.Exclusive) || this.ownerHoldsExclusiveLock(id);\n }\n\n /** if the shared lock on the element supplied is not already held, add it to the set of shared locks required. Then, check owners. */\n private addSharedLock(id: Id64String | undefined, locks: Set<Id64String>) {\n // if the id is not valid, or of the lock is already in the set, or if we already hold a shared lock, we're done\n // Note: if we hold a shared lock, it is guaranteed that we also hold all required shared locks on owners.\n if (id === undefined || !Id64.isValid(id) || locks.has(id) || this.holdsSharedLock(id))\n return;\n\n locks.add(id); // add to set of needed shared locks\n this.addOwnerSharedLocks(id, locks); // check parent models and groups\n }\n\n /** add owners (recursively) of an element to a list of required shared locks, if not already held. */\n private addOwnerSharedLocks(id: Id64String, locks: Set<Id64String>) {\n const el = this.getOwners(id);\n this.addSharedLock(el.parentId, locks); // if this element is in a group\n this.addSharedLock(el.modelId, locks); // check its model\n }\n\n /** attempt to acquire all necessary locks for a set of elements */\n private async acquireAllLocks(locks: LockMap) {\n if (locks.size === 0) // no locks are required.\n return;\n\n const sharedLocks = new Set<Id64String>();\n for (const lock of locks)\n this.addOwnerSharedLocks(lock[0], sharedLocks);\n\n for (const shared of sharedLocks) {\n if (!locks.has(shared)) // we may already be asking for exclusive lock\n locks.set(shared, LockState.Shared);\n }\n\n await IModelHost[_hubAccess].acquireLocks(this.briefcase, locks); // throws if unsuccessful\n for (const lock of locks) {\n this.insertLock(lock[0], lock[1], LockOrigin.Acquired);\n this.insertTxnLockRecord(lock[0], lock[1], LockOrigin.Acquired);\n }\n this.lockDb.saveChanges();\n }\n\n public async acquireLocks(arg: { shared?: Id64Arg, exclusive?: Id64Arg }): Promise<void> {\n const locks = new Map<Id64String, LockState>();\n if (arg.shared) {\n for (const id of Id64.iterable(arg.shared)) {\n if (!this.holdsSharedLock(id))\n locks.set(id, LockState.Shared);\n }\n }\n if (arg.exclusive) {\n for (const id of Id64.iterable(arg.exclusive)) {\n if (!this.holdsExclusiveLock(id))\n locks.set(id, LockState.Exclusive);\n }\n }\n return this.acquireAllLocks(locks);\n }\n\n private async abandonLocks(locks: LockMap): Promise<void> {\n if (IModelHost[_hubAccess].abandonLocks === undefined) {\n // If the IModelHub doesn't support an explicit abandon, call acquireLocks with a blank changeset to indicate\n // that locks should be released without updating the changeset associated with the locks.\n await IModelHost[_hubAccess].acquireLocks({\n iModelId: this.briefcase.iModelId,\n briefcaseId: this.briefcase.briefcaseId,\n changeset: { id: \"\", index: 0 }\n }, locks);\n } else {\n await IModelHost[_hubAccess].abandonLocks(this.briefcase, locks);\n }\n }\n\n public async abandonLocksForCurrentUnsavedTxn(): Promise<boolean> {\n return this.abandonLocksForReversedTxn(this._unsavedChangesTxnId);\n }\n\n public async abandonLocksForReversedTxn(txnId: Id64String): Promise<boolean> {\n if (this.briefcase.txns.hasUnsavedChanges)\n ServerBasedLocksError.throwError(\"has-unsaved-changes\", `cannot abandon locks for txn ${txnId} because the current txn has unsaved changes`);\n\n const txnProps = this.briefcase.txns.getTxnProps(txnId);\n if (txnProps === undefined) {\n // The current txn commonly won't exist on the TxnManager yet. It's often just a placeholder for not-yet-saved changes.\n // (Sometimes it will exist and refer to a reversed Txn).\n // The unsavedChangesTxnId won't exist on the TxnManager either, of course.\n // But all other txn ids must be known to the TxnManager or it is an error.\n if (txnId !== this.briefcase.txns.getCurrentTxnId() && txnId !== this._unsavedChangesTxnId)\n ServerBasedLocksError.throwError(\"txn-id-not-found\", `cannot abandon locks for txn ${txnId} because it does not exist`);\n } else {\n // If the txn id is known to the TxnManager, then we require that it has already been reversed.\n if (!txnProps.reversed)\n ServerBasedLocksError.throwError(\"txn-not-reversed\", `cannot abandon locks for txn ${txnId} because it has not been reversed`);\n }\n\n let locksReleased = false;\n\n // Abandon locks for unsaved (and now abandoned) changes.\n if (txnId !== this._unsavedChangesTxnId) {\n locksReleased = await this.abandonLocksForCurrentUnsavedTxn();\n }\n\n // At this point, we know:\n // 1. There are no unsaved changes, and the associated locks have been abandoned.\n // 2. The given txn ID has been reversed, which means any later txns are sure to have been reversed, too.\n\n // So we simply have to find all non-abandoned locks associated with the given txn or later, abandon them (or restore\n // them to their previous state), and mark them as abandoned in txn_locks.\n\n // Find all locks associated with the given txnId or later.\n // For each elementId, find the previous state of the lock before this Txn (if any), or None otherwise.\n // This is the state that we will restore the element's lock to. The reason we do this is to account for\n // lock upgrades. If an earlier Txn acquired a Shared lock on this element, and this Txn acquired an\n // Exclusive lock, we should restore the Shared lock.\n const allTxnLocks = new Map<Id64String, LockState>();\n const locksToRelease = new Map<Id64String, LockState>();\n this.lockDb.withPreparedSqliteStatement(\n `\n SELECT\n current.elementId,\n current.origin,\n IFNULL(\n (SELECT previous.state\n FROM txn_locks previous\n WHERE previous.elementId = current.elementId\n AND previous.txnId < ?2\n AND previous.abandoned=FALSE\n ORDER BY previous.txnId DESC\n LIMIT 1\n ),\n ?1\n ) AS previousState\n FROM txn_locks current\n WHERE current.txnId>=?2\n AND current.abandoned=FALSE\n ORDER BY current.txnId DESC\n `,\n (stmt) => {\n stmt.bindInteger(1, LockState.None);\n stmt.bindId(2, txnId);\n\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n const elementId = stmt.getValueId(0);\n const origin = stmt.getValueInteger(1);\n const previousState = stmt.getValueInteger(2);\n allTxnLocks.set(elementId, previousState);\n if (origin !== LockOrigin.NewElement)\n locksToRelease.set(elementId, previousState);\n }\n });\n\n // Release the locks on the server.\n if (locksToRelease.size > 0)\n await this.abandonLocks(locksToRelease);\n\n // Mark the txn locks as abandoned.\n if (txnId === this._unsavedChangesTxnId) {\n // After abandoning locks held for the \"unsaved\" txn, we clear them completely because they are not reinstateable.\n this.lockDb.withPreparedSqliteStatement(\"DELETE FROM txn_locks WHERE txnId=?\", (stmt) => {\n stmt.bindId(1, this._unsavedChangesTxnId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't delete txn locks for unsaved changes in database (error code ${rc})`);\n });\n } else {\n this.lockDb.withPreparedSqliteStatement(\"UPDATE txn_locks SET abandoned=TRUE WHERE txnId>=?\", (stmt) => {\n stmt.bindId(1, txnId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't mark txn locks as abandoned in database (error code ${rc})`);\n });\n }\n\n // Restore each lock to its previous state (if any) in the local cache. Usually this means deleting it.\n for (const [elementId, previousState] of allTxnLocks) {\n if (previousState === LockState.None) {\n this.lockDb.withPreparedSqliteStatement(\"DELETE FROM locks WHERE id=?\", (stmt) => {\n stmt.bindId(1, elementId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't delete lock from database (error code ${rc})`);\n });\n } else {\n this.lockDb.withPreparedSqliteStatement(\"UPDATE locks SET state=? WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, previousState);\n stmt.bindId(2, elementId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't update lock in database (error code ${rc})`);\n });\n }\n }\n\n // Ideally we'd only invalidate \"Discovered\" locks that are related to this Txn's Shared and\n // Exclusive locks. But that is a lot of added complexity for little benefit.\n // Clearing them all will have no impact on correctness and a minimal impact on performance.\n this.clearDiscoveredLocks();\n\n this.lockDb.saveChanges();\n\n return locksReleased || allTxnLocks.size > 0;\n }\n\n private getAbandonedLocksForTxn(txnId: Id64String): {\n newElementLocks: Map<Id64String, LockState>,\n locksToAcquire: Map<Id64String, LockState>\n } {\n const newElementLocks = new Map<Id64String, LockState>();\n const locksToAcquire = new Map<Id64String, LockState>();\n this.lockDb.withPreparedSqliteStatement(\n \"SELECT elementId, state, origin FROM txn_locks WHERE txnId<=? AND abandoned=TRUE\",\n (stmt) => {\n stmt.bindId(1, txnId);\n\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n const elementId = stmt.getValueId(0);\n const state = stmt.getValueInteger(1);\n const origin = stmt.getValueInteger(2);\n if (origin === LockOrigin.NewElement)\n newElementLocks.set(elementId, state);\n else\n locksToAcquire.set(elementId, state);\n }\n });\n\n return { newElementLocks, locksToAcquire };\n }\n\n public async acquireLocksForReinstatingTxn(txnId: Id64String): Promise<boolean> {\n if (this.briefcase.txns.hasUnsavedChanges)\n ServerBasedLocksError.throwError(\"has-unsaved-changes\", `cannot acquire locks for reinstating txn ${txnId} because the current txn has unsaved changes`);\n\n // If the Txn is known to the TxnManager, we can proceed. We don't need to check if it is currently\n // reversed, because if it isn't, then abandonLocksForReversedTxn couldn't have been called, and so the\n // locks are still held. Proceeding with this method will be a no-op, but it will be harmless.\n // However, if the Txn Id is unknown, it may have been canceled or refer to the current Txn\n // whose unsaved changes were just abandoned. Or it's just plain-old invalid. In any case, we can't\n // re-acquire the associated locks.\n const txnProps = this.briefcase.txns.getTxnProps(txnId);\n if (txnProps === undefined) {\n ServerBasedLocksError.throwError(\"txn-id-not-found\", `cannot acquire locks for txn ${txnId} because it does not exist or has not been saved`);\n }\n\n // Find all locks associated with the given txnId.\n const { newElementLocks, locksToAcquire } = this.getAbandonedLocksForTxn(txnId);\n\n // Attempt to acquire the locks on the server. This may fail if the locks are no longer available!\n if (locksToAcquire.size > 0)\n await IModelHost[_hubAccess].acquireLocks(this.briefcase, locksToAcquire); // throws if unsuccessful\n\n // Mark the txn locks as no longer abandoned.\n this.lockDb.withPreparedSqliteStatement(\"UPDATE txn_locks SET abandoned=FALSE WHERE txnId<=?\", (stmt) => {\n stmt.bindId(1, txnId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't mark txn locks as no longer abandoned in database (error code ${rc})`);\n });\n\n // Insert the newly-acquired locks in the local cache. Note that we don't need to insert entries in the txn_locks table,\n // because these locks are already associated with the Txn.\n for (const [elementId, state] of locksToAcquire) {\n this.insertLock(elementId, state, LockOrigin.Acquired);\n }\n for (const [elementId, state] of newElementLocks) {\n this.insertLock(elementId, state, LockOrigin.NewElement);\n }\n\n // Ideally we'd only invalidate \"Discovered\" locks that are related to this Txn's Shared and\n // Exclusive locks. But that is a lot of added complexity for little benefit.\n // Clearing them all will have no impact on correctness and a minimal impact on performance.\n this.clearDiscoveredLocks();\n\n this.lockDb.saveChanges();\n\n return locksToAcquire.size > 0 || newElementLocks.size > 0;\n }\n\n public holdsNecessaryLocksForReinstatingTxn(txnId: Id64String): boolean {\n const locks = this.getAbandonedLocksForTxn(txnId);\n return locks.locksToAcquire.size === 0 && locks.newElementLocks.size === 0;\n }\n\n public clearTxnLockRecords(txnId: Id64String) {\n this.lockDb.withPreparedSqliteStatement(\"DELETE FROM txn_locks WHERE txnId!=? AND txnId>=?\", (stmt) => {\n stmt.bindId(1, this._unsavedChangesTxnId);\n stmt.bindId(2, txnId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't delete txn lock records from database (error code ${rc})`);\n });\n\n this.lockDb.saveChanges();\n }\n\n /** When an element is newly created in a session, we hold the lock on it implicitly. Save that fact. */\n public [_elementWasCreated](id: Id64String) {\n this.insertLock(id, LockState.Exclusive, LockOrigin.NewElement);\n this.insertTxnLockRecord(id, LockState.Exclusive, LockOrigin.NewElement);\n this.lockDb.saveChanges();\n }\n\n private clearDiscoveredLocks() {\n this.lockDb.withPreparedSqliteStatement(\"DELETE FROM locks WHERE origin=?\", (stmt) => {\n stmt.bindInteger(1, LockOrigin.Discovered);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't delete discovered locks from database (error code ${rc})`);\n });\n }\n\n /** locks are not necessary during change propagation. */\n private get _locksAreRequired() { return !this.briefcase.txns.isIndirectChanges; }\n\n /** throw if locks are currently required and the exclusive lock is not held on the supplied element */\n public checkExclusiveLock(id: Id64String, type: string, operation: string) {\n if (this._locksAreRequired && !this.holdsExclusiveLock(id))\n throw new IModelError(IModelStatus.LockNotHeld, `exclusive lock not held on ${type} for ${operation} (id=${id})`);\n }\n\n /** throw if locks are currently required and a shared lock is not held on the supplied element */\n public checkSharedLock(id: Id64String, type: string, operation: string) {\n if (this._locksAreRequired && !this.holdsSharedLock(id))\n throw new IModelError(IModelStatus.LockNotHeld, `shared lock not held on ${type} for ${operation} (id=${id})`);\n }\n\n}\n\nexport function createServerBasedLocks(iModel: BriefcaseDb): LockControl {\n return new ServerBasedLocks(iModel);\n}\n"]}
1
+ {"version":3,"file":"ServerBasedLocks.js","sourceRoot":"","sources":["../../../src/internal/ServerBasedLocks.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAuB,YAAY,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAI3F,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,yBAAyB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAmB3H,MAAM,OAAO,gBAAgB;IACX,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;IAExD,IAAW,aAAa,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IACxB,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;IACxB,SAAS,CAAc;IAClC,uBAAuB,CAAa;IAC3B,oBAAoB,GAAG,oBAAoB,CAAC,CAAC,qEAAqE;IAEnI,YAAmB,MAAmB;QACpC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,mBAAmB,EAAE,QAAQ,CAAC;QAElE,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QAED,2CAA2C;QAC3C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,yGAAyG,CAAC,CAAC;QAClI,yFAAyF;QACzF,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;;;;;;;wCAOa,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAE1B,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE;YAC3E,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;YAEpG,yGAAyG;YACzG,6FAA6F;YAC7F,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAEzC,6FAA6F;YAC7F,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,4CAA4C,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC7F,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;oBAChC,qBAAqB,CAAC,UAAU,CAAC,uBAAuB,EAAE,0FAA0F,EAAE,GAAG,CAAC,CAAC;YAC/J,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,CAAC,MAAM,CAAC;QACb,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;YACpB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAEO,SAAS,CAAC,EAAc;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAAC,qDAAqD,EAAE,CAAC,IAAI,EAAE,EAAE;YAChH,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,aAAa,KAAK,EAAE;gBAC/B,MAAM,IAAI,WAAW,CAAC,EAAE,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;YAEvD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,EAAe;QAClC,OAAO,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,oCAAoC,EAAE,CAAC,IAAI,EAAE,EAAE;YAClJ,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnB,OAAO,CAAC,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,qBAAqB;IACd,YAAY,CAAC,KAAgB;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,0CAA0C,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1F,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,CAAC,gBAAgB,CAAC;QAC7B,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB;QACvF,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,eAAe;QAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,qBAAqB,CAAC,UAAU,CAAC,qBAAqB,EAAE,qEAAqE,CAAC,CAAC;QACjI,CAAC;QAED,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,eAAe;QAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxC,qBAAqB,CAAC,UAAU,CAAC,qBAAqB,EAAE,sEAAsE,CAAC,CAAC;QAClI,CAAC;QAED,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACzD,wGAAwG;YACxG,0FAA0F;YAC1F,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC;gBAC3C,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;gBACjC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW;gBACvC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;aAChC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,UAAU,CAAC,EAAc,EAAE,KAAgB,EAAE,MAAkB;QACrE,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,6HAA6H,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9K,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;gBAChC,MAAM,IAAI,WAAW,CAAC,EAAE,EAAE,iCAAiC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,mBAAmB,CAAC,EAAc,EAAE,KAAgB,EAAE,MAAkB;QAC9E,6FAA6F;QAC7F,sFAAsF;QACtF,wIAAwI;QACxI,kDAAkD;QAClD,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC;;;;;;;uCAOL,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5C,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;gBAChC,qBAAqB,CAAC,UAAU,CAAC,uBAAuB,EAAE,0DAA0D,EAAE,GAAG,CAAC,CAAC;QAC/H,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,uBAAuB,CAAC,EAA0B;QACxD,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,MAAM,CAAC,aAAa;YACjD,OAAO,KAAK,CAAC,CAAC,gBAAgB;QAEhC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,SAAS;YAC3G,OAAO,IAAI,CAAC;QAEd,wIAAwI;QACxI,IAAI,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC;YACvC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,gCAAwB,CAAC;QAE9E,yIAAyI;QACzI,OAAO,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAS,EAAE,SAAS,CAAC,SAAS,gCAAwB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,+DAA+D;IACjM,CAAC;IAED,mGAAmG;IAC5F,kBAAkB,CAAC,EAAc;QACtC,2GAA2G;QAC3G,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC3F,CAAC;IAEM,eAAe,CAAC,EAAc;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACpC,gKAAgK;QAChK,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,sIAAsI;IAC9H,aAAa,CAAC,EAA0B,EAAE,KAAsB;QACtE,gHAAgH;QAChH,0GAA0G;QAC1G,IAAI,EAAE,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACpF,OAAO;QAET,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,oCAAoC;QACnD,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,iCAAiC;IACxE,CAAC;IAED,sGAAsG;IAC9F,mBAAmB,CAAC,EAAc,EAAE,KAAsB;QAChE,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,gCAAgC;QACxE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,kBAAkB;IAC3D,CAAC;IAED,mEAAmE;IAC3D,KAAK,CAAC,eAAe,CAAC,KAAc;QAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,yBAAyB;YAC7C,OAAO;QAET,MAAM,WAAW,GAAG,IAAI,GAAG,EAAc,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAEjD,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,8CAA8C;gBACpE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,yBAAyB;QAC3F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,8BAAsB,CAAC;YACvD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,8BAAsB,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,GAA8C;QACtE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;QAC/C,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;oBAC3B,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC9B,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,KAAc;QACvC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtD,6GAA6G;YAC7G,0FAA0F;YAC1F,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC;gBACxC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;gBACjC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW;gBACvC,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;aAChC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,gCAAgC;QAC3C,OAAO,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACpE,CAAC;IAEM,KAAK,CAAC,0BAA0B,CAAC,KAAiB;QACvD,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB;YACvC,qBAAqB,CAAC,UAAU,CAAC,qBAAqB,EAAE,gCAAgC,KAAK,8CAA8C,CAAC,CAAC;QAE/I,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,uHAAuH;YACvH,yDAAyD;YACzD,2EAA2E;YAC3E,2EAA2E;YAC3E,IAAI,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,KAAK,KAAK,IAAI,CAAC,oBAAoB;gBACxF,qBAAqB,CAAC,UAAU,CAAC,kBAAkB,EAAE,gCAAgC,KAAK,4BAA4B,CAAC,CAAC;QAC5H,CAAC;aAAM,CAAC;YACN,+FAA+F;YAC/F,IAAI,CAAC,QAAQ,CAAC,QAAQ;gBACpB,qBAAqB,CAAC,UAAU,CAAC,kBAAkB,EAAE,gCAAgC,KAAK,mCAAmC,CAAC,CAAC;QACnI,CAAC;QAED,IAAI,aAAa,GAAG,KAAK,CAAC;QAE1B,yDAAyD;QACzD,IAAI,KAAK,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxC,aAAa,GAAG,MAAM,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAChE,CAAC;QAED,0BAA0B;QAC1B,iFAAiF;QACjF,yGAAyG;QAEzG,qHAAqH;QACrH,0EAA0E;QAE1E,2DAA2D;QAC3D,uGAAuG;QACvG,wGAAwG;QACxG,oGAAoG;QACpG,qDAAqD;QACrD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;QACrD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,2BAA2B,CACrC;;;;;;;;;;;;;;;;;;;OAmBC,EACD,CAAC,IAAI,EAAE,EAAE;YACP,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAEtB,OAAO,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBACvC,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAC9C,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;gBAC1C,IAAI,MAAM,kCAA0B;oBAClC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,mCAAmC;QACnC,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC;YACzB,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAE1C,mCAAmC;QACnC,IAAI,KAAK,KAAK,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxC,kHAAkH;YAClH,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,qCAAqC,EAAE,CAAC,IAAI,EAAE,EAAE;gBACtF,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;oBAChC,qBAAqB,CAAC,UAAU,CAAC,uBAAuB,EAAE,sEAAsE,EAAE,GAAG,CAAC,CAAC;YAC3I,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,oDAAoD,EAAE,CAAC,IAAI,EAAE,EAAE;gBACrG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACtB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;oBAChC,qBAAqB,CAAC,UAAU,CAAC,uBAAuB,EAAE,6DAA6D,EAAE,GAAG,CAAC,CAAC;YAClI,CAAC,CAAC,CAAC;QACL,CAAC;QAED,uGAAuG;QACvG,KAAK,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,WAAW,EAAE,CAAC;YACrD,IAAI,aAAa,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,8BAA8B,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC/E,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;oBAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;wBAChC,qBAAqB,CAAC,UAAU,CAAC,uBAAuB,EAAE,+CAA+C,EAAE,GAAG,CAAC,CAAC;gBACpH,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,qCAAqC,EAAE,CAAC,IAAI,EAAE,EAAE;oBACtF,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;oBACnC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;oBAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;wBAChC,qBAAqB,CAAC,UAAU,CAAC,uBAAuB,EAAE,6CAA6C,EAAE,GAAG,CAAC,CAAC;gBAClH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4FAA4F;QAC5F,6EAA6E;QAC7E,4FAA4F;QAC5F,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAE1B,OAAO,aAAa,IAAI,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;IAC/C,CAAC;IAEO,uBAAuB,CAAC,KAAiB;QAI/C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAyB,CAAC;QACzD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;QACxD,IAAI,CAAC,MAAM,CAAC,2BAA2B,CACrC,kFAAkF,EAClF,CAAC,IAAI,EAAE,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAEtB,OAAO,QAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;gBACrC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBACvC,IAAI,MAAM,kCAA0B;oBAClC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;;oBAEtC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;QAEL,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,6BAA6B,CAAC,KAAiB;QAC1D,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB;YACvC,qBAAqB,CAAC,UAAU,CAAC,qBAAqB,EAAE,4CAA4C,KAAK,8CAA8C,CAAC,CAAC;QAE3J,mGAAmG;QACnG,uGAAuG;QACvG,8FAA8F;QAC9F,2FAA2F;QAC3F,mGAAmG;QACnG,mCAAmC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,qBAAqB,CAAC,UAAU,CAAC,kBAAkB,EAAE,gCAAgC,KAAK,kDAAkD,CAAC,CAAC;QAChJ,CAAC;QAED,kDAAkD;QAClD,MAAM,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAEhF,kGAAkG;QAClG,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC;YACzB,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,yBAAyB;QAEtG,6CAA6C;QAC7C,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,qDAAqD,EAAE,CAAC,IAAI,EAAE,EAAE;YACtG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACtB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;gBAChC,qBAAqB,CAAC,UAAU,CAAC,uBAAuB,EAAE,uEAAuE,EAAE,GAAG,CAAC,CAAC;QAC5I,CAAC,CAAC,CAAC;QAEH,wHAAwH;QACxH,2DAA2D;QAC3D,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,8BAAsB,CAAC;QACzD,CAAC;QACD,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,eAAe,EAAE,CAAC;YACjD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,gCAAwB,CAAC;QAC3D,CAAC;QAED,4FAA4F;QAC5F,6EAA6E;QAC7E,4FAA4F;QAC5F,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAE1B,OAAO,cAAc,CAAC,IAAI,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7D,CAAC;IAEM,oCAAoC,CAAC,KAAiB;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAClD,OAAO,KAAK,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,CAAC;IAC7E,CAAC;IAEM,mBAAmB,CAAC,KAAiB;QAC1C,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,mDAAmD,EAAE,CAAC,IAAI,EAAE,EAAE;YACpG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACtB,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;gBAChC,qBAAqB,CAAC,UAAU,CAAC,uBAAuB,EAAE,2DAA2D,EAAE,GAAG,CAAC,CAAC;QAChI,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED,wGAAwG;IACjG,CAAC,kBAAkB,CAAC,CAAC,EAAc;QACxC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,SAAS,gCAAwB,CAAC;QAChE,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,SAAS,gCAAwB,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,kCAAkC,EAAE,CAAC,IAAI,EAAE,EAAE;YACnF,IAAI,CAAC,WAAW,CAAC,CAAC,gCAAwB,CAAC;YAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,cAAc,KAAK,EAAE;gBAChC,qBAAqB,CAAC,UAAU,CAAC,uBAAuB,EAAE,2DAA2D,EAAE,GAAG,CAAC,CAAC;QAChI,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yDAAyD;IACzD,IAAY,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAElF,uGAAuG;IAChG,kBAAkB,CAAC,EAAc,EAAE,IAAY,EAAE,SAAiB;QACvE,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE,8BAA8B,IAAI,QAAQ,SAAS,QAAQ,EAAE,GAAG,CAAC,CAAC;IACtH,CAAC;IAED,kGAAkG;IAC3F,eAAe,CAAC,EAAc,EAAE,IAAY,EAAE,SAAiB;QACpE,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE,2BAA2B,IAAI,QAAQ,SAAS,QAAQ,EAAE,GAAG,CAAC,CAAC;IACnH,CAAC;CAEF;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACxD,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\nimport { DbResult, Id64, Id64Arg, Id64String, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\r\nimport { IModel, IModelError, LockState, ServerBasedLocksError } from \"@itwin/core-common\";\r\nimport { LockMap } from \"../BackendHubAccess\";\r\nimport { BriefcaseDb } from \"../IModelDb\";\r\nimport { LockControl } from \"../LockControl\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { SQLiteDb } from \"../SQLiteDb\";\r\nimport { _close, _elementWasCreated, _hubAccess, _implementationProhibited, _nativeDb, _releaseAllLocks } from \"./Symbols\";\r\n\r\n/**\r\n * Both the Model and Parent of an element are considered \"owners\" of their member elements. That means:\r\n * 1) they must hold at least a shared lock before an exclusive lock can be acquired for their members\r\n * 2) if they hold an exclusive lock, then all of their members are exclusively locked implicitly.\r\n */\r\ninterface ElementOwners {\r\n readonly modelId: Id64String;\r\n readonly parentId: Id64String | undefined;\r\n}\r\n\r\n// eslint-disable-next-line no-restricted-syntax\r\nconst enum LockOrigin {\r\n Acquired = 0,\r\n NewElement = 1,\r\n Discovered = 2,\r\n}\r\n\r\nexport class ServerBasedLocks implements LockControl {\r\n public readonly [_implementationProhibited] = undefined;\r\n\r\n public get isServerBased() { return true; }\r\n protected readonly lockDb = new SQLiteDb();\r\n protected readonly briefcase: BriefcaseDb;\r\n private _removeOnCommitListener: () => void;\r\n private readonly _unsavedChangesTxnId = \"0x7FFFFFFFFFFFFFFF\"; // a placeholder txn id for locks acquired in the current unsaved Txn\r\n\r\n public constructor(iModel: BriefcaseDb) {\r\n this.briefcase = iModel;\r\n const dbName = `${iModel[_nativeDb].getTempFileBaseName()}-locks`;\r\n\r\n try {\r\n this.lockDb.openDb(dbName, OpenMode.ReadWrite);\r\n } catch {\r\n this.lockDb.createDb(dbName);\r\n }\r\n\r\n // Tracks the locks that are actively held.\r\n this.lockDb.executeSQL(\"CREATE TABLE IF NOT EXISTS locks(id INTEGER PRIMARY KEY NOT NULL,state INTEGER NOT NULL,origin INTEGER)\");\r\n // Tracks the locks that are required by each Txn. They may or may not currently be held.\r\n this.lockDb.executeSQL(`\r\n CREATE TABLE IF NOT EXISTS txn_locks(\r\n txnId INTEGER NOT NULL,\r\n elementId INTEGER NOT NULL,\r\n state INTEGER NOT NULL,\r\n origin INTEGER NOT NULL,\r\n abandoned BOOLEAN NOT NULL,\r\n PRIMARY KEY (txnId, elementId))`);\r\n this.lockDb.saveChanges();\r\n\r\n this._removeOnCommitListener = this.briefcase.txns.onCommit.addListener(() => {\r\n const committedTxnId = this.briefcase.txns.queryPreviousTxnId(this.briefcase.txns.getCurrentTxnId())\r\n\r\n // With this commit, any reversed txns with the committed txn's ID or greater are no longer reinstatable,\r\n // so clear out the record of their locks. If the locks are still held, sorry, it's too late!\r\n this.clearTxnLockRecords(committedTxnId);\r\n\r\n // All of the \"current\" changes are now part of a real txn, so update the txn id accordingly.\r\n this.lockDb.withPreparedSqliteStatement(\"UPDATE txn_locks SET txnId=? WHERE txnId=?\", (stmt) => {\r\n stmt.bindId(1, committedTxnId);\r\n stmt.bindId(2, this._unsavedChangesTxnId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't update locks database with txn ID of unsaved changes txn upon saving (error code ${rc})`);\r\n });\r\n\r\n this.lockDb.saveChanges();\r\n });\r\n }\r\n\r\n public [_close]() {\r\n this._removeOnCommitListener();\r\n\r\n if (this.lockDb.isOpen)\r\n this.lockDb.closeDb();\r\n }\r\n\r\n private getOwners(id: Id64String): ElementOwners {\r\n return this.briefcase.withPreparedSqliteStatement(\"SELECT ModelId,ParentId FROM bis_Element WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_ROW !== rc)\r\n throw new IModelError(rc, `element ${id} not found`);\r\n\r\n return { modelId: stmt.getValueId(0), parentId: stmt.getValueId(1) };\r\n });\r\n }\r\n\r\n private getLockState(id?: Id64String): LockState | undefined {\r\n return (id === undefined || !Id64.isValid(id)) ? undefined : this.lockDb.withPreparedSqliteStatement(\"SELECT state FROM locks WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, id);\r\n return (DbResult.BE_SQLITE_ROW === stmt.step()) ? stmt.getValueInteger(0) : undefined;\r\n });\r\n }\r\n\r\n /** Clear the cache of locally held locks.\r\n * Note: does *not* release locks from server.\r\n */\r\n private clearAllLocks() {\r\n this.lockDb.executeSQL(\"DELETE FROM locks\");\r\n this.lockDb.executeSQL(\"DELETE FROM txn_locks\");\r\n this.lockDb.saveChanges();\r\n }\r\n\r\n /** only for tests */\r\n public getLockCount(state: LockState): number {\r\n return this.lockDb.withSqliteStatement(\"SELECT count(*) FROM locks WHERE state=?\", (stmt) => {\r\n stmt.bindInteger(1, state);\r\n stmt.step();\r\n return stmt.getValueInteger(0);\r\n });\r\n }\r\n\r\n public async [_releaseAllLocks](): Promise<void> {\r\n await IModelHost[_hubAccess].releaseAllLocks(this.briefcase); // throws if unsuccessful\r\n this.clearAllLocks();\r\n }\r\n\r\n public async releaseAllLocks(): Promise<void> {\r\n if (this.briefcase.txns.hasLocalChanges) {\r\n ServerBasedLocksError.throwError(\"has-unsaved-changes\", \"Locks cannot be released while the briefcase contains local changes\");\r\n }\r\n\r\n return this[_releaseAllLocks]();\r\n }\r\n\r\n public async abandonAllLocks(): Promise<void> {\r\n if (this.briefcase.txns.hasLocalChanges) {\r\n ServerBasedLocksError.throwError(\"has-unsaved-changes\", \"Locks cannot be abandoned while the briefcase contains local changes\");\r\n }\r\n\r\n if (IModelHost[_hubAccess].abandonAllLocks === undefined) {\r\n // If the IModelHub doesn't support an explicit abandon, call release with a blank changeset to indicate\r\n // that locks should be released without updating the changeset associated with the locks.\r\n await IModelHost[_hubAccess].releaseAllLocks({\r\n iModelId: this.briefcase.iModelId,\r\n briefcaseId: this.briefcase.briefcaseId,\r\n changeset: { id: \"\", index: 0 }\r\n });\r\n } else {\r\n await IModelHost[_hubAccess].abandonAllLocks(this.briefcase);\r\n }\r\n\r\n this.clearAllLocks();\r\n }\r\n\r\n private insertLock(id: Id64String, state: LockState, origin: LockOrigin): true {\r\n this.lockDb.withPreparedSqliteStatement(\"INSERT INTO locks(id,state,origin) VALUES (?,?,?) ON CONFLICT(id) DO UPDATE SET state=excluded.state,origin=excluded.origin\", (stmt) => {\r\n stmt.bindId(1, id);\r\n stmt.bindInteger(2, state);\r\n stmt.bindInteger(3, origin);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n throw new IModelError(rc, \"can't insert lock into database\");\r\n });\r\n\r\n return true;\r\n }\r\n\r\n private insertTxnLockRecord(id: Id64String, state: LockState, origin: LockOrigin): void {\r\n // Locks are always acquired in the current txn, which isn't a real txn until it's committed.\r\n // So use a placeholder txn id for now, and we'll update to the real txn id on commit.\r\n // This is important to distinguish new locks acquired in the current txn from locks acquired in previous reversed txns, which will only\r\n // be cleared (no longer reinstateable) on commit.\r\n this.lockDb.withPreparedSqliteStatement(`\r\n INSERT INTO txn_locks(txnId,elementId,state,origin,abandoned)\r\n VALUES (?,?,?,?,FALSE)\r\n ON CONFLICT(txnId,elementId)\r\n DO UPDATE SET\r\n state=excluded.state,\r\n origin=excluded.origin,\r\n abandoned=excluded.abandoned`, (stmt) => {\r\n stmt.bindId(1, this._unsavedChangesTxnId);\r\n stmt.bindId(2, id);\r\n stmt.bindInteger(3, state);\r\n stmt.bindInteger(4, origin);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't insert txn lock record into database (error code ${rc})`);\r\n });\r\n }\r\n\r\n private ownerHoldsExclusiveLock(id: Id64String | undefined): boolean {\r\n if (id === undefined || id === IModel.rootSubjectId)\r\n return false; // has no owners\r\n\r\n const { modelId, parentId } = this.getOwners(id);\r\n if (this.getLockState(modelId) === LockState.Exclusive || this.getLockState(parentId) === LockState.Exclusive)\r\n return true;\r\n\r\n // see if this model is exclusively locked by one of its owners. If so, save that fact on modelId so future tests won't have to descend.\r\n if (this.ownerHoldsExclusiveLock(modelId))\r\n return this.insertLock(modelId, LockState.Exclusive, LockOrigin.Discovered);\r\n\r\n // see if the parent is exclusively locked by one of its owners. If so, save that fact on parentId so future tests won't have to descend.\r\n return this.ownerHoldsExclusiveLock(parentId) ? this.insertLock(parentId!, LockState.Exclusive, LockOrigin.Discovered) : false; // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n }\r\n\r\n /** Determine whether an the exclusive lock is already held by an element (or one of its owners) */\r\n public holdsExclusiveLock(id: Id64String): boolean {\r\n // see if we hold the exclusive lock. or if one of the element's owners is exclusively locked (recursively)\r\n return this.getLockState(id) === LockState.Exclusive || this.ownerHoldsExclusiveLock(id);\r\n }\r\n\r\n public holdsSharedLock(id: Id64String): boolean {\r\n const state = this.getLockState(id);\r\n // see if we hold shared or exclusive lock, or if an owner has exclusive lock. If so we implicitly have shared lock, but owner holding shared lock doesn't help.\r\n return (state === LockState.Shared || state === LockState.Exclusive) || this.ownerHoldsExclusiveLock(id);\r\n }\r\n\r\n /** if the shared lock on the element supplied is not already held, add it to the set of shared locks required. Then, check owners. */\r\n private addSharedLock(id: Id64String | undefined, locks: Set<Id64String>) {\r\n // if the id is not valid, or of the lock is already in the set, or if we already hold a shared lock, we're done\r\n // Note: if we hold a shared lock, it is guaranteed that we also hold all required shared locks on owners.\r\n if (id === undefined || !Id64.isValid(id) || locks.has(id) || this.holdsSharedLock(id))\r\n return;\r\n\r\n locks.add(id); // add to set of needed shared locks\r\n this.addOwnerSharedLocks(id, locks); // check parent models and groups\r\n }\r\n\r\n /** add owners (recursively) of an element to a list of required shared locks, if not already held. */\r\n private addOwnerSharedLocks(id: Id64String, locks: Set<Id64String>) {\r\n const el = this.getOwners(id);\r\n this.addSharedLock(el.parentId, locks); // if this element is in a group\r\n this.addSharedLock(el.modelId, locks); // check its model\r\n }\r\n\r\n /** attempt to acquire all necessary locks for a set of elements */\r\n private async acquireAllLocks(locks: LockMap) {\r\n if (locks.size === 0) // no locks are required.\r\n return;\r\n\r\n const sharedLocks = new Set<Id64String>();\r\n for (const lock of locks)\r\n this.addOwnerSharedLocks(lock[0], sharedLocks);\r\n\r\n for (const shared of sharedLocks) {\r\n if (!locks.has(shared)) // we may already be asking for exclusive lock\r\n locks.set(shared, LockState.Shared);\r\n }\r\n\r\n await IModelHost[_hubAccess].acquireLocks(this.briefcase, locks); // throws if unsuccessful\r\n for (const lock of locks) {\r\n this.insertLock(lock[0], lock[1], LockOrigin.Acquired);\r\n this.insertTxnLockRecord(lock[0], lock[1], LockOrigin.Acquired);\r\n }\r\n this.lockDb.saveChanges();\r\n }\r\n\r\n public async acquireLocks(arg: { shared?: Id64Arg, exclusive?: Id64Arg }): Promise<void> {\r\n const locks = new Map<Id64String, LockState>();\r\n if (arg.shared) {\r\n for (const id of Id64.iterable(arg.shared)) {\r\n if (!this.holdsSharedLock(id))\r\n locks.set(id, LockState.Shared);\r\n }\r\n }\r\n if (arg.exclusive) {\r\n for (const id of Id64.iterable(arg.exclusive)) {\r\n if (!this.holdsExclusiveLock(id))\r\n locks.set(id, LockState.Exclusive);\r\n }\r\n }\r\n return this.acquireAllLocks(locks);\r\n }\r\n\r\n private async abandonLocks(locks: LockMap): Promise<void> {\r\n if (IModelHost[_hubAccess].abandonLocks === undefined) {\r\n // If the IModelHub doesn't support an explicit abandon, call acquireLocks with a blank changeset to indicate\r\n // that locks should be released without updating the changeset associated with the locks.\r\n await IModelHost[_hubAccess].acquireLocks({\r\n iModelId: this.briefcase.iModelId,\r\n briefcaseId: this.briefcase.briefcaseId,\r\n changeset: { id: \"\", index: 0 }\r\n }, locks);\r\n } else {\r\n await IModelHost[_hubAccess].abandonLocks(this.briefcase, locks);\r\n }\r\n }\r\n\r\n public async abandonLocksForCurrentUnsavedTxn(): Promise<boolean> {\r\n return this.abandonLocksForReversedTxn(this._unsavedChangesTxnId);\r\n }\r\n\r\n public async abandonLocksForReversedTxn(txnId: Id64String): Promise<boolean> {\r\n if (this.briefcase.txns.hasUnsavedChanges)\r\n ServerBasedLocksError.throwError(\"has-unsaved-changes\", `cannot abandon locks for txn ${txnId} because the current txn has unsaved changes`);\r\n\r\n const txnProps = this.briefcase.txns.getTxnProps(txnId);\r\n if (txnProps === undefined) {\r\n // The current txn commonly won't exist on the TxnManager yet. It's often just a placeholder for not-yet-saved changes.\r\n // (Sometimes it will exist and refer to a reversed Txn).\r\n // The unsavedChangesTxnId won't exist on the TxnManager either, of course.\r\n // But all other txn ids must be known to the TxnManager or it is an error.\r\n if (txnId !== this.briefcase.txns.getCurrentTxnId() && txnId !== this._unsavedChangesTxnId)\r\n ServerBasedLocksError.throwError(\"txn-id-not-found\", `cannot abandon locks for txn ${txnId} because it does not exist`);\r\n } else {\r\n // If the txn id is known to the TxnManager, then we require that it has already been reversed.\r\n if (!txnProps.reversed)\r\n ServerBasedLocksError.throwError(\"txn-not-reversed\", `cannot abandon locks for txn ${txnId} because it has not been reversed`);\r\n }\r\n\r\n let locksReleased = false;\r\n\r\n // Abandon locks for unsaved (and now abandoned) changes.\r\n if (txnId !== this._unsavedChangesTxnId) {\r\n locksReleased = await this.abandonLocksForCurrentUnsavedTxn();\r\n }\r\n\r\n // At this point, we know:\r\n // 1. There are no unsaved changes, and the associated locks have been abandoned.\r\n // 2. The given txn ID has been reversed, which means any later txns are sure to have been reversed, too.\r\n\r\n // So we simply have to find all non-abandoned locks associated with the given txn or later, abandon them (or restore\r\n // them to their previous state), and mark them as abandoned in txn_locks.\r\n\r\n // Find all locks associated with the given txnId or later.\r\n // For each elementId, find the previous state of the lock before this Txn (if any), or None otherwise.\r\n // This is the state that we will restore the element's lock to. The reason we do this is to account for\r\n // lock upgrades. If an earlier Txn acquired a Shared lock on this element, and this Txn acquired an\r\n // Exclusive lock, we should restore the Shared lock.\r\n const allTxnLocks = new Map<Id64String, LockState>();\r\n const locksToRelease = new Map<Id64String, LockState>();\r\n this.lockDb.withPreparedSqliteStatement(\r\n `\r\n SELECT\r\n current.elementId,\r\n current.origin,\r\n IFNULL(\r\n (SELECT previous.state\r\n FROM txn_locks previous\r\n WHERE previous.elementId = current.elementId\r\n AND previous.txnId < ?2\r\n AND previous.abandoned=FALSE\r\n ORDER BY previous.txnId DESC\r\n LIMIT 1\r\n ),\r\n ?1\r\n ) AS previousState\r\n FROM txn_locks current\r\n WHERE current.txnId>=?2\r\n AND current.abandoned=FALSE\r\n ORDER BY current.txnId DESC\r\n `,\r\n (stmt) => {\r\n stmt.bindInteger(1, LockState.None);\r\n stmt.bindId(2, txnId);\r\n\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n const elementId = stmt.getValueId(0);\r\n const origin = stmt.getValueInteger(1);\r\n const previousState = stmt.getValueInteger(2);\r\n allTxnLocks.set(elementId, previousState);\r\n if (origin !== LockOrigin.NewElement)\r\n locksToRelease.set(elementId, previousState);\r\n }\r\n });\r\n\r\n // Release the locks on the server.\r\n if (locksToRelease.size > 0)\r\n await this.abandonLocks(locksToRelease);\r\n\r\n // Mark the txn locks as abandoned.\r\n if (txnId === this._unsavedChangesTxnId) {\r\n // After abandoning locks held for the \"unsaved\" txn, we clear them completely because they are not reinstateable.\r\n this.lockDb.withPreparedSqliteStatement(\"DELETE FROM txn_locks WHERE txnId=?\", (stmt) => {\r\n stmt.bindId(1, this._unsavedChangesTxnId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't delete txn locks for unsaved changes in database (error code ${rc})`);\r\n });\r\n } else {\r\n this.lockDb.withPreparedSqliteStatement(\"UPDATE txn_locks SET abandoned=TRUE WHERE txnId>=?\", (stmt) => {\r\n stmt.bindId(1, txnId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't mark txn locks as abandoned in database (error code ${rc})`);\r\n });\r\n }\r\n\r\n // Restore each lock to its previous state (if any) in the local cache. Usually this means deleting it.\r\n for (const [elementId, previousState] of allTxnLocks) {\r\n if (previousState === LockState.None) {\r\n this.lockDb.withPreparedSqliteStatement(\"DELETE FROM locks WHERE id=?\", (stmt) => {\r\n stmt.bindId(1, elementId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't delete lock from database (error code ${rc})`);\r\n });\r\n } else {\r\n this.lockDb.withPreparedSqliteStatement(\"UPDATE locks SET state=? WHERE id=?\", (stmt) => {\r\n stmt.bindInteger(1, previousState);\r\n stmt.bindId(2, elementId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't update lock in database (error code ${rc})`);\r\n });\r\n }\r\n }\r\n\r\n // Ideally we'd only invalidate \"Discovered\" locks that are related to this Txn's Shared and\r\n // Exclusive locks. But that is a lot of added complexity for little benefit.\r\n // Clearing them all will have no impact on correctness and a minimal impact on performance.\r\n this.clearDiscoveredLocks();\r\n\r\n this.lockDb.saveChanges();\r\n\r\n return locksReleased || allTxnLocks.size > 0;\r\n }\r\n\r\n private getAbandonedLocksForTxn(txnId: Id64String): {\r\n newElementLocks: Map<Id64String, LockState>,\r\n locksToAcquire: Map<Id64String, LockState>\r\n } {\r\n const newElementLocks = new Map<Id64String, LockState>();\r\n const locksToAcquire = new Map<Id64String, LockState>();\r\n this.lockDb.withPreparedSqliteStatement(\r\n \"SELECT elementId, state, origin FROM txn_locks WHERE txnId<=? AND abandoned=TRUE\",\r\n (stmt) => {\r\n stmt.bindId(1, txnId);\r\n\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n const elementId = stmt.getValueId(0);\r\n const state = stmt.getValueInteger(1);\r\n const origin = stmt.getValueInteger(2);\r\n if (origin === LockOrigin.NewElement)\r\n newElementLocks.set(elementId, state);\r\n else\r\n locksToAcquire.set(elementId, state);\r\n }\r\n });\r\n\r\n return { newElementLocks, locksToAcquire };\r\n }\r\n\r\n public async acquireLocksForReinstatingTxn(txnId: Id64String): Promise<boolean> {\r\n if (this.briefcase.txns.hasUnsavedChanges)\r\n ServerBasedLocksError.throwError(\"has-unsaved-changes\", `cannot acquire locks for reinstating txn ${txnId} because the current txn has unsaved changes`);\r\n\r\n // If the Txn is known to the TxnManager, we can proceed. We don't need to check if it is currently\r\n // reversed, because if it isn't, then abandonLocksForReversedTxn couldn't have been called, and so the\r\n // locks are still held. Proceeding with this method will be a no-op, but it will be harmless.\r\n // However, if the Txn Id is unknown, it may have been canceled or refer to the current Txn\r\n // whose unsaved changes were just abandoned. Or it's just plain-old invalid. In any case, we can't\r\n // re-acquire the associated locks.\r\n const txnProps = this.briefcase.txns.getTxnProps(txnId);\r\n if (txnProps === undefined) {\r\n ServerBasedLocksError.throwError(\"txn-id-not-found\", `cannot acquire locks for txn ${txnId} because it does not exist or has not been saved`);\r\n }\r\n\r\n // Find all locks associated with the given txnId.\r\n const { newElementLocks, locksToAcquire } = this.getAbandonedLocksForTxn(txnId);\r\n\r\n // Attempt to acquire the locks on the server. This may fail if the locks are no longer available!\r\n if (locksToAcquire.size > 0)\r\n await IModelHost[_hubAccess].acquireLocks(this.briefcase, locksToAcquire); // throws if unsuccessful\r\n\r\n // Mark the txn locks as no longer abandoned.\r\n this.lockDb.withPreparedSqliteStatement(\"UPDATE txn_locks SET abandoned=FALSE WHERE txnId<=?\", (stmt) => {\r\n stmt.bindId(1, txnId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't mark txn locks as no longer abandoned in database (error code ${rc})`);\r\n });\r\n\r\n // Insert the newly-acquired locks in the local cache. Note that we don't need to insert entries in the txn_locks table,\r\n // because these locks are already associated with the Txn.\r\n for (const [elementId, state] of locksToAcquire) {\r\n this.insertLock(elementId, state, LockOrigin.Acquired);\r\n }\r\n for (const [elementId, state] of newElementLocks) {\r\n this.insertLock(elementId, state, LockOrigin.NewElement);\r\n }\r\n\r\n // Ideally we'd only invalidate \"Discovered\" locks that are related to this Txn's Shared and\r\n // Exclusive locks. But that is a lot of added complexity for little benefit.\r\n // Clearing them all will have no impact on correctness and a minimal impact on performance.\r\n this.clearDiscoveredLocks();\r\n\r\n this.lockDb.saveChanges();\r\n\r\n return locksToAcquire.size > 0 || newElementLocks.size > 0;\r\n }\r\n\r\n public holdsNecessaryLocksForReinstatingTxn(txnId: Id64String): boolean {\r\n const locks = this.getAbandonedLocksForTxn(txnId);\r\n return locks.locksToAcquire.size === 0 && locks.newElementLocks.size === 0;\r\n }\r\n\r\n public clearTxnLockRecords(txnId: Id64String) {\r\n this.lockDb.withPreparedSqliteStatement(\"DELETE FROM txn_locks WHERE txnId!=? AND txnId>=?\", (stmt) => {\r\n stmt.bindId(1, this._unsavedChangesTxnId);\r\n stmt.bindId(2, txnId);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't delete txn lock records from database (error code ${rc})`);\r\n });\r\n\r\n this.lockDb.saveChanges();\r\n }\r\n\r\n /** When an element is newly created in a session, we hold the lock on it implicitly. Save that fact. */\r\n public [_elementWasCreated](id: Id64String) {\r\n this.insertLock(id, LockState.Exclusive, LockOrigin.NewElement);\r\n this.insertTxnLockRecord(id, LockState.Exclusive, LockOrigin.NewElement);\r\n this.lockDb.saveChanges();\r\n }\r\n\r\n private clearDiscoveredLocks() {\r\n this.lockDb.withPreparedSqliteStatement(\"DELETE FROM locks WHERE origin=?\", (stmt) => {\r\n stmt.bindInteger(1, LockOrigin.Discovered);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc)\r\n ServerBasedLocksError.throwError(\"lock-database-problem\", `can't delete discovered locks from database (error code ${rc})`);\r\n });\r\n }\r\n\r\n /** locks are not necessary during change propagation. */\r\n private get _locksAreRequired() { return !this.briefcase.txns.isIndirectChanges; }\r\n\r\n /** throw if locks are currently required and the exclusive lock is not held on the supplied element */\r\n public checkExclusiveLock(id: Id64String, type: string, operation: string) {\r\n if (this._locksAreRequired && !this.holdsExclusiveLock(id))\r\n throw new IModelError(IModelStatus.LockNotHeld, `exclusive lock not held on ${type} for ${operation} (id=${id})`);\r\n }\r\n\r\n /** throw if locks are currently required and a shared lock is not held on the supplied element */\r\n public checkSharedLock(id: Id64String, type: string, operation: string) {\r\n if (this._locksAreRequired && !this.holdsSharedLock(id))\r\n throw new IModelError(IModelStatus.LockNotHeld, `shared lock not held on ${type} for ${operation} (id=${id})`);\r\n }\r\n\r\n}\r\n\r\nexport function createServerBasedLocks(iModel: BriefcaseDb): LockControl {\r\n return new ServerBasedLocks(iModel);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Symbols.js","sourceRoot":"","sources":["../../../src/internal/Symbols.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;AAE1I,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,GAAG,IAAI,wCAAwC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3D,gBAAgB;AAChB,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;AAC/D,gBAAgB;AAChB,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACrE,gBAAgB;AAChB,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Workspace\n */\n\nexport const _implementationProhibited = Symbol.for(\"Implementations of this interface can only be obtained from the containing package\");\n\nfunction sym(name: string): string {\n return `${name}_core-backend_INTERNAL_ONLY_DO_NOT_USE`;\n}\n\nexport const _close = Symbol.for(sym(\"close\"));\nexport const _elementWasCreated = Symbol.for(sym(\"elementWasCreated\"));\nexport const _faceProps = Symbol.for(sym(\"faceProps\"));\nexport const _getData = Symbol.for(sym(\"getData\"));\nexport const _key = Symbol.for(sym(\"key\"));\n/** @internal */\nexport const _implicitTxn = Symbol.for(sym(\"implicitTxn\"));\n/** @internal */\nexport const _nativeDb = Symbol.for(sym(\"nativeDb\"));\nexport const _releaseAllLocks = Symbol.for(sym(\"releaseAllLocks\"));\nexport const _verifyChannel = Symbol.for(sym(\"verifyChannel\"));\n/** @internal */\nexport const _hubAccess = Symbol.for(sym(\"hubAccess\"));\nexport const _setHubAccess = Symbol.for(sym(\"setHubAccess\"));\nexport const _getHubAccess = Symbol.for(sym(\"getHubAccess\"));\nexport const _mockCheckpoint = Symbol.for(sym(\"mockCheckpoint\"));\nexport const _cache = Symbol.for(sym(\"cache\"));\nexport const _instanceKeyCache = Symbol.for(sym(\"instanceKeyCache\"));\n/** @internal */\nexport const _activeTxn = Symbol.for(sym(\"activeTxn\"));\nexport const _resetIModelDb = Symbol.for(sym(\"resetIModelDb\"));\n"]}
1
+ {"version":3,"file":"Symbols.js","sourceRoot":"","sources":["../../../src/internal/Symbols.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAC;AAE1I,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,GAAG,IAAI,wCAAwC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACvE,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3D,gBAAgB;AAChB,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;AAC/D,gBAAgB;AAChB,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACrE,gBAAgB;AAChB,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Workspace\r\n */\r\n\r\nexport const _implementationProhibited = Symbol.for(\"Implementations of this interface can only be obtained from the containing package\");\r\n\r\nfunction sym(name: string): string {\r\n return `${name}_core-backend_INTERNAL_ONLY_DO_NOT_USE`;\r\n}\r\n\r\nexport const _close = Symbol.for(sym(\"close\"));\r\nexport const _elementWasCreated = Symbol.for(sym(\"elementWasCreated\"));\r\nexport const _faceProps = Symbol.for(sym(\"faceProps\"));\r\nexport const _getData = Symbol.for(sym(\"getData\"));\r\nexport const _key = Symbol.for(sym(\"key\"));\r\n/** @internal */\r\nexport const _implicitTxn = Symbol.for(sym(\"implicitTxn\"));\r\n/** @internal */\r\nexport const _nativeDb = Symbol.for(sym(\"nativeDb\"));\r\nexport const _releaseAllLocks = Symbol.for(sym(\"releaseAllLocks\"));\r\nexport const _verifyChannel = Symbol.for(sym(\"verifyChannel\"));\r\n/** @internal */\r\nexport const _hubAccess = Symbol.for(sym(\"hubAccess\"));\r\nexport const _setHubAccess = Symbol.for(sym(\"setHubAccess\"));\r\nexport const _getHubAccess = Symbol.for(sym(\"getHubAccess\"));\r\nexport const _mockCheckpoint = Symbol.for(sym(\"mockCheckpoint\"));\r\nexport const _cache = Symbol.for(sym(\"cache\"));\r\nexport const _instanceKeyCache = Symbol.for(sym(\"instanceKeyCache\"));\r\n/** @internal */\r\nexport const _activeTxn = Symbol.for(sym(\"activeTxn\"));\r\nexport const _resetIModelDb = Symbol.for(sym(\"resetIModelDb\"));\r\n"]}