@itwin/core-backend 5.14.0 → 5.14.3

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 (46) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/lib/cjs/ECSqlRowExecutor.d.ts +3 -3
  3. package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -1
  4. package/lib/cjs/ECSqlRowExecutor.js +2 -2
  5. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  6. package/lib/cjs/ECSqlStatement.d.ts +5 -0
  7. package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
  8. package/lib/cjs/ECSqlStatement.js +15 -2
  9. package/lib/cjs/ECSqlStatement.js.map +1 -1
  10. package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
  11. package/lib/cjs/ECSqlSyncReader.js +2 -2
  12. package/lib/cjs/ECSqlSyncReader.js.map +1 -1
  13. package/lib/cjs/Element.d.ts +29 -2
  14. package/lib/cjs/Element.d.ts.map +1 -1
  15. package/lib/cjs/Element.js +38 -2
  16. package/lib/cjs/Element.js.map +1 -1
  17. package/lib/esm/ECSqlRowExecutor.d.ts +3 -3
  18. package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -1
  19. package/lib/esm/ECSqlRowExecutor.js +2 -2
  20. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  21. package/lib/esm/ECSqlStatement.d.ts +5 -0
  22. package/lib/esm/ECSqlStatement.d.ts.map +1 -1
  23. package/lib/esm/ECSqlStatement.js +15 -2
  24. package/lib/esm/ECSqlStatement.js.map +1 -1
  25. package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
  26. package/lib/esm/ECSqlSyncReader.js +3 -3
  27. package/lib/esm/ECSqlSyncReader.js.map +1 -1
  28. package/lib/esm/Element.d.ts +29 -2
  29. package/lib/esm/Element.d.ts.map +1 -1
  30. package/lib/esm/Element.js +41 -5
  31. package/lib/esm/Element.js.map +1 -1
  32. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +140 -0
  33. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  34. package/lib/esm/test/element/ElementSubModelInsert.test.d.ts +2 -0
  35. package/lib/esm/test/element/ElementSubModelInsert.test.d.ts.map +1 -0
  36. package/lib/esm/test/element/ElementSubModelInsert.test.js +183 -0
  37. package/lib/esm/test/element/ElementSubModelInsert.test.js.map +1 -0
  38. package/lib/esm/test/hubaccess/CodeSwap.test.js +78 -0
  39. package/lib/esm/test/hubaccess/CodeSwap.test.js.map +1 -1
  40. package/lib/esm/test/imodel/IModelGeolocation.test.js +3 -3
  41. package/lib/esm/test/imodel/IModelGeolocation.test.js.map +1 -1
  42. package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts +2 -0
  43. package/lib/esm/test/standalone/SessionApplyIndirect.test.d.ts.map +1 -0
  44. package/lib/esm/test/standalone/SessionApplyIndirect.test.js +211 -0
  45. package/lib/esm/test/standalone/SessionApplyIndirect.test.js.map +1 -0
  46. package/package.json +16 -16
@@ -1,4 +1,4 @@
1
- import { QueryPropertyMetaData } from "@itwin/core-common";
1
+ import { PropertyMetaDataMap } from "@itwin/core-common";
2
2
  import type { IModelDb } from "./IModelDb";
3
3
  import { ECSqlStatement } from "./ECSqlStatement";
4
4
  import { IModelJsNative } from "@bentley/imodeljs-native";
@@ -59,10 +59,10 @@ export declare class ECSqlRowExecutor implements Disposable {
59
59
  /** Get column metadata directly from the prepared statement.
60
60
  * Call once after `prepareAndBind` — the metadata does not change between rows.
61
61
  * @param options - Native row-adaptor options that influence property naming.
62
- * @returns Array of column metadata.
62
+ * @returns Column metadata owned by the caller.
63
63
  * @internal
64
64
  */
65
- fetchMetadata(options: IModelJsNative.ECSqlRowAdaptorOptions): QueryPropertyMetaData[];
65
+ fetchMetadata(options: IModelJsNative.ECSqlRowAdaptorOptions): PropertyMetaDataMap;
66
66
  /** Prepares the ECSql statement when the caller did not supply one from its cache.
67
67
  * @param ecsql - The ECSql text to prepare.
68
68
  * @returns An `OperationResult` indicating success or failure.
@@ -1 +1 @@
1
- {"version":3,"file":"ECSqlRowExecutor.d.ts","sourceRoot":"","sources":["../../src/ECSqlRowExecutor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYxD;;GAEG;AAEH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAoBlJ;AAkBD;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IAW9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAmB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAkB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAVlI,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,kBAAkB,CAAQ;IAElC;;OAEG;IACH,IAAW,iBAAiB,IAAI,OAAO,CAAoC;gBAGvC,GAAG,EAAE,QAAQ,GAAG,IAAI,EAAmB,KAAK,EAAE,cAAc,EAAmB,eAAe,EAAE,MAAM;IAQ1I;;;;OAIG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;IACI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAS/B;;;;;;OAMG;IACI,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAazD;;;;;;;;;;;OAWG;IACI,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,sBAAsB,GAAG,GAAG;IAWvE;;;;;OAKG;IACI,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,sBAAsB,GAAG,qBAAqB,EAAE;IAU7F;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;OAIG;IACH,OAAO,CAAC,UAAU;CAcnB"}
1
+ {"version":3,"file":"ECSqlRowExecutor.d.ts","sourceRoot":"","sources":["../../src/ECSqlRowExecutor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYxD;;GAEG;AAEH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAoBlJ;AAkBD;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IAW9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAmB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAAkB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAVlI,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,kBAAkB,CAAQ;IAElC;;OAEG;IACH,IAAW,iBAAiB,IAAI,OAAO,CAAoC;gBAGvC,GAAG,EAAE,QAAQ,GAAG,IAAI,EAAmB,KAAK,EAAE,cAAc,EAAmB,eAAe,EAAE,MAAM;IAQ1I;;;;OAIG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;IACI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;IAS/B;;;;;;OAMG;IACI,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAazD;;;;;;;;;;;OAWG;IACI,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,sBAAsB,GAAG,GAAG;IAWvE;;;;;OAKG;IACI,aAAa,CAAC,OAAO,EAAE,cAAc,CAAC,sBAAsB,GAAG,mBAAmB;IAUzF;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;OAIG;IACH,OAAO,CAAC,UAAU;CAcnB"}
@@ -136,13 +136,13 @@ export class ECSqlRowExecutor {
136
136
  /** Get column metadata directly from the prepared statement.
137
137
  * Call once after `prepareAndBind` — the metadata does not change between rows.
138
138
  * @param options - Native row-adaptor options that influence property naming.
139
- * @returns Array of column metadata.
139
+ * @returns Column metadata owned by the caller.
140
140
  * @internal
141
141
  */
142
142
  fetchMetadata(options) {
143
143
  if (this._isDisposed || !this._stmt.isPrepared)
144
144
  throw new IModelError(DbResult.BE_SQLITE_ERROR, statementNotPreparedMessage);
145
- return this._stmt.getMetadata(options).properties;
145
+ return this._stmt.getMetadata(options);
146
146
  }
147
147
  // --------------------------------------------------------------------------------------------
148
148
  // Execution phases
@@ -1 +1 @@
1
- {"version":3,"file":"ECSqlRowExecutor.js","sourceRoot":"","sources":["../../src/ECSqlRowExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IModelError, QueryPropertyMetaData } from \"@itwin/core-common\";\r\nimport type { IModelDb } from \"./IModelDb\";\r\nimport { ECSqlStatement } from \"./ECSqlStatement\";\r\nimport { BentleyError, DbResult, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { _nativeDb } from \"./internal/Symbols\";\r\nimport type { ECDb } from \"./ECDb\";\r\nimport type { StatementCache } from \"./SqliteStatement\";\r\n\r\nconst statementNotPreparedMessage = \"Statement is not prepared. Likely cause: the db was closed before step is called or the ECSqlSyncReader is used outside the context of the callback passed to withQueryReader.\";\r\n\r\nfunction logStatementCleanupError(loggerCategory: string, message: string, error: unknown): void {\r\n try {\r\n Logger.logTrace(loggerCategory, message, () => ({ error: BentleyError.getErrorMessage(error) }));\r\n } catch {\r\n // Cleanup diagnostics must not replace the original query error.\r\n }\r\n}\r\n\r\n/** Returns a statement to its cache, falling back to direct disposal without throwing.\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-deprecated\r\nexport function releaseECSqlStatement(stmt: ECSqlStatement, cache: StatementCache<ECSqlStatement>, loggerCategory: string, canCache: boolean): void {\r\n if (!canCache || !stmt.isPrepared) {\r\n try {\r\n stmt[Symbol.dispose]();\r\n } catch (error) {\r\n logStatementCleanupError(loggerCategory, \"Failed to dispose an ECSQL statement that could not be cached.\", error);\r\n }\r\n return;\r\n }\r\n\r\n try {\r\n cache.addOrDispose(stmt);\r\n } catch (error) {\r\n try {\r\n stmt[Symbol.dispose]();\r\n } catch (disposeError) {\r\n logStatementCleanupError(loggerCategory, \"Failed to dispose an ECSQL statement after it could not be returned to the statement cache.\", disposeError);\r\n }\r\n logStatementCleanupError(loggerCategory, \"Failed to return an ECSQL statement to the statement cache; attempted direct disposal instead.\", error);\r\n }\r\n}\r\n\r\n// --------------------------------------------------------------------------------------------\r\n// Internal result types\r\n// --------------------------------------------------------------------------------------------\r\n\r\n/** Result of an internal operation that may fail with a message.\r\n * @internal\r\n */\r\ninterface OperationResult {\r\n isSuccessful: boolean;\r\n message?: string;\r\n}\r\n\r\n// --------------------------------------------------------------------------------------------\r\n// ECSqlRowExecutor\r\n// --------------------------------------------------------------------------------------------\r\n\r\n/**\r\n * Executes ECSql queries one row at a time against an IModelDb, maintaining statement state between\r\n * successive calls so the caller can page through results via offset-based requests.\r\n * @internal\r\n */\r\nexport class ECSqlRowExecutor implements Disposable {\r\n private _removeListener: () => void;\r\n private _isDisposed = false;\r\n private _canCacheStatement = true;\r\n\r\n /** Whether the statement completed preparation and can be returned to its cache.\r\n * @internal\r\n */\r\n public get canCacheStatement(): boolean { return this._canCacheStatement; }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n public constructor(private readonly _db: IModelDb | ECDb, private readonly _stmt: ECSqlStatement, private readonly _loggerCategory: string) {\r\n this._removeListener = this._db.onBeforeClose.addListener(() => this.cleanup());\r\n }\r\n\r\n // --------------------------------------------------------------------------------------------\r\n // Lifecycle\r\n // --------------------------------------------------------------------------------------------\r\n\r\n /** Disposes the currently held statement without returning it to the cache.\r\n * Invoked when the db signals it is closing (the statement cache is cleared on close, so the\r\n * checked-out statement must be disposed directly to avoid a use-after-free or double dispose).\r\n * @internal\r\n */\r\n private cleanup(): void {\r\n this._isDisposed = true;\r\n try {\r\n this._stmt[Symbol.dispose]();\r\n } catch (error) {\r\n logStatementCleanupError(this._loggerCategory, \"Failed to dispose an ECSQL statement while closing its database.\", error);\r\n }\r\n }\r\n\r\n /** Removes the database-close listener owned by this row executor.\r\n * @internal\r\n */\r\n public [Symbol.dispose](): void {\r\n this._isDisposed = true;\r\n this._removeListener();\r\n }\r\n\r\n // --------------------------------------------------------------------------------------------\r\n // Core execution\r\n // --------------------------------------------------------------------------------------------\r\n\r\n /** Prepare the statement and bind parameters in one step.\r\n * Call once during reader initialization — avoids the per-row `ensureStatementReady` check.\r\n * @param query - The ECSql text to prepare.\r\n * @param args - Optional bind parameters.\r\n * @throws IModelError on preparation or binding failure.\r\n * @internal\r\n */\r\n public prepareAndBind(query: string, args?: object): void {\r\n\r\n const prepResult = this.prepareStmt(query);\r\n if (!prepResult.isSuccessful)\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, prepResult.message ?? `Failed to prepare statement: ${query}`);\r\n\r\n if (args) {\r\n const bindResult = this.bindValues(args);\r\n if (!bindResult.isSuccessful)\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, bindResult.message ?? `Failed to bind values: ${query}`);\r\n }\r\n }\r\n\r\n /** Fast-path: step the cursor once and return row data directly.\r\n *\r\n * Returns the row data array if a row is available.\r\n * Returns `undefined` if the result set is exhausted (DONE).\r\n *\r\n * This avoids all intermediate object allocations (StepResult, RowDataResult,\r\n * DbRuntimeStats, DbQueryResponse) that the general `execute()` path creates per row.\r\n *\r\n * @param options - Native row-adaptor options (should be cached and reused across rows).\r\n * @throws IModelError on step failure or row extraction failure.\r\n * @internal\r\n */\r\n public stepNextRow(options: IModelJsNative.ECSqlRowAdaptorOptions): any {\r\n if (this._isDisposed || !this._stmt.isPrepared)\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, statementNotPreparedMessage);\r\n const stepResult = this._stmt.step();\r\n if (stepResult === DbResult.BE_SQLITE_ROW)\r\n return this._stmt.toRow(options).data;\r\n if (stepResult === DbResult.BE_SQLITE_DONE)\r\n return undefined;\r\n throw new IModelError(stepResult, `Step failed with code ${stepResult}`);\r\n }\r\n\r\n /** Get column metadata directly from the prepared statement.\r\n * Call once after `prepareAndBind` — the metadata does not change between rows.\r\n * @param options - Native row-adaptor options that influence property naming.\r\n * @returns Array of column metadata.\r\n * @internal\r\n */\r\n public fetchMetadata(options: IModelJsNative.ECSqlRowAdaptorOptions): QueryPropertyMetaData[] {\r\n if (this._isDisposed || !this._stmt.isPrepared)\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, statementNotPreparedMessage);\r\n return this._stmt.getMetadata(options).properties;\r\n }\r\n\r\n // --------------------------------------------------------------------------------------------\r\n // Execution phases\r\n // --------------------------------------------------------------------------------------------\r\n\r\n /** Prepares the ECSql statement when the caller did not supply one from its cache.\r\n * @param ecsql - The ECSql text to prepare.\r\n * @returns An `OperationResult` indicating success or failure.\r\n * @internal\r\n */\r\n private prepareStmt(ecsql: string): OperationResult {\r\n if (this._stmt.isPrepared)\r\n return { isSuccessful: true };\r\n\r\n try {\r\n this._stmt.prepare(this._db[_nativeDb], ecsql);\r\n return { isSuccessful: true };\r\n } catch (error: any) {\r\n this._canCacheStatement = false;\r\n try {\r\n this._stmt[Symbol.dispose]();\r\n } catch (disposeError) {\r\n logStatementCleanupError(this._loggerCategory, \"Failed to dispose an ECSQL statement after preparation failed.\", disposeError);\r\n }\r\n return { isSuccessful: false, message: error.message };\r\n }\r\n }\r\n\r\n /** Binds the supplied parameter values to the prepared statement.\r\n * @param args - The parameter object to bind, or `undefined` when no parameters are needed.\r\n * @returns An `OperationResult` indicating success or failure.\r\n * @internal\r\n */\r\n private bindValues(args: object | undefined): OperationResult {\r\n try {\r\n if (args === undefined)\r\n return { isSuccessful: true };\r\n\r\n if (!this._stmt.isPrepared)\r\n return { isSuccessful: false, message: statementNotPreparedMessage };\r\n\r\n this._stmt.bindParams(args);\r\n return { isSuccessful: true };\r\n } catch (error: any) {\r\n return { isSuccessful: false, message: error.message };\r\n }\r\n }\r\n}"]}
1
+ {"version":3,"file":"ECSqlRowExecutor.js","sourceRoot":"","sources":["../../src/ECSqlRowExecutor.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { IModelError, PropertyMetaDataMap } from \"@itwin/core-common\";\r\nimport type { IModelDb } from \"./IModelDb\";\r\nimport { ECSqlStatement } from \"./ECSqlStatement\";\r\nimport { BentleyError, DbResult, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { _nativeDb } from \"./internal/Symbols\";\r\nimport type { ECDb } from \"./ECDb\";\r\nimport type { StatementCache } from \"./SqliteStatement\";\r\n\r\nconst statementNotPreparedMessage = \"Statement is not prepared. Likely cause: the db was closed before step is called or the ECSqlSyncReader is used outside the context of the callback passed to withQueryReader.\";\r\n\r\nfunction logStatementCleanupError(loggerCategory: string, message: string, error: unknown): void {\r\n try {\r\n Logger.logTrace(loggerCategory, message, () => ({ error: BentleyError.getErrorMessage(error) }));\r\n } catch {\r\n // Cleanup diagnostics must not replace the original query error.\r\n }\r\n}\r\n\r\n/** Returns a statement to its cache, falling back to direct disposal without throwing.\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-deprecated\r\nexport function releaseECSqlStatement(stmt: ECSqlStatement, cache: StatementCache<ECSqlStatement>, loggerCategory: string, canCache: boolean): void {\r\n if (!canCache || !stmt.isPrepared) {\r\n try {\r\n stmt[Symbol.dispose]();\r\n } catch (error) {\r\n logStatementCleanupError(loggerCategory, \"Failed to dispose an ECSQL statement that could not be cached.\", error);\r\n }\r\n return;\r\n }\r\n\r\n try {\r\n cache.addOrDispose(stmt);\r\n } catch (error) {\r\n try {\r\n stmt[Symbol.dispose]();\r\n } catch (disposeError) {\r\n logStatementCleanupError(loggerCategory, \"Failed to dispose an ECSQL statement after it could not be returned to the statement cache.\", disposeError);\r\n }\r\n logStatementCleanupError(loggerCategory, \"Failed to return an ECSQL statement to the statement cache; attempted direct disposal instead.\", error);\r\n }\r\n}\r\n\r\n// --------------------------------------------------------------------------------------------\r\n// Internal result types\r\n// --------------------------------------------------------------------------------------------\r\n\r\n/** Result of an internal operation that may fail with a message.\r\n * @internal\r\n */\r\ninterface OperationResult {\r\n isSuccessful: boolean;\r\n message?: string;\r\n}\r\n\r\n// --------------------------------------------------------------------------------------------\r\n// ECSqlRowExecutor\r\n// --------------------------------------------------------------------------------------------\r\n\r\n/**\r\n * Executes ECSql queries one row at a time against an IModelDb, maintaining statement state between\r\n * successive calls so the caller can page through results via offset-based requests.\r\n * @internal\r\n */\r\nexport class ECSqlRowExecutor implements Disposable {\r\n private _removeListener: () => void;\r\n private _isDisposed = false;\r\n private _canCacheStatement = true;\r\n\r\n /** Whether the statement completed preparation and can be returned to its cache.\r\n * @internal\r\n */\r\n public get canCacheStatement(): boolean { return this._canCacheStatement; }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n public constructor(private readonly _db: IModelDb | ECDb, private readonly _stmt: ECSqlStatement, private readonly _loggerCategory: string) {\r\n this._removeListener = this._db.onBeforeClose.addListener(() => this.cleanup());\r\n }\r\n\r\n // --------------------------------------------------------------------------------------------\r\n // Lifecycle\r\n // --------------------------------------------------------------------------------------------\r\n\r\n /** Disposes the currently held statement without returning it to the cache.\r\n * Invoked when the db signals it is closing (the statement cache is cleared on close, so the\r\n * checked-out statement must be disposed directly to avoid a use-after-free or double dispose).\r\n * @internal\r\n */\r\n private cleanup(): void {\r\n this._isDisposed = true;\r\n try {\r\n this._stmt[Symbol.dispose]();\r\n } catch (error) {\r\n logStatementCleanupError(this._loggerCategory, \"Failed to dispose an ECSQL statement while closing its database.\", error);\r\n }\r\n }\r\n\r\n /** Removes the database-close listener owned by this row executor.\r\n * @internal\r\n */\r\n public [Symbol.dispose](): void {\r\n this._isDisposed = true;\r\n this._removeListener();\r\n }\r\n\r\n // --------------------------------------------------------------------------------------------\r\n // Core execution\r\n // --------------------------------------------------------------------------------------------\r\n\r\n /** Prepare the statement and bind parameters in one step.\r\n * Call once during reader initialization — avoids the per-row `ensureStatementReady` check.\r\n * @param query - The ECSql text to prepare.\r\n * @param args - Optional bind parameters.\r\n * @throws IModelError on preparation or binding failure.\r\n * @internal\r\n */\r\n public prepareAndBind(query: string, args?: object): void {\r\n\r\n const prepResult = this.prepareStmt(query);\r\n if (!prepResult.isSuccessful)\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, prepResult.message ?? `Failed to prepare statement: ${query}`);\r\n\r\n if (args) {\r\n const bindResult = this.bindValues(args);\r\n if (!bindResult.isSuccessful)\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, bindResult.message ?? `Failed to bind values: ${query}`);\r\n }\r\n }\r\n\r\n /** Fast-path: step the cursor once and return row data directly.\r\n *\r\n * Returns the row data array if a row is available.\r\n * Returns `undefined` if the result set is exhausted (DONE).\r\n *\r\n * This avoids all intermediate object allocations (StepResult, RowDataResult,\r\n * DbRuntimeStats, DbQueryResponse) that the general `execute()` path creates per row.\r\n *\r\n * @param options - Native row-adaptor options (should be cached and reused across rows).\r\n * @throws IModelError on step failure or row extraction failure.\r\n * @internal\r\n */\r\n public stepNextRow(options: IModelJsNative.ECSqlRowAdaptorOptions): any {\r\n if (this._isDisposed || !this._stmt.isPrepared)\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, statementNotPreparedMessage);\r\n const stepResult = this._stmt.step();\r\n if (stepResult === DbResult.BE_SQLITE_ROW)\r\n return this._stmt.toRow(options).data;\r\n if (stepResult === DbResult.BE_SQLITE_DONE)\r\n return undefined;\r\n throw new IModelError(stepResult, `Step failed with code ${stepResult}`);\r\n }\r\n\r\n /** Get column metadata directly from the prepared statement.\r\n * Call once after `prepareAndBind` — the metadata does not change between rows.\r\n * @param options - Native row-adaptor options that influence property naming.\r\n * @returns Column metadata owned by the caller.\r\n * @internal\r\n */\r\n public fetchMetadata(options: IModelJsNative.ECSqlRowAdaptorOptions): PropertyMetaDataMap {\r\n if (this._isDisposed || !this._stmt.isPrepared)\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, statementNotPreparedMessage);\r\n return this._stmt.getMetadata(options);\r\n }\r\n\r\n // --------------------------------------------------------------------------------------------\r\n // Execution phases\r\n // --------------------------------------------------------------------------------------------\r\n\r\n /** Prepares the ECSql statement when the caller did not supply one from its cache.\r\n * @param ecsql - The ECSql text to prepare.\r\n * @returns An `OperationResult` indicating success or failure.\r\n * @internal\r\n */\r\n private prepareStmt(ecsql: string): OperationResult {\r\n if (this._stmt.isPrepared)\r\n return { isSuccessful: true };\r\n\r\n try {\r\n this._stmt.prepare(this._db[_nativeDb], ecsql);\r\n return { isSuccessful: true };\r\n } catch (error: any) {\r\n this._canCacheStatement = false;\r\n try {\r\n this._stmt[Symbol.dispose]();\r\n } catch (disposeError) {\r\n logStatementCleanupError(this._loggerCategory, \"Failed to dispose an ECSQL statement after preparation failed.\", disposeError);\r\n }\r\n return { isSuccessful: false, message: error.message };\r\n }\r\n }\r\n\r\n /** Binds the supplied parameter values to the prepared statement.\r\n * @param args - The parameter object to bind, or `undefined` when no parameters are needed.\r\n * @returns An `OperationResult` indicating success or failure.\r\n * @internal\r\n */\r\n private bindValues(args: object | undefined): OperationResult {\r\n try {\r\n if (args === undefined)\r\n return { isSuccessful: true };\r\n\r\n if (!this._stmt.isPrepared)\r\n return { isSuccessful: false, message: statementNotPreparedMessage };\r\n\r\n this._stmt.bindParams(args);\r\n return { isSuccessful: true };\r\n } catch (error: any) {\r\n return { isSuccessful: false, message: error.message };\r\n }\r\n }\r\n}"]}
@@ -62,6 +62,10 @@ export declare class ECSqlStatement implements IterableIterator<any>, Disposable
62
62
  private _stmt;
63
63
  private _sql;
64
64
  private _props;
65
+ /** Column metadata for the prepared statement, keyed by row-adaptor options. Native metadata depends only on the
66
+ * prepared statement and those options, so it is reused until the statement is re-prepared or disposed.
67
+ */
68
+ private _metadataCache?;
65
69
  get sql(): string;
66
70
  /** Check if this statement has been prepared successfully or not */
67
71
  get isPrepared(): boolean;
@@ -246,6 +250,7 @@ export declare class ECSqlStatement implements IterableIterator<any>, Disposable
246
250
  toRow(args: IModelJsNative.ECSqlRowAdaptorOptions): any;
247
251
  /**
248
252
  * Used by ECSqlRowExecutor to get metadata as json.
253
+ * The native metadata is cached per row-adaptor options; each call returns copies so callers cannot alter the cache.
249
254
  * @internal */
250
255
  getMetadata(args: IModelJsNative.ECSqlRowAdaptorOptions): PropertyMetaDataMap;
251
256
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ECSqlStatement.d.ts","sourceRoot":"","sources":["../../src/ECSqlStatement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ECSqlStatement.d.ts","sourceRoot":"","sources":["../../src/ECSqlStatement.ts"],"names":[],"mappings":"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"}
@@ -57,6 +57,10 @@ export class ECSqlStatement {
57
57
  _stmt;
58
58
  _sql;
59
59
  _props = new PropertyMetaDataMap([]);
60
+ /** Column metadata for the prepared statement, keyed by row-adaptor options. Native metadata depends only on the
61
+ * prepared statement and those options, so it is reused until the statement is re-prepared or disposed.
62
+ */
63
+ _metadataCache;
60
64
  get sql() { return this._sql; } // eslint-disable-line @typescript-eslint/no-non-null-assertion
61
65
  /** Check if this statement has been prepared successfully or not */
62
66
  get isPrepared() { return !!this._stmt; }
@@ -85,6 +89,7 @@ export class ECSqlStatement {
85
89
  if (this.isPrepared)
86
90
  throw new Error("ECSqlStatement is already prepared");
87
91
  this._sql = ecsql;
92
+ this._metadataCache = undefined;
88
93
  this._stmt = new IModelNative.platform.ECSqlStatement();
89
94
  return this._stmt.prepare(db, ecsql, logErrors);
90
95
  }
@@ -106,6 +111,7 @@ export class ECSqlStatement {
106
111
  * > Do not call this method directly on a statement that is being managed by a statement cache.
107
112
  */
108
113
  [Symbol.dispose]() {
114
+ this._metadataCache = undefined;
109
115
  if (this._stmt) {
110
116
  this._stmt.dispose(); // free native statement
111
117
  this._stmt = undefined;
@@ -324,12 +330,19 @@ export class ECSqlStatement {
324
330
  }
325
331
  /**
326
332
  * Used by ECSqlRowExecutor to get metadata as json.
333
+ * The native metadata is cached per row-adaptor options; each call returns copies so callers cannot alter the cache.
327
334
  * @internal */
328
335
  getMetadata(args) {
329
336
  if (!this._stmt)
330
337
  throw new Error("ECSqlStatement is not prepared");
331
- const resp = this._stmt.getMetadata(args);
332
- return new PropertyMetaDataMap(resp.meta);
338
+ const key = `${args.abbreviateBlobs}|${args.classIdsToClassNames}|${args.useJsName}|${args.doNotConvertClassIdsToClassNamesWhenAliased}`;
339
+ this._metadataCache ??= new Map();
340
+ let properties = this._metadataCache.get(key);
341
+ if (!properties) {
342
+ properties = new PropertyMetaDataMap(this._stmt.getMetadata(args).meta).properties;
343
+ this._metadataCache.set(key, properties);
344
+ }
345
+ return new PropertyMetaDataMap(properties.map((property) => ({ ...property })));
333
346
  }
334
347
  /**
335
348
  * Used by ECSqlRowExecutor to bind params to the statement.