@itwin/core-backend 5.0.0-dev.97 → 5.0.0-dev.99

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 (173) hide show
  1. package/lib/cjs/BackendHubAccess.d.ts +2 -8
  2. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  3. package/lib/cjs/BackendHubAccess.js.map +1 -1
  4. package/lib/cjs/ChangeSummaryManager.d.ts.map +1 -1
  5. package/lib/cjs/ChangeSummaryManager.js +12 -5
  6. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  7. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  8. package/lib/cjs/ChangesetECAdaptor.js +1 -0
  9. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  10. package/lib/cjs/CheckpointManager.d.ts +8 -15
  11. package/lib/cjs/CheckpointManager.d.ts.map +1 -1
  12. package/lib/cjs/CheckpointManager.js +23 -54
  13. package/lib/cjs/CheckpointManager.js.map +1 -1
  14. package/lib/cjs/ECDb.d.ts +37 -1
  15. package/lib/cjs/ECDb.d.ts.map +1 -1
  16. package/lib/cjs/ECDb.js +81 -0
  17. package/lib/cjs/ECDb.js.map +1 -1
  18. package/lib/cjs/ECSqlStatement.d.ts +181 -2
  19. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  20. package/lib/cjs/ECSqlStatement.js +224 -5
  21. package/lib/cjs/ECSqlStatement.js.map +1 -1
  22. package/lib/cjs/Element.d.ts +16 -4
  23. package/lib/cjs/Element.d.ts.map +1 -1
  24. package/lib/cjs/Element.js +40 -2
  25. package/lib/cjs/Element.js.map +1 -1
  26. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  27. package/lib/cjs/ElementAspect.js +1 -0
  28. package/lib/cjs/ElementAspect.js.map +1 -1
  29. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  30. package/lib/cjs/ElementTreeWalker.js +4 -0
  31. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  32. package/lib/cjs/HubMock.d.ts +1 -1
  33. package/lib/cjs/HubMock.d.ts.map +1 -1
  34. package/lib/cjs/HubMock.js +13 -2
  35. package/lib/cjs/HubMock.js.map +1 -1
  36. package/lib/cjs/IModelDb.d.ts +4 -0
  37. package/lib/cjs/IModelDb.d.ts.map +1 -1
  38. package/lib/cjs/IModelDb.js +33 -3
  39. package/lib/cjs/IModelDb.js.map +1 -1
  40. package/lib/cjs/Relationship.d.ts.map +1 -1
  41. package/lib/cjs/Relationship.js +2 -0
  42. package/lib/cjs/Relationship.js.map +1 -1
  43. package/lib/cjs/ViewStore.d.ts.map +1 -1
  44. package/lib/cjs/ViewStore.js +2 -1
  45. package/lib/cjs/ViewStore.js.map +1 -1
  46. package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
  47. package/lib/cjs/internal/ChannelAdmin.js +2 -0
  48. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  49. package/lib/cjs/internal/Symbols.d.ts +2 -0
  50. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  51. package/lib/cjs/internal/Symbols.js +3 -1
  52. package/lib/cjs/internal/Symbols.js.map +1 -1
  53. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  54. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +1 -0
  55. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  56. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
  57. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +11 -22
  58. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  59. package/lib/esm/BackendHubAccess.d.ts +2 -8
  60. package/lib/esm/BackendHubAccess.d.ts.map +1 -1
  61. package/lib/esm/BackendHubAccess.js.map +1 -1
  62. package/lib/esm/ChangeSummaryManager.d.ts.map +1 -1
  63. package/lib/esm/ChangeSummaryManager.js +12 -5
  64. package/lib/esm/ChangeSummaryManager.js.map +1 -1
  65. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  66. package/lib/esm/ChangesetECAdaptor.js +1 -0
  67. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  68. package/lib/esm/CheckpointManager.d.ts +8 -15
  69. package/lib/esm/CheckpointManager.d.ts.map +1 -1
  70. package/lib/esm/CheckpointManager.js +22 -52
  71. package/lib/esm/CheckpointManager.js.map +1 -1
  72. package/lib/esm/ECDb.d.ts +37 -1
  73. package/lib/esm/ECDb.d.ts.map +1 -1
  74. package/lib/esm/ECDb.js +82 -1
  75. package/lib/esm/ECDb.js.map +1 -1
  76. package/lib/esm/ECSqlStatement.d.ts +181 -2
  77. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  78. package/lib/esm/ECSqlStatement.js +222 -4
  79. package/lib/esm/ECSqlStatement.js.map +1 -1
  80. package/lib/esm/Element.d.ts +16 -4
  81. package/lib/esm/Element.d.ts.map +1 -1
  82. package/lib/esm/Element.js +40 -2
  83. package/lib/esm/Element.js.map +1 -1
  84. package/lib/esm/ElementAspect.d.ts.map +1 -1
  85. package/lib/esm/ElementAspect.js +1 -0
  86. package/lib/esm/ElementAspect.js.map +1 -1
  87. package/lib/esm/ElementTreeWalker.d.ts.map +1 -1
  88. package/lib/esm/ElementTreeWalker.js +4 -0
  89. package/lib/esm/ElementTreeWalker.js.map +1 -1
  90. package/lib/esm/HubMock.d.ts +1 -1
  91. package/lib/esm/HubMock.d.ts.map +1 -1
  92. package/lib/esm/HubMock.js +13 -2
  93. package/lib/esm/HubMock.js.map +1 -1
  94. package/lib/esm/IModelDb.d.ts +4 -0
  95. package/lib/esm/IModelDb.d.ts.map +1 -1
  96. package/lib/esm/IModelDb.js +33 -3
  97. package/lib/esm/IModelDb.js.map +1 -1
  98. package/lib/esm/Relationship.d.ts.map +1 -1
  99. package/lib/esm/Relationship.js +2 -0
  100. package/lib/esm/Relationship.js.map +1 -1
  101. package/lib/esm/ViewStore.d.ts.map +1 -1
  102. package/lib/esm/ViewStore.js +2 -1
  103. package/lib/esm/ViewStore.js.map +1 -1
  104. package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
  105. package/lib/esm/internal/ChannelAdmin.js +2 -0
  106. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  107. package/lib/esm/internal/Symbols.d.ts +2 -0
  108. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  109. package/lib/esm/internal/Symbols.js +2 -0
  110. package/lib/esm/internal/Symbols.js.map +1 -1
  111. package/lib/esm/rpc-impl/IModelReadRpcImpl.d.ts.map +1 -1
  112. package/lib/esm/rpc-impl/IModelReadRpcImpl.js +1 -0
  113. package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  114. package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
  115. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js +13 -24
  116. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  117. package/lib/esm/test/CloudSqliteMock.d.ts +37 -0
  118. package/lib/esm/test/CloudSqliteMock.d.ts.map +1 -0
  119. package/lib/esm/test/CloudSqliteMock.js +117 -0
  120. package/lib/esm/test/CloudSqliteMock.js.map +1 -0
  121. package/lib/esm/test/IModelTestUtils.d.ts +1 -1
  122. package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
  123. package/lib/esm/test/IModelTestUtils.js +16 -4
  124. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  125. package/lib/esm/test/PrintElementTree.js +1 -0
  126. package/lib/esm/test/PrintElementTree.js.map +1 -1
  127. package/lib/esm/test/SchemaUtils.test.js +2 -0
  128. package/lib/esm/test/SchemaUtils.test.js.map +1 -1
  129. package/lib/esm/test/ecdb/ECDb.test.js +12 -1
  130. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  131. package/lib/esm/test/ecdb/ECSqlAst.test.js +1 -0
  132. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  133. package/lib/esm/test/ecdb/ECSqlQuery.test.js +6 -0
  134. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  135. package/lib/esm/test/ecdb/ECSqlReader.test.js +1 -1
  136. package/lib/esm/test/ecdb/ECSqlReader.test.js.map +1 -1
  137. package/lib/esm/test/ecdb/ECSqlStatement.test.js +253 -163
  138. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  139. package/lib/esm/test/ecdb/SqliteStatement.test.js +2 -0
  140. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  141. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +1 -0
  142. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  143. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +5 -1
  144. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  145. package/lib/esm/test/element/ElementRoundTrip.test.js +10 -0
  146. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  147. package/lib/esm/test/font/IModelDbFonts.test.js +3 -1
  148. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  149. package/lib/esm/test/hubaccess/BriefcaseManager.test.js +18 -7
  150. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  151. package/lib/esm/test/hubaccess/CheckpointManager.test.js +5 -91
  152. package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
  153. package/lib/esm/test/imodel/ElementTreeWalker.test.js +1 -0
  154. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  155. package/lib/esm/test/imodel/IModel.test.js +14 -0
  156. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  157. package/lib/esm/test/schema/GenericDomain.test.js +1 -0
  158. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  159. package/lib/esm/test/standalone/ChangeMerge.test.js +0 -4
  160. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  161. package/lib/esm/test/standalone/ChangesetReader.test.js +1 -0
  162. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  163. package/lib/esm/test/standalone/Drawing.test.d.ts +2 -0
  164. package/lib/esm/test/standalone/Drawing.test.d.ts.map +1 -0
  165. package/lib/esm/test/standalone/Drawing.test.js +120 -0
  166. package/lib/esm/test/standalone/Drawing.test.js.map +1 -0
  167. package/lib/esm/test/standalone/IModelWrite.test.js +22 -6
  168. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  169. package/lib/esm/test/standalone/RenderMaterialElement.test.js +1 -0
  170. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  171. package/lib/esm/test/standalone/SnapshotDb.test.js +4 -3
  172. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  173. package/package.json +13 -12
@@ -24,6 +24,7 @@ export function printElementTree(loggerCategory, seen, iModel, elementId, indent
24
24
  const subModel = iModel.models.tryGetModel(elementId);
25
25
  if (subModel !== undefined) {
26
26
  Logger.logTrace(loggerCategory, `${"\t".repeat(indent)} subModel ${fmtModel(subModel)}:`);
27
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
27
28
  iModel.withPreparedStatement(`select ecinstanceid from ${Element.classFullName} where Model.Id = ?`, (stmt) => {
28
29
  stmt.bindId(1, subModel.id);
29
30
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
@@ -1 +1 @@
1
- {"version":3,"file":"PrintElementTree.js","sourceRoot":"","sources":["../../../src/test/PrintElementTree.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,QAAQ,EAAc,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGnE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,UAAU,UAAU,CAAC,MAAgB,EAAE,SAAqB;IAChE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACjD,OAAO,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAY;IACnC,OAAO,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,cAAsB,EAAE,IAAqB,EAAE,MAAgB,EAAE,SAAqB,EAAE,MAAc;IACrI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QACjG,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEpB,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAE1F,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,gBAAgB,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAQ,SAAS,CAAC,CAAC;IAC7D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE1F,MAAM,CAAC,qBAAqB,CAAC,4BAA4B,OAAO,CAAC,aAAa,qBAAqB,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5G,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC9C,gBAAgB,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YACvF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;AACH,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*--------------------------------------------------------------------------------------------*/\nimport { DbResult, Id64String, Logger } from \"@itwin/core-bentley\";\nimport { IModelDb } from \"../IModelDb\";\nimport { Model } from \"../Model\";\nimport { Element } from \"../Element\";\n\nexport function fmtElement(iModel: IModelDb, elementId: Id64String): string {\n const el = iModel.elements.getElement(elementId);\n return `${el.id} ${el.classFullName} ${el.getDisplayLabel()}`;\n}\n\nexport function fmtModel(model: Model): string {\n return `${model.id} ${model.classFullName} ${model.name}`;\n}\n\nexport function printElementTree(loggerCategory: string, seen: Set<Id64String>, iModel: IModelDb, elementId: Id64String, indent: number) {\n if (seen.has(elementId)) {\n Logger.logTrace(loggerCategory, `${\"\\t\".repeat(indent)}${fmtElement(iModel, elementId)} (SEEN)`);\n return;\n }\n\n seen.add(elementId);\n\n Logger.logTrace(loggerCategory, `${\"\\t\".repeat(indent)}${fmtElement(iModel, elementId)}`);\n\n for (const child of iModel.elements.queryChildren(elementId)) {\n printElementTree(loggerCategory, seen, iModel, child, indent + 1);\n }\n\n const subModel = iModel.models.tryGetModel<Model>(elementId);\n if (subModel !== undefined) {\n Logger.logTrace(loggerCategory, `${\"\\t\".repeat(indent)} subModel ${fmtModel(subModel)}:`);\n\n iModel.withPreparedStatement(`select ecinstanceid from ${Element.classFullName} where Model.Id = ?`, (stmt) => {\n stmt.bindId(1, subModel.id);\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n printElementTree(loggerCategory, seen, iModel, stmt.getValue(0).getId(), indent + 1);\n }\n });\n }\n}\n"]}
1
+ {"version":3,"file":"PrintElementTree.js","sourceRoot":"","sources":["../../../src/test/PrintElementTree.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,QAAQ,EAAc,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGnE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,UAAU,UAAU,CAAC,MAAgB,EAAE,SAAqB;IAChE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACjD,OAAO,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAY;IACnC,OAAO,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,cAAsB,EAAE,IAAqB,EAAE,MAAgB,EAAE,SAAqB,EAAE,MAAc;IACrI,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QACjG,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAEpB,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAE1F,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,gBAAgB,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAQ,SAAS,CAAC,CAAC;IAC7D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1F,4DAA4D;QAC5D,MAAM,CAAC,qBAAqB,CAAC,4BAA4B,OAAO,CAAC,aAAa,qBAAqB,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5G,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC9C,gBAAgB,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YACvF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;AACH,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*--------------------------------------------------------------------------------------------*/\nimport { DbResult, Id64String, Logger } from \"@itwin/core-bentley\";\nimport { IModelDb } from \"../IModelDb\";\nimport { Model } from \"../Model\";\nimport { Element } from \"../Element\";\n\nexport function fmtElement(iModel: IModelDb, elementId: Id64String): string {\n const el = iModel.elements.getElement(elementId);\n return `${el.id} ${el.classFullName} ${el.getDisplayLabel()}`;\n}\n\nexport function fmtModel(model: Model): string {\n return `${model.id} ${model.classFullName} ${model.name}`;\n}\n\nexport function printElementTree(loggerCategory: string, seen: Set<Id64String>, iModel: IModelDb, elementId: Id64String, indent: number) {\n if (seen.has(elementId)) {\n Logger.logTrace(loggerCategory, `${\"\\t\".repeat(indent)}${fmtElement(iModel, elementId)} (SEEN)`);\n return;\n }\n\n seen.add(elementId);\n\n Logger.logTrace(loggerCategory, `${\"\\t\".repeat(indent)}${fmtElement(iModel, elementId)}`);\n\n for (const child of iModel.elements.queryChildren(elementId)) {\n printElementTree(loggerCategory, seen, iModel, child, indent + 1);\n }\n\n const subModel = iModel.models.tryGetModel<Model>(elementId);\n if (subModel !== undefined) {\n Logger.logTrace(loggerCategory, `${\"\\t\".repeat(indent)} subModel ${fmtModel(subModel)}:`);\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n iModel.withPreparedStatement(`select ecinstanceid from ${Element.classFullName} where Model.Id = ?`, (stmt) => {\n stmt.bindId(1, subModel.id);\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n printElementTree(loggerCategory, seen, iModel, stmt.getValue(0).getId(), indent + 1);\n }\n });\n }\n}\n"]}
@@ -55,6 +55,7 @@ describe("convertEC2Schemas", () => {
55
55
  assert.isTrue(db !== undefined);
56
56
  assert.isTrue(db.isOpen);
57
57
  const propNamesInEntityClass = [];
58
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
58
59
  let stmt = db.prepareStatement("SELECT p.Name FROM meta.ECPropertyDef p JOIN meta.ECClassDef c USING meta.ClassOwnsLocalProperties JOIN meta.ECSchemaDef s USING meta.SchemaOwnsClasses WHERE s.Name='TestSchema' AND c.Name='TestEntityClass' ORDER BY p.Ordinal");
59
60
  let rowCount = 0;
60
61
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
@@ -77,6 +78,7 @@ describe("convertEC2Schemas", () => {
77
78
  assert.isTrue(propNamesInEntityClass.includes("TargetId")); // The TargetId property is allowed on Entity classes and should not be renamed
78
79
  assert.isTrue(propNamesInEntityClass.includes("TargetECClassId")); // The TargetECClassId property is allowed on Entity classes and should not be renamed
79
80
  const propNamesInStructClass = [];
81
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
80
82
  stmt = db.prepareStatement("SELECT p.Name FROM meta.ECPropertyDef p JOIN meta.ECClassDef c USING meta.ClassOwnsLocalProperties JOIN meta.ECSchemaDef s USING meta.SchemaOwnsClasses WHERE s.Name='TestSchema' AND c.Name='TestStructClass' ORDER BY p.Ordinal");
81
83
  rowCount = 0;
82
84
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaUtils.test.js","sourceRoot":"","sources":["../../../src/test/SchemaUtils.test.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*--------------------------------------------------------------------------------------------*/\nimport { assert } from \"chai\";\nimport { convertEC2SchemasToEC3Schemas, ECDb, ECSqlStatement, upgradeCustomAttributesToEC3 } from \"../core-backend\";\nimport { KnownTestLocations } from \"./KnownTestLocations\";\nimport { ECDbTestHelper } from \"./ecdb/ECDbTestHelper\";\nimport { DbResult } from \"@itwin/core-bentley\";\n\ndescribe(\"convertEC2Schemas\", () => {\n it(\"verify namespace\", () => {\n const ec2SchemaXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" version=\"1.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.2.0\">\n <ECSchemaReference name=\"RefSchema\" version=\"01.00\" prefix=\"rs\" />\n <ECClass typeName=\"TestEntityClass\" isDomainClass=\"true\" />\n </ECSchema>`;\n\n const ec2RefSchema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"RefSchema\" nameSpacePrefix=\"rs\" version=\"1.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.2.0\">\n <ECClass typeName=\"TestStructClass\" isStruct=\"true\" />\n </ECSchema>`;\n\n const ec3Schemas: string[] = convertEC2SchemasToEC3Schemas([ec2SchemaXml, ec2RefSchema]);\n assert.equal(ec3Schemas.length, 2);\n // converted EC3 schemas are in the same order as of input schemas\n const ec3SchemaXml = ec3Schemas[0];\n const ec3RefSchema = ec3Schemas[1];\n\n assert.isTrue(ec3SchemaXml.includes(\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\"));\n assert.isTrue(ec3RefSchema.includes(\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\"));\n });\n\n it(\"rename reserved words\", async () => {\n const ec2SchemaXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" version=\"1.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.2.0\">\n <ECClass typeName=\"TestEntityClass\" isDomainClass=\"true\">\n <ECProperty propertyName=\"Id\" typeName=\"string\" />\n <ECProperty propertyName=\"ECInstanceId\" typeName=\"string\" />\n <ECProperty propertyName=\"ECClassId\" typeName=\"string\" />\n <ECProperty propertyName=\"SourceECInstanceId\" typeName=\"string\" />\n <ECProperty propertyName=\"SourceId\" typeName=\"string\" />\n <ECProperty propertyName=\"SourceECClassId\" typeName=\"string\" />\n <ECProperty propertyName=\"TargetECInstanceId\" typeName=\"string\" />\n <ECProperty propertyName=\"TargetId\" typeName=\"string\" />\n <ECProperty propertyName=\"TargetECClassId\" typeName=\"string\" />\n </ECClass>\n <ECClass typeName=\"TestStructClass\" isStruct=\"true\">\n <ECProperty propertyName=\"Id\" typeName=\"string\" />\n <ECProperty propertyName=\"ECInstanceId\" typeName=\"string\" />\n <ECProperty propertyName=\"ECClassId\" typeName=\"string\" />\n </ECClass>\n </ECSchema>`;\n\n const ec3Schemas: string[] = convertEC2SchemasToEC3Schemas([ec2SchemaXml]);\n assert.equal(ec3Schemas.length, 1);\n const schemasWithUpdatedCA: string[] = upgradeCustomAttributesToEC3(ec3Schemas);\n assert.equal(schemasWithUpdatedCA.length, 1);\n\n const outDir = KnownTestLocations.outputDir;\n const db: ECDb = ECDbTestHelper.createECDb(outDir, \"RenameReservedWords.ecdb\", schemasWithUpdatedCA[0]);\n assert.isTrue(db !== undefined);\n assert.isTrue(db.isOpen);\n\n const propNamesInEntityClass = [];\n let stmt: ECSqlStatement = db.prepareStatement(\"SELECT p.Name FROM meta.ECPropertyDef p JOIN meta.ECClassDef c USING meta.ClassOwnsLocalProperties JOIN meta.ECSchemaDef s USING meta.SchemaOwnsClasses WHERE s.Name='TestSchema' AND c.Name='TestEntityClass' ORDER BY p.Ordinal\");\n let rowCount = 0;\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rowCount++;\n const row = stmt.getRow();\n propNamesInEntityClass.push(row.name);\n }\n stmt[Symbol.dispose]();\n assert.equal(rowCount, 9);\n\n assert.isFalse(propNamesInEntityClass.includes(\"Id\")); // The Id property is a reserved keyword and should have been renamed\n assert.isFalse(propNamesInEntityClass.includes(\"ECClassId\")); // The ECClassId property is a reserved keyword and should have been renamed\n assert.isFalse(propNamesInEntityClass.includes(\"ECInstanceId\")); // The ECInstanceId property is a reserved keyword and should have been renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TestSchema_Id_\")); // The Id property is a reserved keyword and should have been renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TestSchema_ECClassId_\")); // The ECClassId property is a reserved keyword and should have been renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TestSchema_ECInstanceId_\")); // The ECInstanceId property is a reserved keyword and should have been renamed\n assert.isTrue(propNamesInEntityClass.includes(\"SourceECInstanceId\")); // The SourceECInstanceId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"SourceId\")); // The SourceId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"SourceECClassId\")); // The SourceECClassId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TargetECInstanceId\")); // The TargetECInstanceId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TargetId\")); // The TargetId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TargetECClassId\")); // The TargetECClassId property is allowed on Entity classes and should not be renamed\n\n const propNamesInStructClass = [];\n stmt = db.prepareStatement(\"SELECT p.Name FROM meta.ECPropertyDef p JOIN meta.ECClassDef c USING meta.ClassOwnsLocalProperties JOIN meta.ECSchemaDef s USING meta.SchemaOwnsClasses WHERE s.Name='TestSchema' AND c.Name='TestStructClass' ORDER BY p.Ordinal\");\n rowCount = 0;\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rowCount++;\n const row = stmt.getRow();\n propNamesInStructClass.push(row.name);\n }\n stmt[Symbol.dispose]();\n assert.equal(rowCount, 3);\n\n assert.isTrue(propNamesInStructClass.includes(\"Id\")); // The Id property is not a reserved keyword for Struct classes and should not be renamed\n assert.isTrue(propNamesInStructClass.includes(\"ECClassId\")); // The ECClassId property is not a reserved keyword for Struct classes and should not be renamed\n assert.isTrue(propNamesInStructClass.includes(\"ECInstanceId\")); // The ECInstanceId property is not a reserved keyword for Struct classes and should not be renamed\n assert.isFalse(propNamesInStructClass.includes(\"TestSchema_Id_\")); // The Id property is not a reserved keyword for Struct classes and should not be renamed\n assert.isFalse(propNamesInStructClass.includes(\"TestSchema_ECClassId_\")); // The ECClassId property is not a reserved keyword for Struct classes and should not be renamed\n assert.isFalse(propNamesInStructClass.includes(\"TestSchema_ECInstanceId_\")); // The ECInstanceId property is not a reserved keyword for Struct classes and should not be renamed\n });\n});\n"]}
1
+ {"version":3,"file":"SchemaUtils.test.js","sourceRoot":"","sources":["../../../src/test/SchemaUtils.test.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*--------------------------------------------------------------------------------------------*/\nimport { assert } from \"chai\";\nimport { convertEC2SchemasToEC3Schemas, ECDb, ECSqlStatement, upgradeCustomAttributesToEC3 } from \"../core-backend\";\nimport { KnownTestLocations } from \"./KnownTestLocations\";\nimport { ECDbTestHelper } from \"./ecdb/ECDbTestHelper\";\nimport { DbResult } from \"@itwin/core-bentley\";\n\ndescribe(\"convertEC2Schemas\", () => {\n it(\"verify namespace\", () => {\n const ec2SchemaXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" version=\"1.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.2.0\">\n <ECSchemaReference name=\"RefSchema\" version=\"01.00\" prefix=\"rs\" />\n <ECClass typeName=\"TestEntityClass\" isDomainClass=\"true\" />\n </ECSchema>`;\n\n const ec2RefSchema = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"RefSchema\" nameSpacePrefix=\"rs\" version=\"1.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.2.0\">\n <ECClass typeName=\"TestStructClass\" isStruct=\"true\" />\n </ECSchema>`;\n\n const ec3Schemas: string[] = convertEC2SchemasToEC3Schemas([ec2SchemaXml, ec2RefSchema]);\n assert.equal(ec3Schemas.length, 2);\n // converted EC3 schemas are in the same order as of input schemas\n const ec3SchemaXml = ec3Schemas[0];\n const ec3RefSchema = ec3Schemas[1];\n\n assert.isTrue(ec3SchemaXml.includes(\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\"));\n assert.isTrue(ec3RefSchema.includes(\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\"));\n });\n\n it(\"rename reserved words\", async () => {\n const ec2SchemaXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"TestSchema\" version=\"1.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.2.0\">\n <ECClass typeName=\"TestEntityClass\" isDomainClass=\"true\">\n <ECProperty propertyName=\"Id\" typeName=\"string\" />\n <ECProperty propertyName=\"ECInstanceId\" typeName=\"string\" />\n <ECProperty propertyName=\"ECClassId\" typeName=\"string\" />\n <ECProperty propertyName=\"SourceECInstanceId\" typeName=\"string\" />\n <ECProperty propertyName=\"SourceId\" typeName=\"string\" />\n <ECProperty propertyName=\"SourceECClassId\" typeName=\"string\" />\n <ECProperty propertyName=\"TargetECInstanceId\" typeName=\"string\" />\n <ECProperty propertyName=\"TargetId\" typeName=\"string\" />\n <ECProperty propertyName=\"TargetECClassId\" typeName=\"string\" />\n </ECClass>\n <ECClass typeName=\"TestStructClass\" isStruct=\"true\">\n <ECProperty propertyName=\"Id\" typeName=\"string\" />\n <ECProperty propertyName=\"ECInstanceId\" typeName=\"string\" />\n <ECProperty propertyName=\"ECClassId\" typeName=\"string\" />\n </ECClass>\n </ECSchema>`;\n\n const ec3Schemas: string[] = convertEC2SchemasToEC3Schemas([ec2SchemaXml]);\n assert.equal(ec3Schemas.length, 1);\n const schemasWithUpdatedCA: string[] = upgradeCustomAttributesToEC3(ec3Schemas);\n assert.equal(schemasWithUpdatedCA.length, 1);\n\n const outDir = KnownTestLocations.outputDir;\n const db: ECDb = ECDbTestHelper.createECDb(outDir, \"RenameReservedWords.ecdb\", schemasWithUpdatedCA[0]);\n assert.isTrue(db !== undefined);\n assert.isTrue(db.isOpen);\n\n const propNamesInEntityClass = [];\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n let stmt: ECSqlStatement = db.prepareStatement(\"SELECT p.Name FROM meta.ECPropertyDef p JOIN meta.ECClassDef c USING meta.ClassOwnsLocalProperties JOIN meta.ECSchemaDef s USING meta.SchemaOwnsClasses WHERE s.Name='TestSchema' AND c.Name='TestEntityClass' ORDER BY p.Ordinal\");\n let rowCount = 0;\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rowCount++;\n const row = stmt.getRow();\n propNamesInEntityClass.push(row.name);\n }\n stmt[Symbol.dispose]();\n assert.equal(rowCount, 9);\n\n assert.isFalse(propNamesInEntityClass.includes(\"Id\")); // The Id property is a reserved keyword and should have been renamed\n assert.isFalse(propNamesInEntityClass.includes(\"ECClassId\")); // The ECClassId property is a reserved keyword and should have been renamed\n assert.isFalse(propNamesInEntityClass.includes(\"ECInstanceId\")); // The ECInstanceId property is a reserved keyword and should have been renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TestSchema_Id_\")); // The Id property is a reserved keyword and should have been renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TestSchema_ECClassId_\")); // The ECClassId property is a reserved keyword and should have been renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TestSchema_ECInstanceId_\")); // The ECInstanceId property is a reserved keyword and should have been renamed\n assert.isTrue(propNamesInEntityClass.includes(\"SourceECInstanceId\")); // The SourceECInstanceId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"SourceId\")); // The SourceId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"SourceECClassId\")); // The SourceECClassId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TargetECInstanceId\")); // The TargetECInstanceId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TargetId\")); // The TargetId property is allowed on Entity classes and should not be renamed\n assert.isTrue(propNamesInEntityClass.includes(\"TargetECClassId\")); // The TargetECClassId property is allowed on Entity classes and should not be renamed\n\n const propNamesInStructClass = [];\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n stmt = db.prepareStatement(\"SELECT p.Name FROM meta.ECPropertyDef p JOIN meta.ECClassDef c USING meta.ClassOwnsLocalProperties JOIN meta.ECSchemaDef s USING meta.SchemaOwnsClasses WHERE s.Name='TestSchema' AND c.Name='TestStructClass' ORDER BY p.Ordinal\");\n rowCount = 0;\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n rowCount++;\n const row = stmt.getRow();\n propNamesInStructClass.push(row.name);\n }\n stmt[Symbol.dispose]();\n assert.equal(rowCount, 3);\n\n assert.isTrue(propNamesInStructClass.includes(\"Id\")); // The Id property is not a reserved keyword for Struct classes and should not be renamed\n assert.isTrue(propNamesInStructClass.includes(\"ECClassId\")); // The ECClassId property is not a reserved keyword for Struct classes and should not be renamed\n assert.isTrue(propNamesInStructClass.includes(\"ECInstanceId\")); // The ECInstanceId property is not a reserved keyword for Struct classes and should not be renamed\n assert.isFalse(propNamesInStructClass.includes(\"TestSchema_Id_\")); // The Id property is not a reserved keyword for Struct classes and should not be renamed\n assert.isFalse(propNamesInStructClass.includes(\"TestSchema_ECClassId_\")); // The ECClassId property is not a reserved keyword for Struct classes and should not be renamed\n assert.isFalse(propNamesInStructClass.includes(\"TestSchema_ECInstanceId_\")); // The ECInstanceId property is not a reserved keyword for Struct classes and should not be renamed\n });\n});\n"]}
@@ -187,6 +187,7 @@ describe("ECDb", () => {
187
187
  </ECEntityClass>
188
188
  </ECSchema>`), false);
189
189
  assert.isTrue(testECDb.isOpen);
190
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
190
191
  testECDb.withPreparedStatement("INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)", (stmt) => {
191
192
  const res = stmt.stepForInsert();
192
193
  assert.equal(res.status, DbResult.BE_SQLITE_DONE);
@@ -201,6 +202,7 @@ describe("ECDb", () => {
201
202
  WHERE Namespace = 'ec_Db' AND Name = 'SchemaVersion'`, (stmt) => { stmt.step(); });
202
203
  testECDb.saveChanges();
203
204
  const runDbListPragmaUsingStatement = (ecdb) => {
205
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
204
206
  return ecdb.withPreparedStatement("PRAGMA db_list", (stmt) => {
205
207
  const result = [];
206
208
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
@@ -220,6 +222,7 @@ describe("ECDb", () => {
220
222
  const testECDb0 = __addDisposableResource(env_8, ECDbTestHelper.createECDb(outDir, "file2.ecdb"), false);
221
223
  // following call will not fail but unknow ECDb profile will cause it to be attach as SQLite.
222
224
  testECDb0.attachDb(ecdbPath1, "source");
225
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
223
226
  expect(() => testECDb0.withPreparedStatement("SELECT Name, Age FROM source.test.Person", () => { })).to.throw("ECClass 'source.test.Person' does not exist or could not be loaded.");
224
227
  expect(runDbListPragmaUsingStatement(testECDb0)).deep.equals([
225
228
  {
@@ -244,6 +247,7 @@ describe("ECDb", () => {
244
247
  profile: "ECDb"
245
248
  },
246
249
  ]);
250
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
247
251
  expect(() => testECDb0.withPreparedStatement("SELECT Name, Age FROM source.test.Person", () => { })).to.throw("ECClass 'source.test.Person' does not exist or could not be loaded.");
248
252
  const testECDb1 = __addDisposableResource(env_8, ECDbTestHelper.createECDb(outDir, "file4.ecdb"), false);
249
253
  testECDb1.attachDb(ecdbPath1, "source");
@@ -303,6 +307,7 @@ describe("ECDb", () => {
303
307
  </ECEntityClass>
304
308
  </ECSchema>`), false);
305
309
  assert.isTrue(testECDb.isOpen);
310
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
306
311
  testECDb.withPreparedStatement("INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)", (stmt) => {
307
312
  const res = stmt.stepForInsert();
308
313
  assert.equal(res.status, DbResult.BE_SQLITE_DONE);
@@ -312,6 +317,7 @@ describe("ECDb", () => {
312
317
  });
313
318
  testECDb.saveChanges();
314
319
  const runDbListPragma = (ecdb) => {
320
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
315
321
  return ecdb.withPreparedStatement("PRAGMA db_list", (stmt) => {
316
322
  const result = [];
317
323
  while (stmt.step() === DbResult.BE_SQLITE_ROW) {
@@ -322,6 +328,7 @@ describe("ECDb", () => {
322
328
  };
323
329
  const testECDb0 = __addDisposableResource(env_9, ECDbTestHelper.createECDb(outDir, "file2.ecdb"), false);
324
330
  testECDb0.attachDb(ecdbPath1, "source");
331
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
325
332
  testECDb0.withPreparedStatement("SELECT Name, Age FROM source.test.Person", (stmt) => {
326
333
  assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);
327
334
  const row = stmt.getRow();
@@ -351,6 +358,7 @@ describe("ECDb", () => {
351
358
  profile: "ECDb"
352
359
  },
353
360
  ]);
361
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
354
362
  expect(() => testECDb0.withPreparedStatement("SELECT Name, Age FROM source.test.Person", () => { })).to.throw("ECClass 'source.test.Person' does not exist or could not be loaded.");
355
363
  const testECDb1 = __addDisposableResource(env_9, ECDbTestHelper.createECDb(outDir, "file3.ecdb"), false);
356
364
  testECDb1.attachDb(ecdbPath1, "source");
@@ -403,7 +411,7 @@ describe("ECDb", () => {
403
411
  </ECEntityClass>
404
412
  </ECSchema>`), false);
405
413
  assert.isTrue(testECDb.isOpen);
406
- id = testECDb.withPreparedStatement("INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)", (stmt) => {
414
+ id = testECDb.withCachedWriteStatement("INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)", (stmt) => {
407
415
  const res = stmt.stepForInsert();
408
416
  assert.equal(res.status, DbResult.BE_SQLITE_DONE);
409
417
  assert.isDefined(res.id);
@@ -423,6 +431,7 @@ describe("ECDb", () => {
423
431
  const ecdb = __addDisposableResource(env_10, new ECDb(), false);
424
432
  ecdb.openDb(ecdbPath, ECDbOpenMode.Readonly);
425
433
  assert.isTrue(ecdb.isOpen);
434
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
426
435
  ecdb.withPreparedStatement("SELECT Name, Age FROM test.Person WHERE ECInstanceId=?", (stmt) => {
427
436
  stmt.bindId(1, id);
428
437
  assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);
@@ -571,6 +580,7 @@ describe("ECDb", () => {
571
580
  ecdb.saveChanges();
572
581
  const expectedLabels = [undefined, "m", "", "mm"];
573
582
  let index = 0;
583
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
574
584
  ecdb.withStatement("select label from meta.FormatCompositeUnitDef where Format.Id=0x1", (stmt) => {
575
585
  for (let i = 1; i <= 4; i++) {
576
586
  assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);
@@ -596,6 +606,7 @@ describe("ECDb", () => {
596
606
  ecdb.saveChanges();
597
607
  const expectedLabelsUpdated = ["", "m", undefined, "mm"];
598
608
  index = 0;
609
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
599
610
  ecdb.withStatement("select label from meta.FormatCompositeUnitDef where Format.Id=0x1", (stmt) => {
600
611
  for (let i = 1; i <= 4; i++) {
601
612
  assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);
@@ -1 +1 @@
1
- {"version":3,"file":"ECDb.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECDb.test.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*--------------------------------------------------------------------------------------------*/\nimport { assert, expect } from \"chai\";\nimport * as path from \"path\";\nimport * as sinon from \"sinon\";\nimport { DbResult, Id64, Id64String, Logger } from \"@itwin/core-bentley\";\nimport { ECDb, ECDbOpenMode, ECSqlInsertResult, ECSqlStatement, IModelJsFs, SqliteStatement, SqliteValue, SqliteValueType } from \"../../core-backend\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { ECDbTestHelper } from \"./ECDbTestHelper\";\nimport { QueryOptionsBuilder } from \"@itwin/core-common\";\n\ndescribe(\"ECDb\", () => {\n const outDir = KnownTestLocations.outputDir;\n\n it(\"should be able to create a new ECDb\", () => {\n using ecdb = ECDbTestHelper.createECDb(outDir, \"create.ecdb\");\n assert.isTrue(ecdb.isOpen);\n });\n\n it(\"should be able to close an ECDb\", () => {\n const ecdb: ECDb = ECDbTestHelper.createECDb(outDir, \"close.ecdb\");\n assert.isTrue(ecdb.isOpen);\n ecdb.closeDb();\n assert.isFalse(ecdb.isOpen);\n });\n\n it(\"should be able to open an ECDb\", () => {\n const fileName = \"open.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName);\n assert.isTrue(testECDb.isOpen);\n }\n\n using ecdb = new ECDb();\n ecdb.openDb(ecdbPath, ECDbOpenMode.ReadWrite);\n assert.isTrue(ecdb.isOpen);\n });\n\n it(\"Open ECDb with upgrade option\", () => {\n const fileName = \"open.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName);\n assert.isTrue(testECDb.isOpen);\n }\n {\n using ecdb = new ECDb();\n assert.doesNotThrow(() => ecdb.openDb(ecdbPath, ECDbOpenMode.Readonly));\n }\n {\n using ecdb = new ECDb();\n assert.doesNotThrow(() => ecdb.openDb(ecdbPath, ECDbOpenMode.ReadWrite));\n }\n {\n using ecdb = new ECDb();\n assert.doesNotThrow(() => ecdb.openDb(ecdbPath, ECDbOpenMode.FileUpgrade));\n }\n\n });\n it(\"attach/detach newer profile version\", async () => {\n const fileName1 = \"source_file.ecdb\";\n const ecdbPath1: string = path.join(outDir, fileName1);\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName1,\n `<ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n assert.isTrue(testECDb.isOpen);\n testECDb.withPreparedStatement(\"INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)\", (stmt: ECSqlStatement) => {\n const res: ECSqlInsertResult = stmt.stepForInsert();\n assert.equal(res.status, DbResult.BE_SQLITE_DONE);\n assert.isDefined(res.id);\n assert.isTrue(Id64.isValidId64(res.id!));\n return res.id!;\n });\n\n // override profile version to 55.0.0 which is currently not supported\n testECDb.withSqliteStatement(`\n UPDATE be_Prop SET\n StrData = '{\"major\":55,\"minor\":0,\"sub1\":0,\"sub2\":0}'\n WHERE Namespace = 'ec_Db' AND Name = 'SchemaVersion'`,\n (stmt: SqliteStatement) => { stmt.step(); });\n testECDb.saveChanges();\n\n const runDbListPragmaUsingStatement = (ecdb: ECDb) => {\n return ecdb.withPreparedStatement(\"PRAGMA db_list\", (stmt: ECSqlStatement) => {\n const result: { alias: string, filename: string, profile: string }[] = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n result.push(stmt.getRow());\n }\n return result;\n });\n }\n const runDbListPragmaCCQ = async (ecdb: ECDb) => {\n const reader = ecdb.createQueryReader(\"PRAGMA db_list\");\n const result: { alias: string, filename: string, profile: string }[] = [];\n while (await reader.step()) {\n result.push(reader.current.toRow());\n }\n return result;\n }\n using testECDb0 = ECDbTestHelper.createECDb(outDir, \"file2.ecdb\");\n // following call will not fail but unknow ECDb profile will cause it to be attach as SQLite.\n testECDb0.attachDb(ecdbPath1, \"source\");\n expect(() => testECDb0.withPreparedStatement(\"SELECT Name, Age FROM source.test.Person\", () => { })).to.throw(\"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n expect(runDbListPragmaUsingStatement(testECDb0)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file2.ecdb\"),\n profile: \"ECDb\"\n },\n {\n sno: 1,\n alias: \"source\",\n fileName: path.join(outDir, \"source_file.ecdb\"),\n profile: \"SQLite\"\n }\n ]);\n testECDb0.detachDb(\"source\");\n expect(runDbListPragmaUsingStatement(testECDb0)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file2.ecdb\"),\n profile: \"ECDb\"\n },\n ]);\n expect(() => testECDb0.withPreparedStatement(\"SELECT Name, Age FROM source.test.Person\", () => { })).to.throw(\"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n\n using testECDb1 = ECDbTestHelper.createECDb(outDir, \"file4.ecdb\");\n testECDb1.attachDb(ecdbPath1, \"source\");\n const reader1 = testECDb1.createQueryReader(\"SELECT Name, Age FROM source.test.Person\");\n let expectThrow = false;\n try {\n await reader1.step();\n } catch (err) {\n if (err instanceof Error) {\n assert.equal(err.message, \"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n expectThrow = true;\n }\n }\n assert.isTrue(expectThrow);\n expect(await runDbListPragmaCCQ(testECDb1)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file4.ecdb\"),\n profile: \"ECDb\"\n },\n {\n sno: 1,\n alias: \"source\",\n fileName: path.join(outDir, \"source_file.ecdb\"),\n profile: \"SQLite\"\n }\n ]);\n testECDb1.detachDb(\"source\");\n expect(await runDbListPragmaCCQ(testECDb1)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file4.ecdb\"),\n profile: \"ECDb\"\n },\n ]);\n });\n it(\"attach/detach file & db_list pragma\", async () => {\n const fileName1 = \"source_file.ecdb\";\n const ecdbPath1: string = path.join(outDir, fileName1);\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName1,\n `<ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n assert.isTrue(testECDb.isOpen);\n testECDb.withPreparedStatement(\"INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)\", (stmt: ECSqlStatement) => {\n const res: ECSqlInsertResult = stmt.stepForInsert();\n assert.equal(res.status, DbResult.BE_SQLITE_DONE);\n assert.isDefined(res.id);\n assert.isTrue(Id64.isValidId64(res.id!));\n return res.id!;\n });\n testECDb.saveChanges();\n\n const runDbListPragma = (ecdb: ECDb) => {\n return ecdb.withPreparedStatement(\"PRAGMA db_list\", (stmt: ECSqlStatement) => {\n const result: { alias: string, filename: string, profile: string }[] = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n result.push(stmt.getRow());\n }\n return result;\n });\n }\n using testECDb0 = ECDbTestHelper.createECDb(outDir, \"file2.ecdb\");\n testECDb0.attachDb(ecdbPath1, \"source\");\n testECDb0.withPreparedStatement(\"SELECT Name, Age FROM source.test.Person\", (stmt: ECSqlStatement) => {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n const row = stmt.getRow();\n assert.equal(row.name, \"Mary\");\n assert.equal(row.age, 45);\n });\n expect(runDbListPragma(testECDb0)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file2.ecdb\"),\n profile: \"ECDb\"\n },\n {\n sno: 1,\n alias: \"source\",\n fileName: path.join(outDir, \"source_file.ecdb\"),\n profile: \"ECDb\"\n }\n ]);\n testECDb0.detachDb(\"source\");\n expect(runDbListPragma(testECDb0)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file2.ecdb\"),\n profile: \"ECDb\"\n },\n ]);\n expect(() => testECDb0.withPreparedStatement(\"SELECT Name, Age FROM source.test.Person\", () => { })).to.throw(\"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n\n using testECDb1 = ECDbTestHelper.createECDb(outDir, \"file3.ecdb\");\n testECDb1.attachDb(ecdbPath1, \"source\");\n const reader1 = testECDb1.createQueryReader(\"SELECT Name, Age FROM source.test.Person\", undefined, new QueryOptionsBuilder().setUsePrimaryConnection(true).getOptions());\n assert.equal(await reader1.step(), true);\n assert.equal(reader1.current.name, \"Mary\");\n assert.equal(reader1.current.age, 45);\n testECDb1.detachDb(\"source\");\n\n\n using testECDb2 = ECDbTestHelper.createECDb(outDir, \"file4.ecdb\");\n testECDb2.attachDb(ecdbPath1, \"source\");\n const reader2 = testECDb2.createQueryReader(\"SELECT Name, Age FROM source.test.Person\");\n assert.equal(await reader2.step(), true);\n assert.equal(reader2.current.name, \"Mary\");\n assert.equal(reader2.current.age, 45);\n testECDb2.detachDb(\"source\");\n const reader3 = testECDb2.createQueryReader(\"SELECT Name, Age FROM source.test.Person\");\n let expectThrow = false;\n try {\n await reader3.step();\n } catch (err) {\n if (err instanceof Error) {\n assert.equal(err.message, \"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n expectThrow = true;\n }\n }\n assert.isTrue(expectThrow);\n });\n it(\"should be able to import a schema\", () => {\n const fileName = \"schemaimport.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n let id: Id64String;\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName,\n `<ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n assert.isTrue(testECDb.isOpen);\n id = testECDb.withPreparedStatement(\"INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)\", (stmt: ECSqlStatement) => {\n const res: ECSqlInsertResult = stmt.stepForInsert();\n assert.equal(res.status, DbResult.BE_SQLITE_DONE);\n assert.isDefined(res.id);\n assert.isTrue(Id64.isValidId64(res.id!));\n return res.id!;\n });\n testECDb.saveChanges();\n }\n\n using ecdb = new ECDb();\n ecdb.openDb(ecdbPath, ECDbOpenMode.Readonly);\n assert.isTrue(ecdb.isOpen);\n\n ecdb.withPreparedStatement(\"SELECT Name, Age FROM test.Person WHERE ECInstanceId=?\", (stmt: ECSqlStatement) => {\n stmt.bindId(1, id);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n const row = stmt.getRow();\n assert.equal(row.name, \"Mary\");\n assert.equal(row.age, 45);\n });\n });\n\n it(\"should be able to get schema props\", () => {\n const fileName = \"schema-props.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName);\n assert.isTrue(testECDb.isOpen);\n }\n using ecdb = new ECDb();\n ecdb.openDb(ecdbPath);\n const schema = ecdb.getSchemaProps(\"ECDbMeta\");\n assert.equal(schema.name, \"ECDbMeta\");\n });\n\n it(\"Run plain SQL\", () => {\n const fileName = \"plainseql.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName);\n assert.isTrue(testECDb.isOpen);\n\n testECDb.withPreparedSqliteStatement(\"CREATE TABLE Test(Id INTEGER PRIMARY KEY, Name TEXT NOT NULL, Code INTEGER)\", (stmt: SqliteStatement) => {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\n stmt.bindValue(1, \"Dummy 1\");\n stmt.bindValue(2, 100);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\n stmt.bindValues([\"Dummy 2\", 200]);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\n stmt.bindValue(\":p1\", \"Dummy 3\");\n stmt.bindValue(\":p2\", 300);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\n stmt.bindValues({ \":p1\": \"Dummy 4\", \":p2\": 400 });\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.saveChanges();\n }\n\n using ecdb = new ECDb();\n ecdb.openDb(ecdbPath, ECDbOpenMode.Readonly);\n assert.isTrue(ecdb.isOpen);\n\n ecdb.withPreparedSqliteStatement(\"SELECT Id,Name,Code FROM Test ORDER BY Id\", (stmt: SqliteStatement) => {\n for (let i: number = 1; i <= 4; i++) {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n assert.equal(stmt.getColumnCount(), 3);\n const val0: SqliteValue = stmt.getValue(0);\n assert.equal(val0.columnName, \"Id\");\n assert.equal(val0.type, SqliteValueType.Integer);\n assert.isFalse(val0.isNull);\n assert.equal(val0.getInteger(), i);\n\n const val1: SqliteValue = stmt.getValue(1);\n assert.equal(val1.columnName, \"Name\");\n assert.equal(val1.type, SqliteValueType.String);\n assert.isFalse(val1.isNull);\n assert.equal(val1.getString(), `Dummy ${i}`);\n\n const val2: SqliteValue = stmt.getValue(2);\n assert.equal(val2.columnName, \"Code\");\n assert.equal(val2.type, SqliteValueType.Integer);\n assert.isFalse(val2.isNull);\n assert.equal(val2.getInteger(), i * 100);\n\n const row: any = stmt.getRow();\n assert.equal(row.id, i);\n assert.equal(row.name, `Dummy ${i}`);\n assert.equal(row.code, i * 100);\n }\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n });\n\n it(\"test unit labels in composite formats\", () => {\n const ecdb: ECDb = ECDbTestHelper.createECDb(outDir, \"TestCompositeFormats.ecdb\");\n const xmlpathOriginal = path.join(outDir, \"compositeFormats1.ecschema.xml\");\n\n IModelJsFs.writeFileSync(xmlpathOriginal, `<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n <ECSchema schemaName=\"TestCompositeFormats\" alias=\"tcf\" version=\"1.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"Units\" version=\"01.00.00\" alias=\"u\" />\n <Unit typeName=\"TestUnit\" displayLabel=\"Test Unit\" definition=\"u:M\" numerator=\"1.0\" phenomenon=\"u:LENGTH\" unitSystem=\"u:METRIC\" />\n <Format typeName=\"TestFormat\" displayLabel=\"TestFormat\" roundFactor=\"0.3\" type=\"Fractional\" showSignOption=\"OnlyNegative\" formatTraits=\"TrailZeroes|KeepSingleZero\" precision=\"4\" decimalSeparator=\".\" thousandSeparator=\",\" uomSeparator=\" \">\n <Composite>\n <Unit>u:KM</Unit>\n <Unit label=\"m\">TestUnit</Unit>\n <Unit label=\"\">u:CM</Unit>\n <Unit label=\"mm\">u:MM</Unit>\n </Composite>\n </Format>\n <KindOfQuantity typeName=\"TestKOQ2\" description=\"Test KOQ2\" displayLabel=\"TestKOQ2\" persistenceUnit=\"u:M\" presentationUnits=\"TestFormat\" relativeError=\"10e-3\" />\n </ECSchema>`);\n ecdb.importSchema(xmlpathOriginal);\n ecdb.saveChanges();\n\n const expectedLabels = [undefined, \"m\", \"\", \"mm\"];\n let index = 0;\n ecdb.withStatement(\"select label from meta.FormatCompositeUnitDef where Format.Id=0x1\", (stmt: ECSqlStatement) => {\n for (let i: number = 1; i <= 4; i++) {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n expect(stmt.getRow().label).to.eql(expectedLabels[index++]);\n }\n });\n\n const xmlpathUpdated = path.join(outDir, \"compositeFormats2.ecschema.xml\");\n IModelJsFs.writeFileSync(xmlpathUpdated, `<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n <ECSchema schemaName=\"TestCompositeFormats\" alias=\"tcf\" version=\"1.0.1\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"Units\" version=\"01.00.00\" alias=\"u\" />\n <Unit typeName=\"TestUnit\" displayLabel=\"Test Unit\" definition=\"u:M\" numerator=\"1.0\" phenomenon=\"u:LENGTH\" unitSystem=\"u:METRIC\" />\n <Format typeName=\"TestFormat\" displayLabel=\"TestFormat\" roundFactor=\"0.3\" type=\"Fractional\" showSignOption=\"OnlyNegative\" formatTraits=\"TrailZeroes|KeepSingleZero\" precision=\"4\" decimalSeparator=\".\" thousandSeparator=\",\" uomSeparator=\" \">\n <Composite spacer=\"=\" includeZero=\"False\">\n <Unit label=\"\">u:KM</Unit>\n <Unit label=\"m\">TestUnit</Unit>\n <Unit>u:CM</Unit>\n <Unit label=\"mm\">u:MM</Unit>\n </Composite>\n </Format>\n <KindOfQuantity typeName=\"TestKOQ2\" description=\"Test KOQ2\" displayLabel=\"TestKOQ2\" persistenceUnit=\"u:M\" presentationUnits=\"TestFormat\" relativeError=\"10e-3\" />\n </ECSchema>`);\n\n ecdb.importSchema(xmlpathUpdated);\n ecdb.saveChanges();\n\n const expectedLabelsUpdated = [\"\", \"m\", undefined, \"mm\"];\n index = 0;\n ecdb.withStatement(\"select label from meta.FormatCompositeUnitDef where Format.Id=0x1\", (stmt: ECSqlStatement) => {\n for (let i: number = 1; i <= 4; i++) {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n expect(stmt.getRow().label).to.eql(expectedLabelsUpdated[index++]);\n }\n });\n\n ecdb.closeDb();\n });\n\n it(\"should make importSchema fail if new schema changes are observed without version bump\", () => {\n const ecdb: ECDb = ECDbTestHelper.createECDb(outDir, \"importSchemaNoVersionBump.ecdb\");\n const xmlpathOriginal = path.join(outDir, \"importSchemaNoVersionBump1.ecschema.xml\");\n\n IModelJsFs.writeFileSync(xmlpathOriginal, `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n ecdb.importSchema(xmlpathOriginal);\n ecdb.saveChanges();\n\n const xmlpathUpdated = path.join(outDir, \"importSchemaNoVersionBump2.ecschema.xml\");\n IModelJsFs.writeFileSync(xmlpathUpdated, `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n <ECProperty propertyName=\"Height\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n\n let calledCategory = \"\";\n let calledMessage = \"\";\n const stubbedLogError = sinon.stub(Logger, \"logError\").callsFake((category: string, message: string) => {\n calledCategory = category;\n calledMessage = message;\n });\n\n // although an error should be logged, no error is actually returned to not disrupt currently existing workflows and to alert the user about some wrong/unexpected behavior\n expect(ecdb.importSchema(xmlpathUpdated)).to.not.throw;\n expect(calledCategory).to.equal(\"ECDb\");\n expect(calledMessage).to.equal(\"ECSchema import has failed. Schema Test has new changes, but the schema version is not incremented.\");\n\n stubbedLogError.restore();\n ecdb.closeDb();\n });\n});\n"]}
1
+ {"version":3,"file":"ECDb.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECDb.test.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*--------------------------------------------------------------------------------------------*/\nimport { assert, expect } from \"chai\";\nimport * as path from \"path\";\nimport * as sinon from \"sinon\";\nimport { DbResult, Id64, Id64String, Logger } from \"@itwin/core-bentley\";\nimport { ECDb, ECDbOpenMode, ECSqlInsertResult, ECSqlStatement, ECSqlWriteStatement, IModelJsFs, SqliteStatement, SqliteValue, SqliteValueType } from \"../../core-backend\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { ECDbTestHelper } from \"./ECDbTestHelper\";\nimport { QueryOptionsBuilder } from \"@itwin/core-common\";\n\ndescribe(\"ECDb\", () => {\n const outDir = KnownTestLocations.outputDir;\n\n it(\"should be able to create a new ECDb\", () => {\n using ecdb = ECDbTestHelper.createECDb(outDir, \"create.ecdb\");\n assert.isTrue(ecdb.isOpen);\n });\n\n it(\"should be able to close an ECDb\", () => {\n const ecdb: ECDb = ECDbTestHelper.createECDb(outDir, \"close.ecdb\");\n assert.isTrue(ecdb.isOpen);\n ecdb.closeDb();\n assert.isFalse(ecdb.isOpen);\n });\n\n it(\"should be able to open an ECDb\", () => {\n const fileName = \"open.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName);\n assert.isTrue(testECDb.isOpen);\n }\n\n using ecdb = new ECDb();\n ecdb.openDb(ecdbPath, ECDbOpenMode.ReadWrite);\n assert.isTrue(ecdb.isOpen);\n });\n\n it(\"Open ECDb with upgrade option\", () => {\n const fileName = \"open.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName);\n assert.isTrue(testECDb.isOpen);\n }\n {\n using ecdb = new ECDb();\n assert.doesNotThrow(() => ecdb.openDb(ecdbPath, ECDbOpenMode.Readonly));\n }\n {\n using ecdb = new ECDb();\n assert.doesNotThrow(() => ecdb.openDb(ecdbPath, ECDbOpenMode.ReadWrite));\n }\n {\n using ecdb = new ECDb();\n assert.doesNotThrow(() => ecdb.openDb(ecdbPath, ECDbOpenMode.FileUpgrade));\n }\n\n });\n it(\"attach/detach newer profile version\", async () => {\n const fileName1 = \"source_file.ecdb\";\n const ecdbPath1: string = path.join(outDir, fileName1);\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName1,\n `<ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n assert.isTrue(testECDb.isOpen);\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n testECDb.withPreparedStatement(\"INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)\", (stmt: ECSqlStatement) => {\n const res: ECSqlInsertResult = stmt.stepForInsert();\n assert.equal(res.status, DbResult.BE_SQLITE_DONE);\n assert.isDefined(res.id);\n assert.isTrue(Id64.isValidId64(res.id!));\n return res.id!;\n });\n\n // override profile version to 55.0.0 which is currently not supported\n testECDb.withSqliteStatement(`\n UPDATE be_Prop SET\n StrData = '{\"major\":55,\"minor\":0,\"sub1\":0,\"sub2\":0}'\n WHERE Namespace = 'ec_Db' AND Name = 'SchemaVersion'`,\n (stmt: SqliteStatement) => { stmt.step(); });\n testECDb.saveChanges();\n\n const runDbListPragmaUsingStatement = (ecdb: ECDb) => {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return ecdb.withPreparedStatement(\"PRAGMA db_list\", (stmt: ECSqlStatement) => {\n const result: { alias: string, filename: string, profile: string }[] = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n result.push(stmt.getRow());\n }\n return result;\n });\n }\n const runDbListPragmaCCQ = async (ecdb: ECDb) => {\n const reader = ecdb.createQueryReader(\"PRAGMA db_list\");\n const result: { alias: string, filename: string, profile: string }[] = [];\n while (await reader.step()) {\n result.push(reader.current.toRow());\n }\n return result;\n }\n using testECDb0 = ECDbTestHelper.createECDb(outDir, \"file2.ecdb\");\n // following call will not fail but unknow ECDb profile will cause it to be attach as SQLite.\n testECDb0.attachDb(ecdbPath1, \"source\");\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n expect(() => testECDb0.withPreparedStatement(\"SELECT Name, Age FROM source.test.Person\", () => { })).to.throw(\"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n expect(runDbListPragmaUsingStatement(testECDb0)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file2.ecdb\"),\n profile: \"ECDb\"\n },\n {\n sno: 1,\n alias: \"source\",\n fileName: path.join(outDir, \"source_file.ecdb\"),\n profile: \"SQLite\"\n }\n ]);\n testECDb0.detachDb(\"source\");\n expect(runDbListPragmaUsingStatement(testECDb0)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file2.ecdb\"),\n profile: \"ECDb\"\n },\n ]);\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n expect(() => testECDb0.withPreparedStatement(\"SELECT Name, Age FROM source.test.Person\", () => { })).to.throw(\"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n\n using testECDb1 = ECDbTestHelper.createECDb(outDir, \"file4.ecdb\");\n testECDb1.attachDb(ecdbPath1, \"source\");\n const reader1 = testECDb1.createQueryReader(\"SELECT Name, Age FROM source.test.Person\");\n let expectThrow = false;\n try {\n await reader1.step();\n } catch (err) {\n if (err instanceof Error) {\n assert.equal(err.message, \"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n expectThrow = true;\n }\n }\n assert.isTrue(expectThrow);\n expect(await runDbListPragmaCCQ(testECDb1)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file4.ecdb\"),\n profile: \"ECDb\"\n },\n {\n sno: 1,\n alias: \"source\",\n fileName: path.join(outDir, \"source_file.ecdb\"),\n profile: \"SQLite\"\n }\n ]);\n testECDb1.detachDb(\"source\");\n expect(await runDbListPragmaCCQ(testECDb1)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file4.ecdb\"),\n profile: \"ECDb\"\n },\n ]);\n });\n it(\"attach/detach file & db_list pragma\", async () => {\n const fileName1 = \"source_file.ecdb\";\n const ecdbPath1: string = path.join(outDir, fileName1);\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName1,\n `<ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n assert.isTrue(testECDb.isOpen);\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n testECDb.withPreparedStatement(\"INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)\", (stmt: ECSqlStatement) => {\n const res: ECSqlInsertResult = stmt.stepForInsert();\n assert.equal(res.status, DbResult.BE_SQLITE_DONE);\n assert.isDefined(res.id);\n assert.isTrue(Id64.isValidId64(res.id!));\n return res.id!;\n });\n testECDb.saveChanges();\n\n const runDbListPragma = (ecdb: ECDb) => {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return ecdb.withPreparedStatement(\"PRAGMA db_list\", (stmt: ECSqlStatement) => {\n const result: { alias: string, filename: string, profile: string }[] = [];\n while (stmt.step() === DbResult.BE_SQLITE_ROW) {\n result.push(stmt.getRow());\n }\n return result;\n });\n }\n using testECDb0 = ECDbTestHelper.createECDb(outDir, \"file2.ecdb\");\n testECDb0.attachDb(ecdbPath1, \"source\");\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n testECDb0.withPreparedStatement(\"SELECT Name, Age FROM source.test.Person\", (stmt: ECSqlStatement) => {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n const row = stmt.getRow();\n assert.equal(row.name, \"Mary\");\n assert.equal(row.age, 45);\n });\n expect(runDbListPragma(testECDb0)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file2.ecdb\"),\n profile: \"ECDb\"\n },\n {\n sno: 1,\n alias: \"source\",\n fileName: path.join(outDir, \"source_file.ecdb\"),\n profile: \"ECDb\"\n }\n ]);\n testECDb0.detachDb(\"source\");\n expect(runDbListPragma(testECDb0)).deep.equals([\n {\n sno: 0,\n alias: \"main\",\n fileName: path.join(outDir, \"file2.ecdb\"),\n profile: \"ECDb\"\n },\n ]);\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n expect(() => testECDb0.withPreparedStatement(\"SELECT Name, Age FROM source.test.Person\", () => { })).to.throw(\"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n\n using testECDb1 = ECDbTestHelper.createECDb(outDir, \"file3.ecdb\");\n testECDb1.attachDb(ecdbPath1, \"source\");\n const reader1 = testECDb1.createQueryReader(\"SELECT Name, Age FROM source.test.Person\", undefined, new QueryOptionsBuilder().setUsePrimaryConnection(true).getOptions());\n assert.equal(await reader1.step(), true);\n assert.equal(reader1.current.name, \"Mary\");\n assert.equal(reader1.current.age, 45);\n testECDb1.detachDb(\"source\");\n\n\n using testECDb2 = ECDbTestHelper.createECDb(outDir, \"file4.ecdb\");\n testECDb2.attachDb(ecdbPath1, \"source\");\n const reader2 = testECDb2.createQueryReader(\"SELECT Name, Age FROM source.test.Person\");\n assert.equal(await reader2.step(), true);\n assert.equal(reader2.current.name, \"Mary\");\n assert.equal(reader2.current.age, 45);\n testECDb2.detachDb(\"source\");\n const reader3 = testECDb2.createQueryReader(\"SELECT Name, Age FROM source.test.Person\");\n let expectThrow = false;\n try {\n await reader3.step();\n } catch (err) {\n if (err instanceof Error) {\n assert.equal(err.message, \"ECClass 'source.test.Person' does not exist or could not be loaded.\");\n expectThrow = true;\n }\n }\n assert.isTrue(expectThrow);\n });\n it(\"should be able to import a schema\", () => {\n const fileName = \"schemaimport.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n let id: Id64String;\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName,\n `<ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.1\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n assert.isTrue(testECDb.isOpen);\n id = testECDb.withCachedWriteStatement(\"INSERT INTO test.Person(Name,Age) VALUES('Mary', 45)\", (stmt: ECSqlWriteStatement) => {\n const res: ECSqlInsertResult = stmt.stepForInsert();\n assert.equal(res.status, DbResult.BE_SQLITE_DONE);\n assert.isDefined(res.id);\n assert.isTrue(Id64.isValidId64(res.id!));\n return res.id!;\n });\n testECDb.saveChanges();\n }\n\n using ecdb = new ECDb();\n ecdb.openDb(ecdbPath, ECDbOpenMode.Readonly);\n assert.isTrue(ecdb.isOpen);\n\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n ecdb.withPreparedStatement(\"SELECT Name, Age FROM test.Person WHERE ECInstanceId=?\", (stmt: ECSqlStatement) => {\n stmt.bindId(1, id);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n const row = stmt.getRow();\n assert.equal(row.name, \"Mary\");\n assert.equal(row.age, 45);\n });\n });\n\n it(\"should be able to get schema props\", () => {\n const fileName = \"schema-props.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName);\n assert.isTrue(testECDb.isOpen);\n }\n using ecdb = new ECDb();\n ecdb.openDb(ecdbPath);\n const schema = ecdb.getSchemaProps(\"ECDbMeta\");\n assert.equal(schema.name, \"ECDbMeta\");\n });\n\n it(\"Run plain SQL\", () => {\n const fileName = \"plainseql.ecdb\";\n const ecdbPath: string = path.join(outDir, fileName);\n {\n using testECDb = ECDbTestHelper.createECDb(outDir, fileName);\n assert.isTrue(testECDb.isOpen);\n\n testECDb.withPreparedSqliteStatement(\"CREATE TABLE Test(Id INTEGER PRIMARY KEY, Name TEXT NOT NULL, Code INTEGER)\", (stmt: SqliteStatement) => {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\n stmt.bindValue(1, \"Dummy 1\");\n stmt.bindValue(2, 100);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(?,?)\", (stmt: SqliteStatement) => {\n stmt.bindValues([\"Dummy 2\", 200]);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\n stmt.bindValue(\":p1\", \"Dummy 3\");\n stmt.bindValue(\":p2\", 300);\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.withPreparedSqliteStatement(\"INSERT INTO Test(Name,Code) VALUES(:p1,:p2)\", (stmt: SqliteStatement) => {\n stmt.bindValues({ \":p1\": \"Dummy 4\", \":p2\": 400 });\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n\n testECDb.saveChanges();\n }\n\n using ecdb = new ECDb();\n ecdb.openDb(ecdbPath, ECDbOpenMode.Readonly);\n assert.isTrue(ecdb.isOpen);\n\n ecdb.withPreparedSqliteStatement(\"SELECT Id,Name,Code FROM Test ORDER BY Id\", (stmt: SqliteStatement) => {\n for (let i: number = 1; i <= 4; i++) {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n assert.equal(stmt.getColumnCount(), 3);\n const val0: SqliteValue = stmt.getValue(0);\n assert.equal(val0.columnName, \"Id\");\n assert.equal(val0.type, SqliteValueType.Integer);\n assert.isFalse(val0.isNull);\n assert.equal(val0.getInteger(), i);\n\n const val1: SqliteValue = stmt.getValue(1);\n assert.equal(val1.columnName, \"Name\");\n assert.equal(val1.type, SqliteValueType.String);\n assert.isFalse(val1.isNull);\n assert.equal(val1.getString(), `Dummy ${i}`);\n\n const val2: SqliteValue = stmt.getValue(2);\n assert.equal(val2.columnName, \"Code\");\n assert.equal(val2.type, SqliteValueType.Integer);\n assert.isFalse(val2.isNull);\n assert.equal(val2.getInteger(), i * 100);\n\n const row: any = stmt.getRow();\n assert.equal(row.id, i);\n assert.equal(row.name, `Dummy ${i}`);\n assert.equal(row.code, i * 100);\n }\n assert.equal(stmt.step(), DbResult.BE_SQLITE_DONE);\n });\n });\n\n it(\"test unit labels in composite formats\", () => {\n const ecdb: ECDb = ECDbTestHelper.createECDb(outDir, \"TestCompositeFormats.ecdb\");\n const xmlpathOriginal = path.join(outDir, \"compositeFormats1.ecschema.xml\");\n\n IModelJsFs.writeFileSync(xmlpathOriginal, `<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n <ECSchema schemaName=\"TestCompositeFormats\" alias=\"tcf\" version=\"1.0.0\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"Units\" version=\"01.00.00\" alias=\"u\" />\n <Unit typeName=\"TestUnit\" displayLabel=\"Test Unit\" definition=\"u:M\" numerator=\"1.0\" phenomenon=\"u:LENGTH\" unitSystem=\"u:METRIC\" />\n <Format typeName=\"TestFormat\" displayLabel=\"TestFormat\" roundFactor=\"0.3\" type=\"Fractional\" showSignOption=\"OnlyNegative\" formatTraits=\"TrailZeroes|KeepSingleZero\" precision=\"4\" decimalSeparator=\".\" thousandSeparator=\",\" uomSeparator=\" \">\n <Composite>\n <Unit>u:KM</Unit>\n <Unit label=\"m\">TestUnit</Unit>\n <Unit label=\"\">u:CM</Unit>\n <Unit label=\"mm\">u:MM</Unit>\n </Composite>\n </Format>\n <KindOfQuantity typeName=\"TestKOQ2\" description=\"Test KOQ2\" displayLabel=\"TestKOQ2\" persistenceUnit=\"u:M\" presentationUnits=\"TestFormat\" relativeError=\"10e-3\" />\n </ECSchema>`);\n ecdb.importSchema(xmlpathOriginal);\n ecdb.saveChanges();\n\n const expectedLabels = [undefined, \"m\", \"\", \"mm\"];\n let index = 0;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n ecdb.withStatement(\"select label from meta.FormatCompositeUnitDef where Format.Id=0x1\", (stmt: ECSqlStatement) => {\n for (let i: number = 1; i <= 4; i++) {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n expect(stmt.getRow().label).to.eql(expectedLabels[index++]);\n }\n });\n\n const xmlpathUpdated = path.join(outDir, \"compositeFormats2.ecschema.xml\");\n IModelJsFs.writeFileSync(xmlpathUpdated, `<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n <ECSchema schemaName=\"TestCompositeFormats\" alias=\"tcf\" version=\"1.0.1\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECSchemaReference name=\"Units\" version=\"01.00.00\" alias=\"u\" />\n <Unit typeName=\"TestUnit\" displayLabel=\"Test Unit\" definition=\"u:M\" numerator=\"1.0\" phenomenon=\"u:LENGTH\" unitSystem=\"u:METRIC\" />\n <Format typeName=\"TestFormat\" displayLabel=\"TestFormat\" roundFactor=\"0.3\" type=\"Fractional\" showSignOption=\"OnlyNegative\" formatTraits=\"TrailZeroes|KeepSingleZero\" precision=\"4\" decimalSeparator=\".\" thousandSeparator=\",\" uomSeparator=\" \">\n <Composite spacer=\"=\" includeZero=\"False\">\n <Unit label=\"\">u:KM</Unit>\n <Unit label=\"m\">TestUnit</Unit>\n <Unit>u:CM</Unit>\n <Unit label=\"mm\">u:MM</Unit>\n </Composite>\n </Format>\n <KindOfQuantity typeName=\"TestKOQ2\" description=\"Test KOQ2\" displayLabel=\"TestKOQ2\" persistenceUnit=\"u:M\" presentationUnits=\"TestFormat\" relativeError=\"10e-3\" />\n </ECSchema>`);\n\n ecdb.importSchema(xmlpathUpdated);\n ecdb.saveChanges();\n\n const expectedLabelsUpdated = [\"\", \"m\", undefined, \"mm\"];\n index = 0;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n ecdb.withStatement(\"select label from meta.FormatCompositeUnitDef where Format.Id=0x1\", (stmt: ECSqlStatement) => {\n for (let i: number = 1; i <= 4; i++) {\n assert.equal(stmt.step(), DbResult.BE_SQLITE_ROW);\n expect(stmt.getRow().label).to.eql(expectedLabelsUpdated[index++]);\n }\n });\n\n ecdb.closeDb();\n });\n\n it(\"should make importSchema fail if new schema changes are observed without version bump\", () => {\n const ecdb: ECDb = ECDbTestHelper.createECDb(outDir, \"importSchemaNoVersionBump.ecdb\");\n const xmlpathOriginal = path.join(outDir, \"importSchemaNoVersionBump1.ecschema.xml\");\n\n IModelJsFs.writeFileSync(xmlpathOriginal, `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n ecdb.importSchema(xmlpathOriginal);\n ecdb.saveChanges();\n\n const xmlpathUpdated = path.join(outDir, \"importSchemaNoVersionBump2.ecschema.xml\");\n IModelJsFs.writeFileSync(xmlpathUpdated, `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <ECSchema schemaName=\"Test\" alias=\"test\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECEntityClass typeName=\"Person\" modifier=\"Sealed\">\n <ECProperty propertyName=\"Name\" typeName=\"string\"/>\n <ECProperty propertyName=\"Age\" typeName=\"int\"/>\n <ECProperty propertyName=\"Height\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n\n let calledCategory = \"\";\n let calledMessage = \"\";\n const stubbedLogError = sinon.stub(Logger, \"logError\").callsFake((category: string, message: string) => {\n calledCategory = category;\n calledMessage = message;\n });\n\n // although an error should be logged, no error is actually returned to not disrupt currently existing workflows and to alert the user about some wrong/unexpected behavior\n expect(ecdb.importSchema(xmlpathUpdated)).to.not.throw;\n expect(calledCategory).to.equal(\"ECDb\");\n expect(calledMessage).to.equal(\"ECSchema import has failed. Schema Test has new changes, but the schema version is not incremented.\");\n\n stubbedLogError.restore();\n ecdb.closeDb();\n });\n});\n"]}
@@ -18,6 +18,7 @@ describe("ECSql Abstract Syntax Tree", () => {
18
18
  async function parseECSql(ecsql) {
19
19
  const parseTreeECSql = `PRAGMA PARSE_TREE("${ecsql}") ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`;
20
20
  if (true) {
21
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
21
22
  return ecdb.withPreparedStatement(parseTreeECSql, (stmt) => {
22
23
  if (DbResult.BE_SQLITE_ROW !== stmt.step()) {
23
24
  throw new Error("unable to get parse tree.");