@itwin/core-backend 4.0.0-dev.52 → 4.0.0-dev.54

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 (265) hide show
  1. package/lib/cjs/AliCloudStorageService.d.ts +23 -23
  2. package/lib/cjs/AliCloudStorageService.js +71 -71
  3. package/lib/cjs/AliCloudStorageService.js.map +1 -1
  4. package/lib/cjs/BackendHubAccess.d.ts +224 -224
  5. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  6. package/lib/cjs/BackendHubAccess.js +41 -41
  7. package/lib/cjs/BackendHubAccess.js.map +1 -1
  8. package/lib/cjs/BackendLoggerCategory.d.ts +90 -91
  9. package/lib/cjs/BackendLoggerCategory.d.ts.map +1 -1
  10. package/lib/cjs/BackendLoggerCategory.js +98 -99
  11. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  12. package/lib/cjs/BisCoreSchema.d.ts +21 -21
  13. package/lib/cjs/BisCoreSchema.js +60 -60
  14. package/lib/cjs/BisCoreSchema.js.map +1 -1
  15. package/lib/cjs/BriefcaseManager.d.ts +170 -170
  16. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  17. package/lib/cjs/BriefcaseManager.js +408 -408
  18. package/lib/cjs/BriefcaseManager.js.map +1 -1
  19. package/lib/cjs/Category.d.ts +153 -153
  20. package/lib/cjs/Category.js +243 -243
  21. package/lib/cjs/Category.js.map +1 -1
  22. package/lib/cjs/ChangeSummaryManager.d.ts +187 -187
  23. package/lib/cjs/ChangeSummaryManager.js +446 -446
  24. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  25. package/lib/cjs/ChangedElementsDb.d.ts +99 -99
  26. package/lib/cjs/ChangedElementsDb.js +165 -165
  27. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  28. package/lib/cjs/ChangedElementsManager.d.ts +39 -39
  29. package/lib/cjs/ChangedElementsManager.js +88 -88
  30. package/lib/cjs/ChangedElementsManager.js.map +1 -1
  31. package/lib/cjs/ChannelControl.d.ts +69 -69
  32. package/lib/cjs/ChannelControl.d.ts.map +1 -1
  33. package/lib/cjs/ChannelControl.js +88 -88
  34. package/lib/cjs/ChannelControl.js.map +1 -1
  35. package/lib/cjs/CheckpointManager.d.ts +121 -121
  36. package/lib/cjs/CheckpointManager.d.ts.map +1 -1
  37. package/lib/cjs/CheckpointManager.js +351 -351
  38. package/lib/cjs/CheckpointManager.js.map +1 -1
  39. package/lib/cjs/ClassRegistry.d.ts +79 -79
  40. package/lib/cjs/ClassRegistry.js +254 -249
  41. package/lib/cjs/ClassRegistry.js.map +1 -1
  42. package/lib/cjs/CloudSqlite.d.ts +355 -355
  43. package/lib/cjs/CloudSqlite.js +154 -154
  44. package/lib/cjs/CloudSqlite.js.map +1 -1
  45. package/lib/cjs/CloudStorageBackend.d.ts +58 -58
  46. package/lib/cjs/CloudStorageBackend.js +170 -170
  47. package/lib/cjs/CloudStorageBackend.js.map +1 -1
  48. package/lib/cjs/CodeService.d.ts +396 -396
  49. package/lib/cjs/CodeService.js +63 -63
  50. package/lib/cjs/CodeService.js.map +1 -1
  51. package/lib/cjs/CodeSpecs.d.ts +55 -55
  52. package/lib/cjs/CodeSpecs.js +124 -124
  53. package/lib/cjs/CodeSpecs.js.map +1 -1
  54. package/lib/cjs/ConcurrentQuery.d.ts +13 -13
  55. package/lib/cjs/ConcurrentQuery.d.ts.map +1 -1
  56. package/lib/cjs/ConcurrentQuery.js +36 -36
  57. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  58. package/lib/cjs/CustomViewState3dCreator.d.ts +21 -21
  59. package/lib/cjs/CustomViewState3dCreator.js +82 -82
  60. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  61. package/lib/cjs/DevTools.d.ts +74 -73
  62. package/lib/cjs/DevTools.d.ts.map +1 -1
  63. package/lib/cjs/DevTools.js +156 -156
  64. package/lib/cjs/DevTools.js.map +1 -1
  65. package/lib/cjs/DisplayStyle.d.ts +106 -106
  66. package/lib/cjs/DisplayStyle.js +253 -253
  67. package/lib/cjs/DisplayStyle.js.map +1 -1
  68. package/lib/cjs/ECDb.d.ts +194 -194
  69. package/lib/cjs/ECDb.js +353 -353
  70. package/lib/cjs/ECDb.js.map +1 -1
  71. package/lib/cjs/ECSchemaXmlContext.d.ts +18 -18
  72. package/lib/cjs/ECSchemaXmlContext.d.ts.map +1 -1
  73. package/lib/cjs/ECSchemaXmlContext.js +41 -41
  74. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  75. package/lib/cjs/ECSqlStatement.d.ts +473 -473
  76. package/lib/cjs/ECSqlStatement.js +791 -791
  77. package/lib/cjs/ECSqlStatement.js.map +1 -1
  78. package/lib/cjs/Element.d.ts +1113 -1113
  79. package/lib/cjs/Element.js +1424 -1424
  80. package/lib/cjs/Element.js.map +1 -1
  81. package/lib/cjs/ElementAspect.d.ts +176 -176
  82. package/lib/cjs/ElementAspect.js +203 -203
  83. package/lib/cjs/ElementAspect.js.map +1 -1
  84. package/lib/cjs/ElementGraphics.d.ts +9 -9
  85. package/lib/cjs/ElementGraphics.js +41 -41
  86. package/lib/cjs/ElementGraphics.js.map +1 -1
  87. package/lib/cjs/ElementTreeWalker.d.ts +162 -162
  88. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  89. package/lib/cjs/ElementTreeWalker.js +409 -409
  90. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  91. package/lib/cjs/Entity.d.ts +106 -106
  92. package/lib/cjs/Entity.d.ts.map +1 -1
  93. package/lib/cjs/Entity.js +134 -134
  94. package/lib/cjs/Entity.js.map +1 -1
  95. package/lib/cjs/EntityReferences.d.ts +49 -49
  96. package/lib/cjs/EntityReferences.d.ts.map +1 -1
  97. package/lib/cjs/EntityReferences.js +95 -95
  98. package/lib/cjs/EntityReferences.js.map +1 -1
  99. package/lib/cjs/ExportGraphics.d.ts +317 -317
  100. package/lib/cjs/ExportGraphics.d.ts.map +1 -1
  101. package/lib/cjs/ExportGraphics.js +208 -208
  102. package/lib/cjs/ExportGraphics.js.map +1 -1
  103. package/lib/cjs/ExternalSource.d.ts +96 -96
  104. package/lib/cjs/ExternalSource.js +131 -131
  105. package/lib/cjs/ExternalSource.js.map +1 -1
  106. package/lib/cjs/GeoCoordConfig.d.ts +19 -19
  107. package/lib/cjs/GeoCoordConfig.js +85 -85
  108. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  109. package/lib/cjs/GeometrySummary.d.ts +4 -4
  110. package/lib/cjs/GeometrySummary.js +380 -380
  111. package/lib/cjs/GeometrySummary.js.map +1 -1
  112. package/lib/cjs/HubMock.d.ts +94 -94
  113. package/lib/cjs/HubMock.js +220 -220
  114. package/lib/cjs/HubMock.js.map +1 -1
  115. package/lib/cjs/IModelCloneContext.d.ts +8 -8
  116. package/lib/cjs/IModelCloneContext.d.ts.map +1 -1
  117. package/lib/cjs/IModelCloneContext.js +15 -15
  118. package/lib/cjs/IModelCloneContext.js.map +1 -1
  119. package/lib/cjs/IModelDb.d.ts +1216 -1216
  120. package/lib/cjs/IModelDb.d.ts.map +1 -1
  121. package/lib/cjs/IModelDb.js +2387 -2386
  122. package/lib/cjs/IModelDb.js.map +1 -1
  123. package/lib/cjs/IModelElementCloneContext.d.ts +89 -89
  124. package/lib/cjs/IModelElementCloneContext.js +159 -159
  125. package/lib/cjs/IModelElementCloneContext.js.map +1 -1
  126. package/lib/cjs/IModelHost.d.ts +369 -369
  127. package/lib/cjs/IModelHost.js +488 -488
  128. package/lib/cjs/IModelHost.js.map +1 -1
  129. package/lib/cjs/IModelJsFs.d.ts +62 -62
  130. package/lib/cjs/IModelJsFs.js +139 -139
  131. package/lib/cjs/IModelJsFs.js.map +1 -1
  132. package/lib/cjs/IpcHost.d.ts +104 -104
  133. package/lib/cjs/IpcHost.js +276 -276
  134. package/lib/cjs/IpcHost.js.map +1 -1
  135. package/lib/cjs/LineStyle.d.ts +311 -311
  136. package/lib/cjs/LineStyle.js +295 -295
  137. package/lib/cjs/LineStyle.js.map +1 -1
  138. package/lib/cjs/LocalHub.d.ts +162 -162
  139. package/lib/cjs/LocalHub.d.ts.map +1 -1
  140. package/lib/cjs/LocalHub.js +580 -580
  141. package/lib/cjs/LocalHub.js.map +1 -1
  142. package/lib/cjs/LocalhostIpcHost.d.ts +20 -20
  143. package/lib/cjs/LocalhostIpcHost.js +79 -79
  144. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  145. package/lib/cjs/Material.d.ts +131 -131
  146. package/lib/cjs/Material.js +180 -180
  147. package/lib/cjs/Material.js.map +1 -1
  148. package/lib/cjs/Model.d.ts +392 -392
  149. package/lib/cjs/Model.js +489 -489
  150. package/lib/cjs/Model.js.map +1 -1
  151. package/lib/cjs/NativeAppStorage.d.ts +51 -51
  152. package/lib/cjs/NativeAppStorage.js +202 -202
  153. package/lib/cjs/NativeAppStorage.js.map +1 -1
  154. package/lib/cjs/NativeHost.d.ts +52 -52
  155. package/lib/cjs/NativeHost.js +160 -160
  156. package/lib/cjs/NativeHost.js.map +1 -1
  157. package/lib/cjs/NavigationRelationship.d.ts +156 -156
  158. package/lib/cjs/NavigationRelationship.js +225 -225
  159. package/lib/cjs/NavigationRelationship.js.map +1 -1
  160. package/lib/cjs/PromiseMemoizer.d.ts +51 -51
  161. package/lib/cjs/PromiseMemoizer.d.ts.map +1 -1
  162. package/lib/cjs/PromiseMemoizer.js +101 -101
  163. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  164. package/lib/cjs/PropertyStore.d.ts +132 -132
  165. package/lib/cjs/PropertyStore.js +11 -11
  166. package/lib/cjs/PropertyStore.js.map +1 -1
  167. package/lib/cjs/Relationship.d.ts +416 -416
  168. package/lib/cjs/Relationship.js +494 -494
  169. package/lib/cjs/Relationship.js.map +1 -1
  170. package/lib/cjs/RpcBackend.d.ts +5 -5
  171. package/lib/cjs/RpcBackend.js +32 -32
  172. package/lib/cjs/RpcBackend.js.map +1 -1
  173. package/lib/cjs/SQLiteDb.d.ts +219 -219
  174. package/lib/cjs/SQLiteDb.js +212 -212
  175. package/lib/cjs/SQLiteDb.js.map +1 -1
  176. package/lib/cjs/Schema.d.ts +55 -55
  177. package/lib/cjs/Schema.js +83 -83
  178. package/lib/cjs/Schema.js.map +1 -1
  179. package/lib/cjs/ServerBasedLocks.d.ts +57 -57
  180. package/lib/cjs/ServerBasedLocks.js +168 -168
  181. package/lib/cjs/ServerBasedLocks.js.map +1 -1
  182. package/lib/cjs/SqliteStatement.d.ts +360 -360
  183. package/lib/cjs/SqliteStatement.d.ts.map +1 -1
  184. package/lib/cjs/SqliteStatement.js +586 -586
  185. package/lib/cjs/SqliteStatement.js.map +1 -1
  186. package/lib/cjs/Texture.d.ts +58 -58
  187. package/lib/cjs/Texture.js +82 -82
  188. package/lib/cjs/Texture.js.map +1 -1
  189. package/lib/cjs/TileStorage.d.ts +18 -18
  190. package/lib/cjs/TileStorage.js +87 -87
  191. package/lib/cjs/TileStorage.js.map +1 -1
  192. package/lib/cjs/TxnManager.d.ts +202 -202
  193. package/lib/cjs/TxnManager.d.ts.map +1 -1
  194. package/lib/cjs/TxnManager.js +356 -356
  195. package/lib/cjs/TxnManager.js.map +1 -1
  196. package/lib/cjs/ViewDefinition.d.ts +435 -435
  197. package/lib/cjs/ViewDefinition.js +646 -646
  198. package/lib/cjs/ViewDefinition.js.map +1 -1
  199. package/lib/cjs/ViewStateHydrator.d.ts +13 -13
  200. package/lib/cjs/ViewStateHydrator.js +103 -103
  201. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  202. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  203. package/lib/cjs/assets/Settings/Schemas/Cloud.Schema.json +67 -67
  204. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +31 -31
  205. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +52 -52
  206. package/lib/cjs/assets/Settings/backend.setting.json5 +138 -138
  207. package/lib/cjs/core-backend.d.ts +185 -185
  208. package/lib/cjs/core-backend.js +209 -205
  209. package/lib/cjs/core-backend.js.map +1 -1
  210. package/lib/cjs/domains/FunctionalElements.d.ts +101 -101
  211. package/lib/cjs/domains/FunctionalElements.js +145 -145
  212. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  213. package/lib/cjs/domains/FunctionalSchema.d.ts +13 -13
  214. package/lib/cjs/domains/FunctionalSchema.js +39 -39
  215. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  216. package/lib/cjs/domains/GenericElements.d.ts +177 -177
  217. package/lib/cjs/domains/GenericElements.js +263 -263
  218. package/lib/cjs/domains/GenericElements.js.map +1 -1
  219. package/lib/cjs/domains/GenericSchema.d.ts +10 -10
  220. package/lib/cjs/domains/GenericSchema.js +28 -28
  221. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  222. package/lib/cjs/rpc/multipart.d.ts +11 -11
  223. package/lib/cjs/rpc/multipart.js +71 -71
  224. package/lib/cjs/rpc/multipart.js.map +1 -1
  225. package/lib/cjs/rpc/tracing.d.ts +28 -28
  226. package/lib/cjs/rpc/tracing.js +73 -73
  227. package/lib/cjs/rpc/tracing.js.map +1 -1
  228. package/lib/cjs/rpc/web/logging.d.ts +9 -9
  229. package/lib/cjs/rpc/web/logging.js +43 -43
  230. package/lib/cjs/rpc/web/logging.js.map +1 -1
  231. package/lib/cjs/rpc/web/request.d.ts +6 -6
  232. package/lib/cjs/rpc/web/request.js +73 -73
  233. package/lib/cjs/rpc/web/request.js.map +1 -1
  234. package/lib/cjs/rpc/web/response.d.ts +6 -6
  235. package/lib/cjs/rpc/web/response.js +105 -105
  236. package/lib/cjs/rpc/web/response.js.map +1 -1
  237. package/lib/cjs/rpc-impl/DevToolsRpcImpl.d.ts +15 -15
  238. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js +32 -32
  239. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  240. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +47 -47
  241. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +293 -293
  242. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  243. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts +22 -22
  244. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +202 -202
  245. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  246. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +36 -36
  247. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +166 -166
  248. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  249. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +16 -16
  250. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +42 -42
  251. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  252. package/lib/cjs/rpc-impl/WipRpcImpl.d.ts +15 -15
  253. package/lib/cjs/rpc-impl/WipRpcImpl.js +37 -37
  254. package/lib/cjs/rpc-impl/WipRpcImpl.js.map +1 -1
  255. package/lib/cjs/workspace/Settings.d.ts +186 -186
  256. package/lib/cjs/workspace/Settings.d.ts.map +1 -1
  257. package/lib/cjs/workspace/Settings.js +154 -154
  258. package/lib/cjs/workspace/Settings.js.map +1 -1
  259. package/lib/cjs/workspace/SettingsSchemas.d.ts +75 -75
  260. package/lib/cjs/workspace/SettingsSchemas.js +190 -190
  261. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  262. package/lib/cjs/workspace/Workspace.d.ts +414 -414
  263. package/lib/cjs/workspace/Workspace.js +537 -537
  264. package/lib/cjs/workspace/Workspace.js.map +1 -1
  265. package/package.json +12 -12
@@ -1,587 +1,587 @@
1
- "use strict";
2
- /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- /** @packageDocumentation
7
- * @module SQLite
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.StatementCache = exports.SqliteValue = exports.SqliteValueType = exports.SqliteStatement = void 0;
11
- const core_bentley_1 = require("@itwin/core-bentley");
12
- const core_common_1 = require("@itwin/core-common");
13
- const IModelHost_1 = require("./IModelHost");
14
- function checkBind(stat) {
15
- if (stat !== core_bentley_1.DbResult.BE_SQLITE_OK)
16
- throw new core_common_1.IModelError(stat, "SQLite Bind error");
17
- }
18
- /** Executes SQLite SQL statements.
19
- *
20
- * A statement must be prepared before it can be executed, and it must be released when no longer needed.
21
- * See [IModelDb.withPreparedSqliteStatement]($backend) or
22
- * [ECDb.withPreparedSqliteStatement]($backend) for a convenient and
23
- * reliable way to prepare, execute, and then release a statement.
24
- *
25
- * A statement may contain parameters that must be filled in before use by calling [SqliteStatement.bindValue]($backend)
26
- * or [SqliteStatement.bindValues]($backend).
27
- *
28
- * Once prepared (and parameters are bound, if any), the statement is executed by calling [SqliteStatement.step]($backend).
29
- * In case of an **SQL SELECT** statement, the current row can be retrieved with [SqliteStatement.getRow]($backend) as
30
- * a whole, or with [SqliteStatement.getValue]($backend) when individual values are needed.
31
- * Alternatively, query results of an **SQL SELECT** statement can be stepped through by using
32
- * standard iteration syntax, such as `for of`.
33
- *
34
- * > Preparing a statement can be time-consuming. The best way to reduce the effect of this overhead is to cache and reuse prepared
35
- * > statements. A cached prepared statement may be used in different places in an app, as long as the statement is general enough.
36
- * > The key to making this strategy work is to phrase a statement in a general way and use placeholders to represent parameters that will vary on each use.
37
- * @public
38
- */
39
- class SqliteStatement {
40
- constructor(_sql) {
41
- this._sql = _sql;
42
- }
43
- get stmt() { return this._stmt; }
44
- get sql() { return this._sql; }
45
- /** Check if this statement has been prepared successfully or not */
46
- get isPrepared() { return undefined !== this._stmt; }
47
- /** Prepare this statement prior to first use.
48
- * @param db The DgnDb or ECDb to prepare the statement against
49
- * @param sql The SQL statement string to prepare
50
- * @param logErrors Determine if errors are logged or not
51
- * @throws if the SQL statement cannot be prepared. Normally, prepare fails due to SQL syntax errors or references to tables or properties that do not exist.
52
- * The error.message property will provide details.
53
- */
54
- prepare(db, logErrors = true) {
55
- if (this.isPrepared)
56
- throw new Error("SqliteStatement is already prepared");
57
- this._db = db;
58
- this._stmt = new IModelHost_1.IModelHost.platform.SqliteStatement();
59
- this._stmt.prepare(db, this._sql, logErrors);
60
- }
61
- /** Indicates whether the prepared statement makes no **direct* changes to the content of the file
62
- * or not. See [SQLite docs](https://www.sqlite.org/c3ref/stmt_readonly.html) for details.
63
- */
64
- get isReadonly() {
65
- return this.stmt.isReadonly();
66
- }
67
- /** Reset this statement so that the next call to step will return the first row, if any.
68
- */
69
- reset() {
70
- this.stmt.reset();
71
- }
72
- /** Call this function when finished with this statement. This releases the native resources held by the statement. */
73
- dispose() {
74
- if (this._stmt) {
75
- this._stmt.dispose(); // free native statement
76
- this._stmt = undefined;
77
- this._db = undefined;
78
- }
79
- }
80
- /**
81
- * Call `step` on this statement and determine whether a new row is available.
82
- * Use this method only when this statement has been prepared with a SELECT statement.
83
- * @return true if a new row is available, false otherwise.
84
- * @throws if `step` returns anything other than BE_SQLITE_ROW or BE_SQLITE_DONE.
85
- */
86
- nextRow() {
87
- const rc = this.step();
88
- switch (rc) {
89
- case core_bentley_1.DbResult.BE_SQLITE_ROW:
90
- return true;
91
- case core_bentley_1.DbResult.BE_SQLITE_DONE:
92
- return false;
93
- }
94
- throw new core_bentley_1.BentleyError(rc, this._db.getLastError());
95
- }
96
- /** Binds a value to the specified SQL parameter.
97
- * The value must be of one of these types:
98
- * JavaScript Type | SQLite Type
99
- * --- | ---
100
- * undefined | NULL
101
- * boolean | INTEGER with true being bound as 1 and false as 0
102
- * number | INTEGER if number is integral or REAL if number is not integral
103
- * string | TEXT
104
- * Uint8Array or ArrayBuffer | BLOB
105
- * [StringParam]($backend) where member **id** is set | INTEGER
106
- * [StringParam]($backend) where member **guid** is set | BLOB
107
- *
108
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
109
- * @param value Value to bind.
110
- * @throws [IModelError]($common) if the value is of an unsupported type or in
111
- * case of other binding errors.
112
- */
113
- bindValue(parameter, value) {
114
- let stat;
115
- if (value === undefined || value === null) {
116
- stat = this.stmt.bindNull(parameter);
117
- }
118
- else if (typeof (value) === "number") {
119
- if (Number.isInteger(value))
120
- stat = this.stmt.bindInteger(parameter, value);
121
- else
122
- stat = this.stmt.bindDouble(parameter, value);
123
- }
124
- else if (typeof (value) === "boolean") {
125
- stat = this.stmt.bindInteger(parameter, value ? 1 : 0);
126
- }
127
- else if (typeof (value) === "string") {
128
- stat = this.stmt.bindString(parameter, value);
129
- }
130
- else if (!!value.id) {
131
- stat = this.stmt.bindId(parameter, value.id);
132
- }
133
- else if (!!value.guid) {
134
- stat = this.stmt.bindGuid(parameter, value.guid);
135
- }
136
- else if (value instanceof Uint8Array) {
137
- stat = this.stmt.bindBlob(parameter, value);
138
- }
139
- else
140
- throw new core_common_1.IModelError(core_bentley_1.DbResult.BE_SQLITE_ERROR, `Parameter value ${value} is of an unsupported data type.`);
141
- if (stat !== core_bentley_1.DbResult.BE_SQLITE_OK)
142
- throw new core_common_1.IModelError(stat, "Error in bindValue");
143
- }
144
- /** Bind an integer parameter
145
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
146
- * @param val integer to bind.
147
- */
148
- bindInteger(parameter, val) {
149
- checkBind(this.stmt.bindInteger(parameter, val));
150
- }
151
- /** Bind an integer parameter if it is defined. Otherwise do nothing.
152
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
153
- * @param val integer to bind.
154
- */
155
- maybeBindInteger(parameter, val) {
156
- if (val !== undefined)
157
- this.bindInteger(parameter, val);
158
- }
159
- /** Bind a boolean parameter.
160
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
161
- * @param val boolean to bind.
162
- */
163
- bindBoolean(parameter, val) {
164
- this.bindInteger(parameter, val ? 1 : 0);
165
- }
166
- /** Bind a boolean parameter if it is defined. Otherwise do nothing.
167
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
168
- * @param val boolean to bind.
169
- */
170
- maybeBindBoolean(parameter, val) {
171
- if (val !== undefined)
172
- this.bindBoolean(parameter, val);
173
- }
174
- /** JSON.stringify a property value and bind the JSON string.
175
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
176
- * @param val object to bind.
177
- * @internal
178
- */
179
- bindProps(colIndex, val) {
180
- this.bindString(colIndex, JSON.stringify(val));
181
- }
182
- /** JSON.stringify a property value if it is defined, and bind the JSON string. Otherwise do nothing.
183
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
184
- * @param val object to bind.
185
- * @internal
186
- */
187
- maybeBindProps(colIndex, val) {
188
- if (val !== undefined)
189
- this.bindProps(colIndex, val);
190
- }
191
- /** Bind a double parameter
192
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
193
- * @param val double to bind.
194
- */
195
- bindDouble(parameter, val) {
196
- checkBind(this.stmt.bindDouble(parameter, val));
197
- }
198
- /** Bind a double parameter if it is defined. Otherwise do nothing.
199
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
200
- * @param val double to bind.
201
- */
202
- maybeBindDouble(parameter, val) {
203
- if (val !== undefined)
204
- this.bindDouble(parameter, val);
205
- }
206
- /** Bind a string parameter
207
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
208
- * @param val string to bind.
209
- */
210
- bindString(parameter, val) {
211
- checkBind(this.stmt.bindString(parameter, val));
212
- }
213
- /** Bind a string parameter if it is defined. Otherwise do nothing.
214
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
215
- * @param val string to bind.
216
- */
217
- maybeBindString(parameter, val) {
218
- if (val !== undefined)
219
- this.bindString(parameter, val);
220
- }
221
- /** Bind an Id64String parameter as a 64-bit integer
222
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
223
- * @param val Id to bind.
224
- */
225
- bindId(parameter, id) {
226
- checkBind(this.stmt.bindId(parameter, id));
227
- }
228
- /** Bind a Guid parameter
229
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
230
- * @param val Guid to bind.
231
- */
232
- bindGuid(parameter, guid) {
233
- checkBind(this.stmt.bindGuid(parameter, guid));
234
- }
235
- /** Bind a blob parameter
236
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
237
- * @param val blob to bind.
238
- */
239
- bindBlob(parameter, blob) {
240
- checkBind(this.stmt.bindBlob(parameter, blob));
241
- }
242
- /** Bind a blob parameter if it is defined. Otherwise do nothing.
243
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
244
- * @param val blob to bind.
245
- */
246
- maybeBindBlob(parameter, val) {
247
- if (val !== undefined)
248
- this.bindBlob(parameter, val);
249
- }
250
- /** Bind null to a parameter
251
- * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
252
- */
253
- bindNull(parameter) {
254
- checkBind(this.stmt.bindNull(parameter));
255
- }
256
- /** Bind values to all parameters in the statement.
257
- * @param values The values to bind to the parameters.
258
- * Pass an *array* of values if the parameters are *positional*.
259
- * Pass an *object of the values keyed on the parameter name* for *named parameters*.
260
- * The values in either the array or object must match the respective types of the parameter.
261
- * See [[SqliteStatement.bindValue]] for details on the supported types.
262
- */
263
- bindValues(values) {
264
- if (Array.isArray(values)) {
265
- for (let i = 0; i < values.length; i++) {
266
- const paramIndex = i + 1;
267
- const paramValue = values[i];
268
- if (paramValue === undefined || paramValue === null)
269
- continue;
270
- this.bindValue(paramIndex, paramValue);
271
- }
272
- return;
273
- }
274
- for (const entry of Object.entries(values)) {
275
- const paramName = entry[0];
276
- const paramValue = entry[1];
277
- if (paramValue === undefined || paramValue === null)
278
- continue;
279
- this.bindValue(paramName, paramValue);
280
- }
281
- }
282
- /** Clear any bindings that were previously set on this statement.
283
- * @throws [IModelError]($common) in case of errors
284
- */
285
- clearBindings() {
286
- const stat = this.stmt.clearBindings();
287
- if (stat !== core_bentley_1.DbResult.BE_SQLITE_OK)
288
- throw new core_common_1.IModelError(stat, "Error in clearBindings");
289
- }
290
- /** Step this statement to the next row.
291
- *
292
- * For **SQL SELECT** statements the method returns
293
- * - [DbResult.BE_SQLITE_ROW]($core-bentley) if the statement now points successfully to the next row.
294
- * - [DbResult.BE_SQLITE_DONE]($core-bentley) if the statement has no more rows.
295
- * - Error status in case of errors.
296
- *
297
- * For **SQL INSERT, UPDATE, DELETE** statements the method returns
298
- * - [DbResult.BE_SQLITE_DONE]($core-bentley) if the statement has been executed successfully.
299
- * - Error status in case of errors.
300
- */
301
- step() {
302
- return this.stmt.step();
303
- }
304
- /** Get the query result's column count (only for SQL SELECT statements). */
305
- getColumnCount() {
306
- return this.stmt.getColumnCount();
307
- }
308
- /** Get the value for the column at the given index in the query result.
309
- * @param columnIx Index of SQL column in query result (0-based)
310
- */
311
- getValue(columnIx) {
312
- return new SqliteValue(this.stmt, columnIx);
313
- }
314
- /** Determine whether the value of the specified column is null
315
- * @param colIndex Index of SQL column in query result (0-based)
316
- */
317
- isValueNull(colIndex) {
318
- return this.stmt.isValueNull(colIndex);
319
- }
320
- /** Get a size in bytes of a blob or text column
321
- * @param colIndex Index of SQL column in query result (0-based)
322
- */
323
- getColumnBytes(colIndex) {
324
- return this.stmt.getColumnBytes(colIndex);
325
- }
326
- /** Get a value as a blob
327
- * @param colIndex Index of SQL column in query result (0-based)
328
- */
329
- getValueBlob(colIndex) {
330
- return this.stmt.getValueBlob(colIndex);
331
- }
332
- /** Get the value as a blob, or undefined if it is null.
333
- * @param colIndex Index of SQL column in query result (0-based)
334
- */
335
- getValueBlobMaybe(colIndex) {
336
- return this.isValueNull(colIndex) ? undefined : this.getValueBlob(colIndex);
337
- }
338
- /** Get a value as a double
339
- * @param colIndex Index of SQL column in query result (0-based)
340
- */
341
- getValueDouble(colIndex) {
342
- return this.stmt.getValueDouble(colIndex);
343
- }
344
- /** Get the value as an double, or undefined if it is null.
345
- * @param colIndex Index of SQL column in query result (0-based)
346
- */
347
- getValueDoubleMaybe(colIndex) {
348
- return this.isValueNull(colIndex) ? undefined : this.getValueDouble(colIndex);
349
- }
350
- /** Get a value as a integer
351
- * @param colIndex Index of SQL column in query result (0-based)
352
- */
353
- getValueInteger(colIndex) {
354
- return this.stmt.getValueInteger(colIndex);
355
- }
356
- /** Get the value as an integer, or undefined if it is null.
357
- * @param colIndex Index of SQL column in query result (0-based)
358
- */
359
- getValueIntegerMaybe(colIndex) {
360
- return this.isValueNull(colIndex) ? undefined : this.getValueInteger(colIndex);
361
- }
362
- /** Get a value as a string
363
- * @param colIndex Index of SQL column in query result (0-based)
364
- */
365
- getValueString(colIndex) {
366
- return this.stmt.getValueString(colIndex);
367
- }
368
- /** Get the value as a string, or undefined if it is null.
369
- * @param colIndex Index of SQL column in query result (0-based)
370
- */
371
- getValueStringMaybe(colIndex) {
372
- return this.isValueNull(colIndex) ? undefined : this.getValueString(colIndex);
373
- }
374
- /** Get a value as an Id
375
- * @param colIndex Index of SQL column in query result (0-based)
376
- */
377
- getValueId(colIndex) {
378
- return this.stmt.getValueId(colIndex);
379
- }
380
- /** Get a value as a Guid
381
- * @param colIndex Index of SQL column in query result (0-based)
382
- */
383
- getValueGuid(colIndex) {
384
- return this.stmt.getValueGuid(colIndex);
385
- }
386
- /** Get the value as a boolean. Returns `false` if the column is null.
387
- * @param colIndex Index of SQL column in query result (0-based)
388
- */
389
- getValueBoolean(colIndex) {
390
- return this.isValueNull(colIndex) ? false : 0 !== this.getValueInteger(colIndex);
391
- }
392
- /** Get the value of a [julianday](https://www.sqlite.org/lang_datefunc.html) column as a JavaScript `Date`.
393
- * @param colIndex Index of SQL column in query result (0-based)
394
- * @beta
395
- */
396
- getValueDate(colIndex) {
397
- return new Date((this.stmt.getValueDouble(colIndex) - 2440587.5) * 86400000); // conversion from julian day ms to unix epoch ms
398
- }
399
- /** Get the value as a "props" JSON string, then parse it and return the object
400
- * @param colIndex Index of SQL column in query result (0-based)
401
- * @internal
402
- */
403
- getProps(colIndex) {
404
- return JSON.parse(this.getValueString(colIndex));
405
- }
406
- /** Get the value as a "props" JSON string, then parse it and return the object.
407
- * If the column is null, return undefined.
408
- * @param colIndex Index of SQL column in query result (0-based)
409
- * @internal
410
- */
411
- getPropsMaybe(colIndex) {
412
- return this.isValueNull(colIndex) ? undefined : this.getProps(colIndex);
413
- }
414
- /** Get the current row.
415
- * The returned row is formatted as JavaScript object where every SELECT clause item becomes a property in the JavaScript object.
416
- *
417
- * The SQL select clause item's name becomes the member name of the JavaScript object, **with the first character lowered**.
418
- *
419
- * SQLite Type | JavaScript Type
420
- * --- | ---
421
- * [SqliteValueType.Null]($backend) | undefined
422
- * [SqliteValueType.Integer]($backend) | number
423
- * [SqliteValueType.Double]($backend) | number
424
- * [SqliteValueType.String]($backend) | string
425
- * [SqliteValueType.Blob]($backend) | Uint8Array
426
- */
427
- getRow() {
428
- const colCount = this.getColumnCount();
429
- const row = {};
430
- const duplicatePropNames = new Map();
431
- for (let i = 0; i < colCount; i++) {
432
- const sqliteValue = this.getValue(i);
433
- if (!sqliteValue.isNull) {
434
- const propName = SqliteStatement.determineResultRowPropertyName(duplicatePropNames, sqliteValue);
435
- let val;
436
- switch (sqliteValue.type) {
437
- case SqliteValueType.Blob:
438
- val = sqliteValue.getBlob();
439
- break;
440
- case SqliteValueType.Double:
441
- val = sqliteValue.getDouble();
442
- break;
443
- case SqliteValueType.Integer:
444
- val = sqliteValue.getInteger();
445
- break;
446
- case SqliteValueType.String:
447
- val = sqliteValue.getString();
448
- break;
449
- default:
450
- throw new Error("Unsupported SqliteValueType");
451
- }
452
- Object.defineProperty(row, propName, { enumerable: true, configurable: true, writable: true, value: val });
453
- }
454
- }
455
- return row;
456
- }
457
- static determineResultRowPropertyName(duplicatePropNames, sqliteValue) {
458
- let jsName = core_common_1.ECJsNames.toJsName(sqliteValue.columnName);
459
- // now check duplicates. If there are, append a numeric suffix to the duplicates
460
- let suffix = duplicatePropNames.get(jsName);
461
- if (suffix === undefined)
462
- duplicatePropNames.set(jsName, 0);
463
- else {
464
- suffix++;
465
- duplicatePropNames.set(jsName, suffix);
466
- jsName += `_${suffix}`;
467
- }
468
- return jsName;
469
- }
470
- /** Calls step when called as an iterator.
471
- */
472
- next() {
473
- return core_bentley_1.DbResult.BE_SQLITE_ROW === this.step() ? { done: false, value: this.getRow() } : { done: true, value: undefined };
474
- }
475
- /** The iterator that will step through the results of this statement. */
476
- [Symbol.iterator]() { return this; }
477
- }
478
- exports.SqliteStatement = SqliteStatement;
479
- /** Data type of a value in in an SQLite SQL query result.
480
- * See also:
481
- * - [SqliteValue]($backend)
482
- * - [SqliteStatement]($backend)
483
- * - [SqliteStatement.getValue]($backend)
484
- * @public
485
- */
486
- var SqliteValueType;
487
- (function (SqliteValueType) {
488
- // do not change the values of that enum. It must correspond to the respective
489
- // enum DbValueType in the native BeSQLite API.
490
- SqliteValueType[SqliteValueType["Integer"] = 1] = "Integer";
491
- SqliteValueType[SqliteValueType["Double"] = 2] = "Double";
492
- SqliteValueType[SqliteValueType["String"] = 3] = "String";
493
- SqliteValueType[SqliteValueType["Blob"] = 4] = "Blob";
494
- SqliteValueType[SqliteValueType["Null"] = 5] = "Null";
495
- })(SqliteValueType = exports.SqliteValueType || (exports.SqliteValueType = {}));
496
- /** Value of a column in a row of an SQLite SQL query result.
497
- * See also:
498
- * - [SqliteStatement]($backend)
499
- * - [SqliteStatement.getValue]($backend)
500
- * @public
501
- */
502
- class SqliteValue {
503
- constructor(stmt, colIndex) {
504
- this._stmt = stmt;
505
- this._colIndex = colIndex;
506
- }
507
- /** Indicates whether the value is NULL or not. */
508
- get isNull() { return this._stmt.isValueNull(this._colIndex); }
509
- /** Gets the data type of the value. */
510
- get type() { return this._stmt.getColumnType(this._colIndex); }
511
- /** Gets the name of the column of the value. */
512
- get columnName() { return this._stmt.getColumnName(this._colIndex); }
513
- /** Gets the SqlValue as JavaScript value.
514
- *
515
- * SQLite Type | JavaScript Type
516
- * --- | ---
517
- * [SqliteValueType.Null]($backend) | undefined
518
- * [SqliteValueType.Integer]($backend) | number
519
- * [SqliteValueType.Double]($backend) | number
520
- * [SqliteValueType.String]($backend) | string
521
- * [SqliteValueType.Blob]($backend) | Uint8Array
522
- */
523
- get value() {
524
- switch (this.type) {
525
- case SqliteValueType.Null:
526
- return undefined;
527
- case SqliteValueType.Blob:
528
- return this.getBlob();
529
- case SqliteValueType.Double:
530
- return this.getDouble();
531
- case SqliteValueType.Integer:
532
- return this.getInteger();
533
- case SqliteValueType.String:
534
- return this.getString();
535
- default:
536
- throw new Error("Unhandled SqliteValueType");
537
- }
538
- }
539
- /** Get the value as Blob */
540
- getBlob() { return this._stmt.getValueBlob(this._colIndex); }
541
- /** Get the value as a double value */
542
- getDouble() { return this._stmt.getValueDouble(this._colIndex); }
543
- /** Get the value as a integer value */
544
- getInteger() { return this._stmt.getValueInteger(this._colIndex); }
545
- /** Get the value as a string value */
546
- getString() { return this._stmt.getValueString(this._colIndex); }
547
- /** Get the value as an Id value */
548
- getId() { return this._stmt.getValueId(this._colIndex); }
549
- /** Get the value as a Guid value */
550
- getGuid() { return this._stmt.getValueGuid(this._colIndex); }
551
- }
552
- exports.SqliteValue = SqliteValue;
553
- /** A cache for previously prepared SqliteStatements.
554
- * It only holds Statements after they are no longer in use, resetting and clearing their bindings before saving them.
555
- * When a request to use a statement from the cache is made, it is first removed from the cache.
556
- * @internal
557
- */
558
- class StatementCache {
559
- constructor(maxCount = 40) {
560
- this._cache = new core_bentley_1.LRUMap(maxCount);
561
- }
562
- get size() { return this._cache.size; }
563
- addOrDispose(stmt) {
564
- (0, core_bentley_1.assert)(stmt.isPrepared);
565
- const existing = this._cache.get(stmt.sql);
566
- if (existing !== undefined) {
567
- stmt.dispose(); // we already have a statement with this sql cached, we can't save another one so just dispose it
568
- return;
569
- }
570
- if (this._cache.size >= this._cache.limit) {
571
- const oldest = this._cache.shift();
572
- oldest[1].dispose();
573
- }
574
- stmt.reset();
575
- stmt.clearBindings();
576
- this._cache.set(stmt.sql, stmt);
577
- }
578
- findAndRemove(sql) {
579
- return this._cache.delete(sql);
580
- }
581
- clear() {
582
- this._cache.forEach((stmt) => stmt.dispose());
583
- this._cache.clear();
584
- }
585
- }
586
- exports.StatementCache = StatementCache;
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ /** @packageDocumentation
7
+ * @module SQLite
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.StatementCache = exports.SqliteValue = exports.SqliteValueType = exports.SqliteStatement = void 0;
11
+ const core_bentley_1 = require("@itwin/core-bentley");
12
+ const core_common_1 = require("@itwin/core-common");
13
+ const IModelHost_1 = require("./IModelHost");
14
+ function checkBind(stat) {
15
+ if (stat !== core_bentley_1.DbResult.BE_SQLITE_OK)
16
+ throw new core_common_1.IModelError(stat, "SQLite Bind error");
17
+ }
18
+ /** Executes SQLite SQL statements.
19
+ *
20
+ * A statement must be prepared before it can be executed, and it must be released when no longer needed.
21
+ * See [IModelDb.withPreparedSqliteStatement]($backend) or
22
+ * [ECDb.withPreparedSqliteStatement]($backend) for a convenient and
23
+ * reliable way to prepare, execute, and then release a statement.
24
+ *
25
+ * A statement may contain parameters that must be filled in before use by calling [SqliteStatement.bindValue]($backend)
26
+ * or [SqliteStatement.bindValues]($backend).
27
+ *
28
+ * Once prepared (and parameters are bound, if any), the statement is executed by calling [SqliteStatement.step]($backend).
29
+ * In case of an **SQL SELECT** statement, the current row can be retrieved with [SqliteStatement.getRow]($backend) as
30
+ * a whole, or with [SqliteStatement.getValue]($backend) when individual values are needed.
31
+ * Alternatively, query results of an **SQL SELECT** statement can be stepped through by using
32
+ * standard iteration syntax, such as `for of`.
33
+ *
34
+ * > Preparing a statement can be time-consuming. The best way to reduce the effect of this overhead is to cache and reuse prepared
35
+ * > statements. A cached prepared statement may be used in different places in an app, as long as the statement is general enough.
36
+ * > The key to making this strategy work is to phrase a statement in a general way and use placeholders to represent parameters that will vary on each use.
37
+ * @public
38
+ */
39
+ class SqliteStatement {
40
+ constructor(_sql) {
41
+ this._sql = _sql;
42
+ }
43
+ get stmt() { return this._stmt; }
44
+ get sql() { return this._sql; }
45
+ /** Check if this statement has been prepared successfully or not */
46
+ get isPrepared() { return undefined !== this._stmt; }
47
+ /** Prepare this statement prior to first use.
48
+ * @param db The DgnDb or ECDb to prepare the statement against
49
+ * @param sql The SQL statement string to prepare
50
+ * @param logErrors Determine if errors are logged or not
51
+ * @throws if the SQL statement cannot be prepared. Normally, prepare fails due to SQL syntax errors or references to tables or properties that do not exist.
52
+ * The error.message property will provide details.
53
+ */
54
+ prepare(db, logErrors = true) {
55
+ if (this.isPrepared)
56
+ throw new Error("SqliteStatement is already prepared");
57
+ this._db = db;
58
+ this._stmt = new IModelHost_1.IModelHost.platform.SqliteStatement();
59
+ this._stmt.prepare(db, this._sql, logErrors);
60
+ }
61
+ /** Indicates whether the prepared statement makes no **direct* changes to the content of the file
62
+ * or not. See [SQLite docs](https://www.sqlite.org/c3ref/stmt_readonly.html) for details.
63
+ */
64
+ get isReadonly() {
65
+ return this.stmt.isReadonly();
66
+ }
67
+ /** Reset this statement so that the next call to step will return the first row, if any.
68
+ */
69
+ reset() {
70
+ this.stmt.reset();
71
+ }
72
+ /** Call this function when finished with this statement. This releases the native resources held by the statement. */
73
+ dispose() {
74
+ if (this._stmt) {
75
+ this._stmt.dispose(); // free native statement
76
+ this._stmt = undefined;
77
+ this._db = undefined;
78
+ }
79
+ }
80
+ /**
81
+ * Call `step` on this statement and determine whether a new row is available.
82
+ * Use this method only when this statement has been prepared with a SELECT statement.
83
+ * @return true if a new row is available, false otherwise.
84
+ * @throws if `step` returns anything other than BE_SQLITE_ROW or BE_SQLITE_DONE.
85
+ */
86
+ nextRow() {
87
+ const rc = this.step();
88
+ switch (rc) {
89
+ case core_bentley_1.DbResult.BE_SQLITE_ROW:
90
+ return true;
91
+ case core_bentley_1.DbResult.BE_SQLITE_DONE:
92
+ return false;
93
+ }
94
+ throw new core_bentley_1.BentleyError(rc, this._db.getLastError());
95
+ }
96
+ /** Binds a value to the specified SQL parameter.
97
+ * The value must be of one of these types:
98
+ * JavaScript Type | SQLite Type
99
+ * --- | ---
100
+ * undefined | NULL
101
+ * boolean | INTEGER with true being bound as 1 and false as 0
102
+ * number | INTEGER if number is integral or REAL if number is not integral
103
+ * string | TEXT
104
+ * Uint8Array or ArrayBuffer | BLOB
105
+ * [StringParam]($backend) where member **id** is set | INTEGER
106
+ * [StringParam]($backend) where member **guid** is set | BLOB
107
+ *
108
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
109
+ * @param value Value to bind.
110
+ * @throws [IModelError]($common) if the value is of an unsupported type or in
111
+ * case of other binding errors.
112
+ */
113
+ bindValue(parameter, value) {
114
+ let stat;
115
+ if (value === undefined || value === null) {
116
+ stat = this.stmt.bindNull(parameter);
117
+ }
118
+ else if (typeof (value) === "number") {
119
+ if (Number.isInteger(value))
120
+ stat = this.stmt.bindInteger(parameter, value);
121
+ else
122
+ stat = this.stmt.bindDouble(parameter, value);
123
+ }
124
+ else if (typeof (value) === "boolean") {
125
+ stat = this.stmt.bindInteger(parameter, value ? 1 : 0);
126
+ }
127
+ else if (typeof (value) === "string") {
128
+ stat = this.stmt.bindString(parameter, value);
129
+ }
130
+ else if (!!value.id) {
131
+ stat = this.stmt.bindId(parameter, value.id);
132
+ }
133
+ else if (!!value.guid) {
134
+ stat = this.stmt.bindGuid(parameter, value.guid);
135
+ }
136
+ else if (value instanceof Uint8Array) {
137
+ stat = this.stmt.bindBlob(parameter, value);
138
+ }
139
+ else
140
+ throw new core_common_1.IModelError(core_bentley_1.DbResult.BE_SQLITE_ERROR, `Parameter value ${value} is of an unsupported data type.`);
141
+ if (stat !== core_bentley_1.DbResult.BE_SQLITE_OK)
142
+ throw new core_common_1.IModelError(stat, "Error in bindValue");
143
+ }
144
+ /** Bind an integer parameter
145
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
146
+ * @param val integer to bind.
147
+ */
148
+ bindInteger(parameter, val) {
149
+ checkBind(this.stmt.bindInteger(parameter, val));
150
+ }
151
+ /** Bind an integer parameter if it is defined. Otherwise do nothing.
152
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
153
+ * @param val integer to bind.
154
+ */
155
+ maybeBindInteger(parameter, val) {
156
+ if (val !== undefined)
157
+ this.bindInteger(parameter, val);
158
+ }
159
+ /** Bind a boolean parameter.
160
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
161
+ * @param val boolean to bind.
162
+ */
163
+ bindBoolean(parameter, val) {
164
+ this.bindInteger(parameter, val ? 1 : 0);
165
+ }
166
+ /** Bind a boolean parameter if it is defined. Otherwise do nothing.
167
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
168
+ * @param val boolean to bind.
169
+ */
170
+ maybeBindBoolean(parameter, val) {
171
+ if (val !== undefined)
172
+ this.bindBoolean(parameter, val);
173
+ }
174
+ /** JSON.stringify a property value and bind the JSON string.
175
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
176
+ * @param val object to bind.
177
+ * @internal
178
+ */
179
+ bindProps(colIndex, val) {
180
+ this.bindString(colIndex, JSON.stringify(val));
181
+ }
182
+ /** JSON.stringify a property value if it is defined, and bind the JSON string. Otherwise do nothing.
183
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
184
+ * @param val object to bind.
185
+ * @internal
186
+ */
187
+ maybeBindProps(colIndex, val) {
188
+ if (val !== undefined)
189
+ this.bindProps(colIndex, val);
190
+ }
191
+ /** Bind a double parameter
192
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
193
+ * @param val double to bind.
194
+ */
195
+ bindDouble(parameter, val) {
196
+ checkBind(this.stmt.bindDouble(parameter, val));
197
+ }
198
+ /** Bind a double parameter if it is defined. Otherwise do nothing.
199
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
200
+ * @param val double to bind.
201
+ */
202
+ maybeBindDouble(parameter, val) {
203
+ if (val !== undefined)
204
+ this.bindDouble(parameter, val);
205
+ }
206
+ /** Bind a string parameter
207
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
208
+ * @param val string to bind.
209
+ */
210
+ bindString(parameter, val) {
211
+ checkBind(this.stmt.bindString(parameter, val));
212
+ }
213
+ /** Bind a string parameter if it is defined. Otherwise do nothing.
214
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
215
+ * @param val string to bind.
216
+ */
217
+ maybeBindString(parameter, val) {
218
+ if (val !== undefined)
219
+ this.bindString(parameter, val);
220
+ }
221
+ /** Bind an Id64String parameter as a 64-bit integer
222
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
223
+ * @param val Id to bind.
224
+ */
225
+ bindId(parameter, id) {
226
+ checkBind(this.stmt.bindId(parameter, id));
227
+ }
228
+ /** Bind a Guid parameter
229
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
230
+ * @param val Guid to bind.
231
+ */
232
+ bindGuid(parameter, guid) {
233
+ checkBind(this.stmt.bindGuid(parameter, guid));
234
+ }
235
+ /** Bind a blob parameter
236
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
237
+ * @param val blob to bind.
238
+ */
239
+ bindBlob(parameter, blob) {
240
+ checkBind(this.stmt.bindBlob(parameter, blob));
241
+ }
242
+ /** Bind a blob parameter if it is defined. Otherwise do nothing.
243
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
244
+ * @param val blob to bind.
245
+ */
246
+ maybeBindBlob(parameter, val) {
247
+ if (val !== undefined)
248
+ this.bindBlob(parameter, val);
249
+ }
250
+ /** Bind null to a parameter
251
+ * @param parameter Index (1-based) or name of the parameter (including the initial ':', '@' or '$')
252
+ */
253
+ bindNull(parameter) {
254
+ checkBind(this.stmt.bindNull(parameter));
255
+ }
256
+ /** Bind values to all parameters in the statement.
257
+ * @param values The values to bind to the parameters.
258
+ * Pass an *array* of values if the parameters are *positional*.
259
+ * Pass an *object of the values keyed on the parameter name* for *named parameters*.
260
+ * The values in either the array or object must match the respective types of the parameter.
261
+ * See [[SqliteStatement.bindValue]] for details on the supported types.
262
+ */
263
+ bindValues(values) {
264
+ if (Array.isArray(values)) {
265
+ for (let i = 0; i < values.length; i++) {
266
+ const paramIndex = i + 1;
267
+ const paramValue = values[i];
268
+ if (paramValue === undefined || paramValue === null)
269
+ continue;
270
+ this.bindValue(paramIndex, paramValue);
271
+ }
272
+ return;
273
+ }
274
+ for (const entry of Object.entries(values)) {
275
+ const paramName = entry[0];
276
+ const paramValue = entry[1];
277
+ if (paramValue === undefined || paramValue === null)
278
+ continue;
279
+ this.bindValue(paramName, paramValue);
280
+ }
281
+ }
282
+ /** Clear any bindings that were previously set on this statement.
283
+ * @throws [IModelError]($common) in case of errors
284
+ */
285
+ clearBindings() {
286
+ const stat = this.stmt.clearBindings();
287
+ if (stat !== core_bentley_1.DbResult.BE_SQLITE_OK)
288
+ throw new core_common_1.IModelError(stat, "Error in clearBindings");
289
+ }
290
+ /** Step this statement to the next row.
291
+ *
292
+ * For **SQL SELECT** statements the method returns
293
+ * - [DbResult.BE_SQLITE_ROW]($core-bentley) if the statement now points successfully to the next row.
294
+ * - [DbResult.BE_SQLITE_DONE]($core-bentley) if the statement has no more rows.
295
+ * - Error status in case of errors.
296
+ *
297
+ * For **SQL INSERT, UPDATE, DELETE** statements the method returns
298
+ * - [DbResult.BE_SQLITE_DONE]($core-bentley) if the statement has been executed successfully.
299
+ * - Error status in case of errors.
300
+ */
301
+ step() {
302
+ return this.stmt.step();
303
+ }
304
+ /** Get the query result's column count (only for SQL SELECT statements). */
305
+ getColumnCount() {
306
+ return this.stmt.getColumnCount();
307
+ }
308
+ /** Get the value for the column at the given index in the query result.
309
+ * @param columnIx Index of SQL column in query result (0-based)
310
+ */
311
+ getValue(columnIx) {
312
+ return new SqliteValue(this.stmt, columnIx);
313
+ }
314
+ /** Determine whether the value of the specified column is null
315
+ * @param colIndex Index of SQL column in query result (0-based)
316
+ */
317
+ isValueNull(colIndex) {
318
+ return this.stmt.isValueNull(colIndex);
319
+ }
320
+ /** Get a size in bytes of a blob or text column
321
+ * @param colIndex Index of SQL column in query result (0-based)
322
+ */
323
+ getColumnBytes(colIndex) {
324
+ return this.stmt.getColumnBytes(colIndex);
325
+ }
326
+ /** Get a value as a blob
327
+ * @param colIndex Index of SQL column in query result (0-based)
328
+ */
329
+ getValueBlob(colIndex) {
330
+ return this.stmt.getValueBlob(colIndex);
331
+ }
332
+ /** Get the value as a blob, or undefined if it is null.
333
+ * @param colIndex Index of SQL column in query result (0-based)
334
+ */
335
+ getValueBlobMaybe(colIndex) {
336
+ return this.isValueNull(colIndex) ? undefined : this.getValueBlob(colIndex);
337
+ }
338
+ /** Get a value as a double
339
+ * @param colIndex Index of SQL column in query result (0-based)
340
+ */
341
+ getValueDouble(colIndex) {
342
+ return this.stmt.getValueDouble(colIndex);
343
+ }
344
+ /** Get the value as an double, or undefined if it is null.
345
+ * @param colIndex Index of SQL column in query result (0-based)
346
+ */
347
+ getValueDoubleMaybe(colIndex) {
348
+ return this.isValueNull(colIndex) ? undefined : this.getValueDouble(colIndex);
349
+ }
350
+ /** Get a value as a integer
351
+ * @param colIndex Index of SQL column in query result (0-based)
352
+ */
353
+ getValueInteger(colIndex) {
354
+ return this.stmt.getValueInteger(colIndex);
355
+ }
356
+ /** Get the value as an integer, or undefined if it is null.
357
+ * @param colIndex Index of SQL column in query result (0-based)
358
+ */
359
+ getValueIntegerMaybe(colIndex) {
360
+ return this.isValueNull(colIndex) ? undefined : this.getValueInteger(colIndex);
361
+ }
362
+ /** Get a value as a string
363
+ * @param colIndex Index of SQL column in query result (0-based)
364
+ */
365
+ getValueString(colIndex) {
366
+ return this.stmt.getValueString(colIndex);
367
+ }
368
+ /** Get the value as a string, or undefined if it is null.
369
+ * @param colIndex Index of SQL column in query result (0-based)
370
+ */
371
+ getValueStringMaybe(colIndex) {
372
+ return this.isValueNull(colIndex) ? undefined : this.getValueString(colIndex);
373
+ }
374
+ /** Get a value as an Id
375
+ * @param colIndex Index of SQL column in query result (0-based)
376
+ */
377
+ getValueId(colIndex) {
378
+ return this.stmt.getValueId(colIndex);
379
+ }
380
+ /** Get a value as a Guid
381
+ * @param colIndex Index of SQL column in query result (0-based)
382
+ */
383
+ getValueGuid(colIndex) {
384
+ return this.stmt.getValueGuid(colIndex);
385
+ }
386
+ /** Get the value as a boolean. Returns `false` if the column is null.
387
+ * @param colIndex Index of SQL column in query result (0-based)
388
+ */
389
+ getValueBoolean(colIndex) {
390
+ return this.isValueNull(colIndex) ? false : 0 !== this.getValueInteger(colIndex);
391
+ }
392
+ /** Get the value of a [julianday](https://www.sqlite.org/lang_datefunc.html) column as a JavaScript `Date`.
393
+ * @param colIndex Index of SQL column in query result (0-based)
394
+ * @beta
395
+ */
396
+ getValueDate(colIndex) {
397
+ return new Date((this.stmt.getValueDouble(colIndex) - 2440587.5) * 86400000); // conversion from julian day ms to unix epoch ms
398
+ }
399
+ /** Get the value as a "props" JSON string, then parse it and return the object
400
+ * @param colIndex Index of SQL column in query result (0-based)
401
+ * @internal
402
+ */
403
+ getProps(colIndex) {
404
+ return JSON.parse(this.getValueString(colIndex));
405
+ }
406
+ /** Get the value as a "props" JSON string, then parse it and return the object.
407
+ * If the column is null, return undefined.
408
+ * @param colIndex Index of SQL column in query result (0-based)
409
+ * @internal
410
+ */
411
+ getPropsMaybe(colIndex) {
412
+ return this.isValueNull(colIndex) ? undefined : this.getProps(colIndex);
413
+ }
414
+ /** Get the current row.
415
+ * The returned row is formatted as JavaScript object where every SELECT clause item becomes a property in the JavaScript object.
416
+ *
417
+ * The SQL select clause item's name becomes the member name of the JavaScript object, **with the first character lowered**.
418
+ *
419
+ * SQLite Type | JavaScript Type
420
+ * --- | ---
421
+ * [SqliteValueType.Null]($backend) | undefined
422
+ * [SqliteValueType.Integer]($backend) | number
423
+ * [SqliteValueType.Double]($backend) | number
424
+ * [SqliteValueType.String]($backend) | string
425
+ * [SqliteValueType.Blob]($backend) | Uint8Array
426
+ */
427
+ getRow() {
428
+ const colCount = this.getColumnCount();
429
+ const row = {};
430
+ const duplicatePropNames = new Map();
431
+ for (let i = 0; i < colCount; i++) {
432
+ const sqliteValue = this.getValue(i);
433
+ if (!sqliteValue.isNull) {
434
+ const propName = SqliteStatement.determineResultRowPropertyName(duplicatePropNames, sqliteValue);
435
+ let val;
436
+ switch (sqliteValue.type) {
437
+ case SqliteValueType.Blob:
438
+ val = sqliteValue.getBlob();
439
+ break;
440
+ case SqliteValueType.Double:
441
+ val = sqliteValue.getDouble();
442
+ break;
443
+ case SqliteValueType.Integer:
444
+ val = sqliteValue.getInteger();
445
+ break;
446
+ case SqliteValueType.String:
447
+ val = sqliteValue.getString();
448
+ break;
449
+ default:
450
+ throw new Error("Unsupported SqliteValueType");
451
+ }
452
+ Object.defineProperty(row, propName, { enumerable: true, configurable: true, writable: true, value: val });
453
+ }
454
+ }
455
+ return row;
456
+ }
457
+ static determineResultRowPropertyName(duplicatePropNames, sqliteValue) {
458
+ let jsName = core_common_1.ECJsNames.toJsName(sqliteValue.columnName);
459
+ // now check duplicates. If there are, append a numeric suffix to the duplicates
460
+ let suffix = duplicatePropNames.get(jsName);
461
+ if (suffix === undefined)
462
+ duplicatePropNames.set(jsName, 0);
463
+ else {
464
+ suffix++;
465
+ duplicatePropNames.set(jsName, suffix);
466
+ jsName += `_${suffix}`;
467
+ }
468
+ return jsName;
469
+ }
470
+ /** Calls step when called as an iterator.
471
+ */
472
+ next() {
473
+ return core_bentley_1.DbResult.BE_SQLITE_ROW === this.step() ? { done: false, value: this.getRow() } : { done: true, value: undefined };
474
+ }
475
+ /** The iterator that will step through the results of this statement. */
476
+ [Symbol.iterator]() { return this; }
477
+ }
478
+ exports.SqliteStatement = SqliteStatement;
479
+ /** Data type of a value in in an SQLite SQL query result.
480
+ * See also:
481
+ * - [SqliteValue]($backend)
482
+ * - [SqliteStatement]($backend)
483
+ * - [SqliteStatement.getValue]($backend)
484
+ * @public
485
+ */
486
+ var SqliteValueType;
487
+ (function (SqliteValueType) {
488
+ // do not change the values of that enum. It must correspond to the respective
489
+ // enum DbValueType in the native BeSQLite API.
490
+ SqliteValueType[SqliteValueType["Integer"] = 1] = "Integer";
491
+ SqliteValueType[SqliteValueType["Double"] = 2] = "Double";
492
+ SqliteValueType[SqliteValueType["String"] = 3] = "String";
493
+ SqliteValueType[SqliteValueType["Blob"] = 4] = "Blob";
494
+ SqliteValueType[SqliteValueType["Null"] = 5] = "Null";
495
+ })(SqliteValueType = exports.SqliteValueType || (exports.SqliteValueType = {}));
496
+ /** Value of a column in a row of an SQLite SQL query result.
497
+ * See also:
498
+ * - [SqliteStatement]($backend)
499
+ * - [SqliteStatement.getValue]($backend)
500
+ * @public
501
+ */
502
+ class SqliteValue {
503
+ constructor(stmt, colIndex) {
504
+ this._stmt = stmt;
505
+ this._colIndex = colIndex;
506
+ }
507
+ /** Indicates whether the value is NULL or not. */
508
+ get isNull() { return this._stmt.isValueNull(this._colIndex); }
509
+ /** Gets the data type of the value. */
510
+ get type() { return this._stmt.getColumnType(this._colIndex); }
511
+ /** Gets the name of the column of the value. */
512
+ get columnName() { return this._stmt.getColumnName(this._colIndex); }
513
+ /** Gets the SqlValue as JavaScript value.
514
+ *
515
+ * SQLite Type | JavaScript Type
516
+ * --- | ---
517
+ * [SqliteValueType.Null]($backend) | undefined
518
+ * [SqliteValueType.Integer]($backend) | number
519
+ * [SqliteValueType.Double]($backend) | number
520
+ * [SqliteValueType.String]($backend) | string
521
+ * [SqliteValueType.Blob]($backend) | Uint8Array
522
+ */
523
+ get value() {
524
+ switch (this.type) {
525
+ case SqliteValueType.Null:
526
+ return undefined;
527
+ case SqliteValueType.Blob:
528
+ return this.getBlob();
529
+ case SqliteValueType.Double:
530
+ return this.getDouble();
531
+ case SqliteValueType.Integer:
532
+ return this.getInteger();
533
+ case SqliteValueType.String:
534
+ return this.getString();
535
+ default:
536
+ throw new Error("Unhandled SqliteValueType");
537
+ }
538
+ }
539
+ /** Get the value as Blob */
540
+ getBlob() { return this._stmt.getValueBlob(this._colIndex); }
541
+ /** Get the value as a double value */
542
+ getDouble() { return this._stmt.getValueDouble(this._colIndex); }
543
+ /** Get the value as a integer value */
544
+ getInteger() { return this._stmt.getValueInteger(this._colIndex); }
545
+ /** Get the value as a string value */
546
+ getString() { return this._stmt.getValueString(this._colIndex); }
547
+ /** Get the value as an Id value */
548
+ getId() { return this._stmt.getValueId(this._colIndex); }
549
+ /** Get the value as a Guid value */
550
+ getGuid() { return this._stmt.getValueGuid(this._colIndex); }
551
+ }
552
+ exports.SqliteValue = SqliteValue;
553
+ /** A cache for previously prepared SqliteStatements.
554
+ * It only holds Statements after they are no longer in use, resetting and clearing their bindings before saving them.
555
+ * When a request to use a statement from the cache is made, it is first removed from the cache.
556
+ * @internal
557
+ */
558
+ class StatementCache {
559
+ constructor(maxCount = 40) {
560
+ this._cache = new core_bentley_1.LRUMap(maxCount);
561
+ }
562
+ get size() { return this._cache.size; }
563
+ addOrDispose(stmt) {
564
+ (0, core_bentley_1.assert)(stmt.isPrepared);
565
+ const existing = this._cache.get(stmt.sql);
566
+ if (existing !== undefined) {
567
+ stmt.dispose(); // we already have a statement with this sql cached, we can't save another one so just dispose it
568
+ return;
569
+ }
570
+ if (this._cache.size >= this._cache.limit) {
571
+ const oldest = this._cache.shift();
572
+ oldest[1].dispose();
573
+ }
574
+ stmt.reset();
575
+ stmt.clearBindings();
576
+ this._cache.set(stmt.sql, stmt);
577
+ }
578
+ findAndRemove(sql) {
579
+ return this._cache.delete(sql);
580
+ }
581
+ clear() {
582
+ this._cache.forEach((stmt) => stmt.dispose());
583
+ this._cache.clear();
584
+ }
585
+ }
586
+ exports.StatementCache = StatementCache;
587
587
  //# sourceMappingURL=SqliteStatement.js.map