@itwin/core-backend 5.12.0-dev.8 → 5.13.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/lib/cjs/ClassRegistry.d.ts.map +1 -1
  3. package/lib/cjs/ClassRegistry.js +1 -2
  4. package/lib/cjs/ClassRegistry.js.map +1 -1
  5. package/lib/cjs/ECDb.d.ts.map +1 -1
  6. package/lib/cjs/ECDb.js +8 -3
  7. package/lib/cjs/ECDb.js.map +1 -1
  8. package/lib/cjs/ECSqlRowExecutor.d.ts +23 -10
  9. package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -1
  10. package/lib/cjs/ECSqlRowExecutor.js +77 -15
  11. package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
  12. package/lib/cjs/IModelDb.d.ts +20 -8
  13. package/lib/cjs/IModelDb.d.ts.map +1 -1
  14. package/lib/cjs/IModelDb.js +83 -54
  15. package/lib/cjs/IModelDb.js.map +1 -1
  16. package/lib/cjs/IpcHost.d.ts +26 -0
  17. package/lib/cjs/IpcHost.d.ts.map +1 -1
  18. package/lib/cjs/IpcHost.js +68 -61
  19. package/lib/cjs/IpcHost.js.map +1 -1
  20. package/lib/cjs/Relationship.d.ts.map +1 -1
  21. package/lib/cjs/Relationship.js +13 -7
  22. package/lib/cjs/Relationship.js.map +1 -1
  23. package/lib/cjs/SQLiteDb.d.ts +43 -0
  24. package/lib/cjs/SQLiteDb.d.ts.map +1 -1
  25. package/lib/cjs/SQLiteDb.js +51 -0
  26. package/lib/cjs/SQLiteDb.js.map +1 -1
  27. package/lib/cjs/ViewStore.js +1 -1
  28. package/lib/cjs/ViewStore.js.map +1 -1
  29. package/lib/cjs/internal/ECSqlInstanceReshaper.d.ts +23 -0
  30. package/lib/cjs/internal/ECSqlInstanceReshaper.d.ts.map +1 -0
  31. package/lib/cjs/internal/ECSqlInstanceReshaper.js +125 -0
  32. package/lib/cjs/internal/ECSqlInstanceReshaper.js.map +1 -0
  33. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  34. package/lib/cjs/internal/annotations/fields.js +9 -4
  35. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  36. package/lib/esm/ClassRegistry.d.ts.map +1 -1
  37. package/lib/esm/ClassRegistry.js +1 -2
  38. package/lib/esm/ClassRegistry.js.map +1 -1
  39. package/lib/esm/ECDb.d.ts.map +1 -1
  40. package/lib/esm/ECDb.js +9 -4
  41. package/lib/esm/ECDb.js.map +1 -1
  42. package/lib/esm/ECSqlRowExecutor.d.ts +23 -10
  43. package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -1
  44. package/lib/esm/ECSqlRowExecutor.js +77 -16
  45. package/lib/esm/ECSqlRowExecutor.js.map +1 -1
  46. package/lib/esm/IModelDb.d.ts +20 -8
  47. package/lib/esm/IModelDb.d.ts.map +1 -1
  48. package/lib/esm/IModelDb.js +85 -56
  49. package/lib/esm/IModelDb.js.map +1 -1
  50. package/lib/esm/IpcHost.d.ts +26 -0
  51. package/lib/esm/IpcHost.d.ts.map +1 -1
  52. package/lib/esm/IpcHost.js +70 -63
  53. package/lib/esm/IpcHost.js.map +1 -1
  54. package/lib/esm/Relationship.d.ts.map +1 -1
  55. package/lib/esm/Relationship.js +13 -7
  56. package/lib/esm/Relationship.js.map +1 -1
  57. package/lib/esm/SQLiteDb.d.ts +43 -0
  58. package/lib/esm/SQLiteDb.d.ts.map +1 -1
  59. package/lib/esm/SQLiteDb.js +51 -0
  60. package/lib/esm/SQLiteDb.js.map +1 -1
  61. package/lib/esm/ViewStore.js +1 -1
  62. package/lib/esm/ViewStore.js.map +1 -1
  63. package/lib/esm/internal/ECSqlInstanceReshaper.d.ts +23 -0
  64. package/lib/esm/internal/ECSqlInstanceReshaper.d.ts.map +1 -0
  65. package/lib/esm/internal/ECSqlInstanceReshaper.js +120 -0
  66. package/lib/esm/internal/ECSqlInstanceReshaper.js.map +1 -0
  67. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  68. package/lib/esm/internal/annotations/fields.js +9 -4
  69. package/lib/esm/internal/annotations/fields.js.map +1 -1
  70. package/lib/esm/test/IpcHost.test.js +232 -1
  71. package/lib/esm/test/IpcHost.test.js.map +1 -1
  72. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +139 -1
  73. package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
  74. package/lib/esm/test/imodel/IModel.test.js +20 -0
  75. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  76. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.d.ts +2 -0
  77. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.d.ts.map +1 -0
  78. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.js +289 -0
  79. package/lib/esm/test/internal/ECSqlInstanceReshaper.test.js.map +1 -0
  80. package/lib/esm/test/schema/ClassRegistry.test.js +2 -2
  81. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  82. package/lib/esm/test/schema/SchemaViewFragmentLoading.test.d.ts +2 -0
  83. package/lib/esm/test/schema/SchemaViewFragmentLoading.test.d.ts.map +1 -0
  84. package/lib/esm/test/schema/SchemaViewFragmentLoading.test.js +546 -0
  85. package/lib/esm/test/schema/SchemaViewFragmentLoading.test.js.map +1 -0
  86. package/lib/esm/test/schema/SchemaViewLifecycle.test.js +2 -2
  87. package/lib/esm/test/schema/SchemaViewLifecycle.test.js.map +1 -1
  88. package/lib/esm/test/standalone/MergeConflict.test.js +1 -1
  89. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  90. package/lib/esm/test/standalone/SQLiteDb.test.d.ts +1 -1
  91. package/lib/esm/test/standalone/SQLiteDb.test.d.ts.map +1 -1
  92. package/lib/esm/test/standalone/SQLiteDb.test.js +93 -1
  93. package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
  94. package/lib/esm/test/standalone/ViewStoreDb.test.js +30 -0
  95. package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
  96. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"IpcHost.test.js","sourceRoot":"","sources":["../../../src/test/IpcHost.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as sinon from \"sinon\";\nimport { expect } from \"chai\";\nimport { BentleyError, IModelStatus } from \"@itwin/core-bentley\";\nimport { IpcInvokeReturn, IpcSocketBackend } from \"@itwin/core-common\";\nimport { IpcHandler, IpcHost } from \"../IpcHost\";\n\ninterface MockIpcInterface {\n mockMethod: () => string;\n throwNestedError: () => never;\n throwCircularError: () => never;\n throwErrorWithNativeCause: () => never;\n throwBentleyErrorWithFunctionMetaData: () => never;\n throwBentleyErrorWithObjectMetaData: () => never;\n throwNestedBentleyErrorWithFunctionMetaData: () => never;\n throwErrorWithFunctionProperty: () => never;\n throwErrorWithSymbolProperty: () => never;\n throwErrorWithDateProperty: () => never;\n throwErrorWithClassInstanceProperty: () => never;\n throwErrorWithMixedArray: () => never;\n}\n\nclass OuterError extends Error {\n public readonly context: { cause: Error };\n public readonly errors: Error[];\n constructor(public readonly originalError: Error) {\n super(\"outer\");\n this.context = { cause: originalError };\n this.errors = [new Error(\"array-child-1\"), new Error(\"array-child-2\")];\n }\n}\n\nclass MockIpcHandler extends IpcHandler implements MockIpcInterface {\n public override get channelName() { return \"mock-channel\"; }\n\n public mockMethod(): string {\n return \"mock-value\";\n }\n\n public throwNestedError(): never {\n const inner = new Error(\"inner-message\");\n throw new OuterError(inner);\n }\n\n public throwCircularError(): never {\n const err = new Error(\"circular\") as any;\n err.cause = err; // circular reference\n throw err;\n }\n\n public throwErrorWithNativeCause(): never {\n throw new Error(\"native-cause-outer\", { cause: new Error(\"native-cause-inner\") });\n }\n\n public throwBentleyErrorWithFunctionMetaData(): never {\n throw new BentleyError(IModelStatus.BadArg, \"bentley-fn-meta\", () => ({ detail: \"computed\" }));\n }\n\n public throwBentleyErrorWithObjectMetaData(): never {\n throw new BentleyError(IModelStatus.BadArg, \"bentley-obj-meta\", { detail: \"static\" });\n }\n\n public throwNestedBentleyErrorWithFunctionMetaData(): never {\n const inner = new BentleyError(IModelStatus.BadArg, \"inner-bentley\", () => ({ detail: \"nested-computed\" }));\n const outer = new Error(\"outer\") as any;\n outer.cause = inner;\n throw outer;\n }\n\n public throwErrorWithFunctionProperty(): never {\n const err = new Error(\"fn-prop\") as any;\n err.retry = () => {};\n throw err;\n }\n\n public throwErrorWithSymbolProperty(): never {\n const err = new Error(\"sym-prop\") as any;\n err[Symbol(\"tag\")] = \"should-be-dropped\";\n throw err;\n }\n\n public throwErrorWithDateProperty(): never {\n const err = new Error(\"date-prop\") as any;\n err.timestamp = new Date(\"2024-01-01\");\n throw err;\n }\n\n public throwErrorWithClassInstanceProperty(): never {\n const err = new Error(\"class-instance-prop\") as any;\n err.request = new URL(\"https://example.com\"); // arbitrary non-plain class instance\n throw err;\n }\n\n public throwErrorWithMixedArray(): never {\n const err = new Error(\"mixed-array\") as any;\n err.items = [\"string-value\", 42, new Date(\"2024-01-01\"), new URL(\"https://example.com\"), new Error(\"array-error\")];\n throw err;\n }\n\n #privateFunction(): void { }\n}\n\ndescribe(\"IpcHost\", () => {\n let socket: sinon.SinonStubbedInstance<IpcSocketBackend>;\n\n beforeEach(async () => {\n socket = {\n send: sinon.stub(),\n addListener: sinon.stub(),\n removeListener: sinon.stub(),\n handle: sinon.stub(),\n };\n\n await IpcHost.startup({ ipcHost: { socket } });\n });\n\n describe(\"IpcHandler\", () => {\n let handler: (...args: any[]) => Promise<IpcInvokeReturn>;\n\n beforeEach(() => {\n MockIpcHandler.register();\n const handleCall = socket.handle.getCalls().find((call) => call.args[0] === \"itwin.mock-channel\")!;\n expect(handleCall).to.not.be.undefined;\n handler = handleCall.args[1];\n });\n\n it(\"should call public methods\", async () => {\n const ipcReturn = await handler(undefined, \"mockMethod\");\n expect(ipcReturn.result).to.equal(\"mock-value\");\n expect(ipcReturn.error).to.be.undefined;\n });\n\n it(\"should not call private methods\", async () => {\n const ipcReturn = await handler(undefined, \"#privateFunction\");\n expect(ipcReturn.result).to.be.undefined;\n expect(ipcReturn.error).to.not.be.undefined;\n });\n\n it(\"should not call methods inherited from Object\", async () => {\n const ipcReturn = await handler(undefined, \"toString\");\n expect(ipcReturn.result).to.be.undefined;\n expect(ipcReturn.error).to.not.be.undefined;\n });\n\n it(\"should serialize nested Error properties preserving message and stack\", async () => {\n const ipcReturn = await handler(undefined, \"throwNestedError\");\n const error = ipcReturn.error as any;\n // Top-level error\n expect(error.message).to.equal(\"outer\");\n expect(error.stack).to.be.a(\"string\");\n // Direct Error property\n expect(error.originalError.message).to.equal(\"inner-message\");\n expect(error.originalError.stack).to.be.a(\"string\");\n // Error nested inside a plain-object property\n expect(error.context.cause.message).to.equal(\"inner-message\");\n expect(error.context.cause.stack).to.be.a(\"string\");\n // Array of Errors stays an array\n expect(Array.isArray(error.errors)).to.be.true;\n expect(error.errors[0].message).to.equal(\"array-child-1\");\n expect(error.errors[1].message).to.equal(\"array-child-2\");\n });\n\n it(\"should omit stack on nested Errors when IpcHost.noStack is set\", async () => {\n const originalNoStack = IpcHost.noStack;\n IpcHost.noStack = true;\n try {\n const ipcReturn = await handler(undefined, \"throwNestedError\");\n const error = ipcReturn.error as any;\n expect(error.stack).to.be.undefined;\n expect(error.originalError.stack).to.be.undefined;\n expect(error.context.cause.stack).to.be.undefined;\n expect(error.errors[0].stack).to.be.undefined;\n expect(error.errors[1].stack).to.be.undefined;\n } finally {\n IpcHost.noStack = originalNoStack;\n }\n });\n\n it(\"should not infinitely recurse on circular Error references\", async () => {\n const ipcReturn = await handler(undefined, \"throwCircularError\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"circular\");\n expect(error.cause).to.be.undefined;\n });\n\n it(\"should serialize native Error.cause even though it is non-enumerable\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithNativeCause\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"native-cause-outer\");\n expect(error.cause).to.not.be.undefined;\n expect(error.cause.message).to.equal(\"native-cause-inner\");\n expect(error.cause.stack).to.be.a(\"string\");\n });\n\n it(\"should drop _metaData and expose loggingMetadata when BentleyError has a GetMetaDataFunction\", async () => {\n const ipcReturn = await handler(undefined, \"throwBentleyErrorWithFunctionMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"bentley-fn-meta\");\n // _metaData is a function — must not survive serialization\n expect(error._metaData).to.be.undefined;\n // loggingMetadata should be the resolved object\n expect(error.loggingMetadata).to.deep.equal({ detail: \"computed\" });\n });\n\n it(\"should drop _metaData and expose loggingMetadata when BentleyError has an object metaData\", async () => {\n const ipcReturn = await handler(undefined, \"throwBentleyErrorWithObjectMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"bentley-obj-meta\");\n expect(error._metaData).to.be.undefined;\n expect(error.loggingMetadata).to.deep.equal({ detail: \"static\" });\n });\n\n it(\"should drop function-valued _metaData on a nested BentleyError and still expose loggingMetadata\", async () => {\n const ipcReturn = await handler(undefined, \"throwNestedBentleyErrorWithFunctionMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"outer\");\n // The nested BentleyError inside .cause must also have _metaData stripped and loggingMetadata populated\n expect(error.cause).to.not.be.undefined;\n expect(error.cause.message).to.equal(\"inner-bentley\");\n expect(error.cause._metaData).to.be.undefined;\n expect(error.cause.loggingMetadata).to.deep.equal({ detail: \"nested-computed\" });\n });\n\n it(\"should drop arbitrary function-valued properties from a thrown Error\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithFunctionProperty\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"fn-prop\");\n expect(error.retry).to.be.undefined;\n });\n\n it(\"should not include symbol-keyed properties from a thrown Error\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithSymbolProperty\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"sym-prop\");\n // { ...e } copies enumerable own symbol-keyed properties too.\n // The serializer explicitly strips them (they cannot be structured-cloned).\n expect(Object.getOwnPropertySymbols(error)).to.have.length(0);\n });\n\n it(\"should preserve Date properties\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithDateProperty\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"date-prop\");\n expect(error.timestamp).to.deep.equal(new Date(\"2024-01-01\"));\n });\n\n it(\"should drop non-plain class instance properties\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithClassInstanceProperty\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"class-instance-prop\");\n expect(error.request).to.be.undefined;\n });\n\n it(\"should sanitize mixed arrays: preserve primitives and Dates, drop non-plain class instances, recurse into Errors\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithMixedArray\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"mixed-array\");\n expect(Array.isArray(error.items)).to.be.true;\n expect(error.items[0]).to.equal(\"string-value\"); // primitive: preserved\n expect(error.items[1]).to.equal(42); // primitive: preserved\n expect(error.items[2]).to.deep.equal(new Date(\"2024-01-01\")); // Date: preserved\n expect(error.items[3]).to.be.undefined; // class instance: dropped (→ undefined)\n expect(error.items[4].message).to.equal(\"array-error\"); // Error: recursed\n });\n });\n});\n"]}
1
+ {"version":3,"file":"IpcHost.test.js","sourceRoot":"","sources":["../../../src/test/IpcHost.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as sinon from \"sinon\";\nimport { expect } from \"chai\";\nimport { BentleyError, IModelStatus, ITwinError } from \"@itwin/core-bentley\";\nimport { IpcInvokeReturn, IpcSocketBackend, serializeIpcError } from \"@itwin/core-common\";\nimport { IpcHandler, IpcHost } from \"../IpcHost\";\n\ninterface MockIpcInterface {\n mockMethod: () => string;\n throwNestedError: () => never;\n throwCircularError: () => never;\n throwErrorWithNativeCause: () => never;\n throwBentleyErrorWithFunctionMetaData: () => never;\n throwBentleyErrorWithObjectMetaData: () => never;\n throwNestedBentleyErrorWithFunctionMetaData: () => never;\n throwBentleyErrorWithNestedBentleyErrorMetaData: () => never;\n throwErrorWithFunctionProperty: () => never;\n throwErrorWithSymbolProperty: () => never;\n throwErrorWithDateProperty: () => never;\n throwErrorWithClassInstanceProperty: () => never;\n throwErrorWithMixedArray: () => never;\n throwErrorWithNestedArrayProperty: () => never;\n throwBentleyErrorWithMapMetaData: () => never;\n throwBentleyErrorWithCollidingMapMetaData: () => never;\n throwBentleyErrorWithSetMetaData: () => never;\n throwErrorWithSelfReferencingArray: () => never;\n}\n\nclass OuterError extends Error {\n public readonly context: { cause: Error };\n public readonly errors: Error[];\n constructor(public readonly originalError: Error) {\n super(\"outer\");\n this.context = { cause: originalError };\n this.errors = [new Error(\"array-child-1\"), new Error(\"array-child-2\")];\n }\n}\n\nclass MockIpcHandler extends IpcHandler implements MockIpcInterface {\n public override get channelName() { return \"mock-channel\"; }\n\n public mockMethod(): string {\n return \"mock-value\";\n }\n\n public throwNestedError(): never {\n const inner = new Error(\"inner-message\");\n throw new OuterError(inner);\n }\n\n public throwCircularError(): never {\n const err = new Error(\"circular\") as any;\n err.cause = err; // circular reference\n throw err;\n }\n\n public throwErrorWithNativeCause(): never {\n throw new Error(\"native-cause-outer\", { cause: new Error(\"native-cause-inner\") });\n }\n\n public throwBentleyErrorWithFunctionMetaData(): never {\n throw new BentleyError(IModelStatus.BadArg, \"bentley-fn-meta\", () => ({ detail: \"computed\" }));\n }\n\n public throwBentleyErrorWithObjectMetaData(): never {\n throw new BentleyError(IModelStatus.BadArg, \"bentley-obj-meta\", { detail: \"static\" });\n }\n\n public throwNestedBentleyErrorWithFunctionMetaData(): never {\n const inner = new BentleyError(IModelStatus.BadArg, \"inner-bentley\", () => ({ detail: \"nested-computed\" }));\n const outer = new Error(\"outer\") as any;\n outer.cause = inner;\n throw outer;\n }\n\n public throwBentleyErrorWithNestedBentleyErrorMetaData(): never {\n const inner = new BentleyError(IModelStatus.BadArg, \"inner-bentley-in-metadata\", { detail: \"inner-value\" });\n throw new BentleyError(IModelStatus.BadArg, \"bentley-nested-bentley-meta\", { nested: inner });\n }\n\n public throwErrorWithFunctionProperty(): never {\n const err = new Error(\"fn-prop\") as any;\n err.retry = () => {};\n throw err;\n }\n\n public throwErrorWithSymbolProperty(): never {\n const err = new Error(\"sym-prop\") as any;\n err[Symbol(\"tag\")] = \"should-be-dropped\";\n throw err;\n }\n\n public throwErrorWithDateProperty(): never {\n const err = new Error(\"date-prop\") as any;\n err.timestamp = new Date(\"2024-01-01\");\n throw err;\n }\n\n public throwErrorWithClassInstanceProperty(): never {\n const err = new Error(\"class-instance-prop\") as any;\n err.request = new URL(\"https://example.com\"); // arbitrary non-plain class instance\n throw err;\n }\n\n public throwErrorWithMixedArray(): never {\n const err = new Error(\"mixed-array\") as any;\n err.items = [\"string-value\", 42, new Date(\"2024-01-01\"), new URL(\"https://example.com\"), new Error(\"array-error\")];\n throw err;\n }\n\n public throwErrorWithNestedArrayProperty(): never {\n const err = new Error(\"nested-array\") as any;\n err.matrix = [[1, 2], [3, 4]];\n throw err;\n }\n\n public throwBentleyErrorWithMapMetaData(): never {\n throw new BentleyError(IModelStatus.BadArg, \"bentley-map-meta\", new Map([[\"detail\", \"map-value\"]]));\n }\n\n public throwBentleyErrorWithCollidingMapMetaData(): never {\n // Numeric key `1` and string key `\"1\"` stringify to the same \"1\", so they'd collide without disambiguation.\n throw new BentleyError(IModelStatus.BadArg, \"bentley-colliding-map-meta\", new Map<number | string, string>([[1, \"num-one\"], [\"1\", \"str-one\"]]));\n }\n\n public throwBentleyErrorWithSetMetaData(): never {\n throw new BentleyError(IModelStatus.BadArg, \"bentley-set-meta\", new Set([\"tag1\", \"tag2\"]));\n }\n\n public throwErrorWithSelfReferencingArray(): never {\n const err = new Error(\"self-referencing-array\") as any;\n const arr: any[] = [];\n arr.push(arr); // array that contains itself\n err.items = arr;\n throw err;\n }\n\n #privateFunction(): void { }\n}\n\ndescribe(\"IpcHost\", () => {\n let socket: sinon.SinonStubbedInstance<IpcSocketBackend>;\n\n beforeEach(async () => {\n socket = {\n send: sinon.stub(),\n addListener: sinon.stub(),\n removeListener: sinon.stub(),\n handle: sinon.stub(),\n };\n\n await IpcHost.startup({ ipcHost: { socket } });\n });\n\n afterEach(() => {\n (IpcHost as any)._nextInvokeId = 0;\n (IpcHost as any)._pendingInvokes.clear();\n });\n\n describe(\"IpcHandler\", () => {\n let handler: (...args: any[]) => Promise<IpcInvokeReturn>;\n\n beforeEach(() => {\n MockIpcHandler.register();\n const handleCall = socket.handle.getCalls().find((call) => call.args[0] === \"itwin.mock-channel\")!;\n expect(handleCall).to.not.be.undefined;\n handler = handleCall.args[1];\n });\n\n it(\"should call public methods\", async () => {\n const ipcReturn = await handler(undefined, \"mockMethod\");\n expect(ipcReturn.result).to.equal(\"mock-value\");\n expect(ipcReturn.error).to.be.undefined;\n });\n\n it(\"should not call private methods\", async () => {\n const ipcReturn = await handler(undefined, \"#privateFunction\");\n expect(ipcReturn.result).to.be.undefined;\n expect(ipcReturn.error).to.not.be.undefined;\n });\n\n it(\"should not call methods inherited from Object\", async () => {\n const ipcReturn = await handler(undefined, \"toString\");\n expect(ipcReturn.result).to.be.undefined;\n expect(ipcReturn.error).to.not.be.undefined;\n });\n\n it(\"should serialize nested Error properties preserving message and stack\", async () => {\n const ipcReturn = await handler(undefined, \"throwNestedError\");\n const error = ipcReturn.error as any;\n // Top-level error\n expect(error.message).to.equal(\"outer\");\n expect(error.stack).to.be.a(\"string\");\n // Direct Error property\n expect(error.originalError.message).to.equal(\"inner-message\");\n expect(error.originalError.stack).to.be.a(\"string\");\n // Error nested inside a plain-object property\n expect(error.context.cause.message).to.equal(\"inner-message\");\n expect(error.context.cause.stack).to.be.a(\"string\");\n // Array of Errors stays an array\n expect(Array.isArray(error.errors)).to.be.true;\n expect(error.errors[0].message).to.equal(\"array-child-1\");\n expect(error.errors[1].message).to.equal(\"array-child-2\");\n });\n\n it(\"should omit stack on nested Errors when IpcHost.noStack is set\", async () => {\n const originalNoStack = IpcHost.noStack;\n IpcHost.noStack = true;\n try {\n const ipcReturn = await handler(undefined, \"throwNestedError\");\n const error = ipcReturn.error as any;\n expect(error.stack).to.be.undefined;\n expect(error.originalError.stack).to.be.undefined;\n expect(error.context.cause.stack).to.be.undefined;\n expect(error.errors[0].stack).to.be.undefined;\n expect(error.errors[1].stack).to.be.undefined;\n } finally {\n IpcHost.noStack = originalNoStack;\n }\n });\n\n it(\"should not infinitely recurse on circular Error references\", async () => {\n const ipcReturn = await handler(undefined, \"throwCircularError\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"circular\");\n expect(error.cause).to.be.undefined;\n });\n\n it(\"should serialize native Error.cause even though it is non-enumerable\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithNativeCause\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"native-cause-outer\");\n expect(error.cause).to.not.be.undefined;\n expect(error.cause.message).to.equal(\"native-cause-inner\");\n expect(error.cause.stack).to.be.a(\"string\");\n });\n\n it(\"should drop _metaData and expose loggingMetadata when BentleyError has a GetMetaDataFunction\", async () => {\n const ipcReturn = await handler(undefined, \"throwBentleyErrorWithFunctionMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"bentley-fn-meta\");\n // _metaData is a function — must not survive serialization\n expect(error._metaData).to.be.undefined;\n // loggingMetadata should be the resolved object\n expect(error.loggingMetadata).to.deep.equal({ detail: \"computed\" });\n });\n\n it(\"should drop _metaData and expose loggingMetadata when BentleyError has an object metaData\", async () => {\n const ipcReturn = await handler(undefined, \"throwBentleyErrorWithObjectMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"bentley-obj-meta\");\n expect(error._metaData).to.be.undefined;\n expect(error.loggingMetadata).to.deep.equal({ detail: \"static\" });\n });\n\n it(\"should drop function-valued _metaData on a nested BentleyError and still expose loggingMetadata\", async () => {\n const ipcReturn = await handler(undefined, \"throwNestedBentleyErrorWithFunctionMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"outer\");\n // The nested BentleyError inside .cause must also have _metaData stripped and loggingMetadata populated\n expect(error.cause).to.not.be.undefined;\n expect(error.cause.message).to.equal(\"inner-bentley\");\n expect(error.cause._metaData).to.be.undefined;\n expect(error.cause.loggingMetadata).to.deep.equal({ detail: \"nested-computed\" });\n });\n\n it(\"should drop arbitrary function-valued properties from a thrown Error\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithFunctionProperty\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"fn-prop\");\n expect(error.retry).to.be.undefined;\n });\n\n it(\"should not include symbol-keyed properties from a thrown Error\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithSymbolProperty\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"sym-prop\");\n // { ...e } copies enumerable own symbol-keyed properties too.\n // The serializer explicitly strips them (they cannot be structured-cloned).\n expect(Object.getOwnPropertySymbols(error)).to.have.length(0);\n });\n\n it(\"should preserve Date properties\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithDateProperty\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"date-prop\");\n expect(error.timestamp).to.deep.equal(new Date(\"2024-01-01\"));\n });\n\n it(\"should drop non-plain class instance properties\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithClassInstanceProperty\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"class-instance-prop\");\n expect(error.request).to.be.undefined;\n });\n\n it(\"should sanitize mixed arrays: preserve primitives and Dates, drop non-plain class instances, recurse into Errors\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithMixedArray\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"mixed-array\");\n expect(Array.isArray(error.items)).to.be.true;\n expect(error.items[0]).to.equal(\"string-value\"); // primitive: preserved\n expect(error.items[1]).to.equal(42); // primitive: preserved\n expect(error.items[2]).to.deep.equal(new Date(\"2024-01-01\")); // Date: preserved\n expect(error.items[3]).to.be.undefined; // class instance: dropped (→ undefined)\n expect(error.items[4].message).to.equal(\"array-error\"); // Error: recursed\n });\n\n it(\"should preserve nested arrays (array-of-arrays)\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithNestedArrayProperty\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"nested-array\");\n expect(error.matrix).to.deep.equal([[1, 2], [3, 4]]);\n });\n\n it(\"should not infinitely recurse on a self-referencing array\", async () => {\n const ipcReturn = await handler(undefined, \"throwErrorWithSelfReferencingArray\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"self-referencing-array\");\n expect(error.items[0]).to.be.undefined; // cycle detected: dropped rather than recursing forever\n });\n\n it(\"should normalize Map-valued loggingMetadata to a JSON-safe plain object (survives every transport)\", async () => {\n const ipcReturn = await handler(undefined, \"throwBentleyErrorWithMapMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"bentley-map-meta\");\n expect(error.loggingMetadata).to.deep.equal({ detail: \"map-value\" });\n });\n\n it(\"should disambiguate Map-valued loggingMetadata keys that stringify to the same value\", async () => {\n const ipcReturn = await handler(undefined, \"throwBentleyErrorWithCollidingMapMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"bentley-colliding-map-meta\");\n expect(error.loggingMetadata).to.deep.equal({ \"1\": \"num-one\", \"1#1\": \"str-one\" });\n });\n\n it(\"should preserve iTwinErrorId/loggingMetadata of a BentleyError nested inside loggingMetadata\", async () => {\n const ipcReturn = await handler(undefined, \"throwBentleyErrorWithNestedBentleyErrorMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"bentley-nested-bentley-meta\");\n const nested = error.loggingMetadata.nested;\n expect(nested.message).to.equal(\"inner-bentley-in-metadata\");\n expect(nested.iTwinErrorId).to.deep.equal({ scope: BentleyError.iTwinErrorScope, key: nested.iTwinErrorId.key });\n expect(nested.loggingMetadata).to.deep.equal({ detail: \"inner-value\" });\n });\n\n it(\"should normalize Set-valued loggingMetadata to a JSON-safe array (survives every transport)\", async () => {\n const ipcReturn = await handler(undefined, \"throwBentleyErrorWithSetMetaData\");\n const error = ipcReturn.error as any;\n expect(error.message).to.equal(\"bentley-set-meta\");\n expect(error.loggingMetadata).to.deep.equal([\"tag1\", \"tag2\"]);\n });\n });\n\n describe(\"IpcHost.invoke\", () => {\n /** Simulates the frontend: captures per-request listeners and provides a `respond` helper by call index. */\n function mockFrontend() {\n const listeners = new Map<string, (event: any, result: any) => void>();\n socket.addListener.callsFake((ch: string, fn: (event: any, result: any) => void) => {\n listeners.set(ch, fn);\n return () => listeners.delete(ch);\n });\n\n return {\n listeners,\n responseChannel: (callIndex: number) => socket.send.getCall(callIndex).args[1] as string,\n respond: (callIndex: number, result: unknown) => {\n const responseChannel = socket.send.getCall(callIndex).args[1] as string;\n const listener = listeners.get(responseChannel);\n if (!listener)\n throw new Error(`No listener found for response channel ${responseChannel}`);\n listener(undefined, result);\n },\n };\n }\n\n it(\"should resolve with the frontend's response\", async () => {\n const frontend = mockFrontend();\n const promise = IpcHost.invoke(\"ch\", \"a\", \"b\");\n frontend.respond(0, \"hello\");\n expect(await promise).to.equal(\"hello\");\n // the pending-invoke entry must be removed so the map does not grow unboundedly\n expect((IpcHost as any)._pendingInvokes.size).to.equal(0);\n });\n\n it(\"should route concurrent invokes to the correct caller\", async () => {\n const frontend = mockFrontend();\n const p1 = IpcHost.invoke(\"ch\");\n const p2 = IpcHost.invoke(\"ch\");\n\n // respond out of order\n frontend.respond(1, \"second\");\n frontend.respond(0, \"first\");\n\n expect(await p1).to.equal(\"first\");\n expect(await p2).to.equal(\"second\");\n });\n\n it(\"should remove the response listener after a response\", async () => {\n const frontend = mockFrontend();\n const promise = IpcHost.invoke(\"ch\");\n const responseChannel = frontend.responseChannel(0);\n expect(frontend.listeners.has(responseChannel)).to.be.true;\n\n frontend.respond(0, \"done\");\n await promise;\n expect(frontend.listeners.has(responseChannel)).to.be.false;\n });\n\n it(\"should reject pending invokes when IpcHost is shut down\", async () => {\n const frontend = mockFrontend();\n const promise = IpcHost.invoke(\"ch\");\n const responseChannel = frontend.responseChannel(0);\n // attach handler immediately so the rejection is observed (and not \"unhandled\")\n const caught = promise.then(() => undefined, (e: Error) => e);\n\n await IpcHost.shutdown();\n\n const err = await caught;\n expect(err).to.be.instanceOf(Error);\n expect((err as Error).message).to.contain(\"shut down\");\n // the listener must be cleaned up so it does not leak past shutdown\n expect(frontend.listeners.has(responseChannel)).to.be.false;\n });\n\n it(\"should reject all pending invokes when IpcHost is shut down with 2+ concurrent invokes, removing all listeners\", async () => {\n const frontend = mockFrontend();\n const p1 = IpcHost.invoke(\"ch1\");\n const p2 = IpcHost.invoke(\"ch2\");\n const responseChannel1 = frontend.responseChannel(0);\n const responseChannel2 = frontend.responseChannel(1);\n // attach handlers immediately so the rejections are observed (and not \"unhandled\")\n const caught1 = p1.then(() => undefined, (e: Error) => e);\n const caught2 = p2.then(() => undefined, (e: Error) => e);\n expect((IpcHost as any)._pendingInvokes.size).to.equal(2);\n\n await IpcHost.shutdown();\n\n const err1 = await caught1;\n const err2 = await caught2;\n expect(err1).to.be.instanceOf(Error);\n expect((err1 as Error).message).to.contain(\"shut down\");\n expect(err2).to.be.instanceOf(Error);\n expect((err2 as Error).message).to.contain(\"shut down\");\n expect(frontend.listeners.has(responseChannel1)).to.be.false;\n expect(frontend.listeners.has(responseChannel2)).to.be.false;\n expect((IpcHost as any)._pendingInvokes.size).to.equal(0);\n });\n\n it(\"should reject and clean up the listener/pending-invoke entry when `send` throws synchronously\", async () => {\n const frontend = mockFrontend();\n socket.send.throws(new Error(\"send failed\"));\n const promise = IpcHost.invoke(\"ch\");\n\n let caught: any;\n try {\n await promise;\n expect.fail(\"invoke should have rejected\");\n } catch (err) {\n caught = err;\n }\n expect(caught).to.be.instanceOf(Error);\n expect(caught.message).to.equal(\"send failed\");\n // the listener and _pendingInvokes entry must not leak when `send` throws synchronously\n expect(frontend.listeners.size).to.equal(0);\n expect((IpcHost as any)._pendingInvokes.size).to.equal(0);\n });\n\n it(\"should rethrow a frontend-thrown BentleyError from makeIpcProxy preserving ITwinError identity and metadata\", async () => {\n const frontend = mockFrontend();\n const proxy = IpcHost.makeIpcProxy<{ doIt: () => Promise<void> }>(\"ch\");\n const promise = proxy.doIt();\n\n // simulate the frontend handler serializing a thrown BentleyError into the invoke-response envelope\n const thrown = new BentleyError(IModelStatus.NotFound, \"boom\", () => ({ detail: 42 }));\n thrown.name = \"MyFrontendError\";\n const serialized = serializeIpcError(thrown, true);\n frontend.respond(0, serialized);\n\n let caught: any;\n try {\n await promise;\n expect.fail(\"proxy call should have rejected\");\n } catch (err) {\n caught = err;\n }\n // Following the ITwinError paradigm, the backend rebuilds a plain Error (no cross-process class identity)\n // that callers identify via ITwinError.isError / BentleyError.isError rather than instanceof.\n expect(ITwinError.isError(caught, BentleyError.iTwinErrorScope, \"MyFrontendError\")).to.be.true;\n expect(caught.name).to.equal(\"MyFrontendError\");\n expect(BentleyError.isError(caught, IModelStatus.NotFound)).to.be.true;\n expect(caught.message).to.equal(\"boom\");\n expect(caught.loggingMetadata).to.deep.equal({ detail: 42 });\n });\n\n it(\"should not let a non-string thrown `message` field overwrite the 'unknown error' guard in rebuildIpcError\", async () => {\n const frontend = mockFrontend();\n const proxy = IpcHost.makeIpcProxy<{ doIt: () => Promise<void> }>(\"ch\");\n const promise = proxy.doIt();\n\n // simulate a thrown non-Error value with a non-string `message` field (e.g. `throw { message: 123 }`)\n const serialized = serializeIpcError({ message: 123 }, true);\n frontend.respond(0, serialized);\n\n let caught: any;\n try {\n await promise;\n expect.fail(\"proxy call should have rejected\");\n } catch (err) {\n caught = err;\n }\n expect(caught).to.be.instanceOf(Error);\n expect(caught.message).to.equal(\"unknown error\");\n });\n\n it(\"should rethrow a plain Error from makeIpcProxy when the frontend threw a non-BentleyError\", async () => {\n const frontend = mockFrontend();\n const proxy = IpcHost.makeIpcProxy<{ doIt: () => Promise<void> }>(\"ch\");\n const promise = proxy.doIt();\n\n const serialized = serializeIpcError(new Error(\"plain failure\"), true);\n frontend.respond(0, serialized);\n\n let caught: any;\n try {\n await promise;\n expect.fail(\"proxy call should have rejected\");\n } catch (err) {\n caught = err;\n }\n expect(caught).to.be.instanceOf(Error);\n expect(BentleyError.isError(caught)).to.be.false;\n expect(caught.message).to.equal(\"plain failure\");\n });\n });\n});\n"]}
@@ -2,11 +2,67 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
6
+ if (value !== null && value !== void 0) {
7
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
8
+ var dispose, inner;
9
+ if (async) {
10
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
11
+ dispose = value[Symbol.asyncDispose];
12
+ }
13
+ if (dispose === void 0) {
14
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
15
+ dispose = value[Symbol.dispose];
16
+ if (async) inner = dispose;
17
+ }
18
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
19
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
20
+ env.stack.push({ value: value, dispose: dispose, async: async });
21
+ }
22
+ else if (async) {
23
+ env.stack.push({ async: true });
24
+ }
25
+ return value;
26
+ };
27
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
28
+ return function (env) {
29
+ function fail(e) {
30
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
31
+ env.hasError = true;
32
+ }
33
+ var r, s = 0;
34
+ function next() {
35
+ while (r = env.stack.pop()) {
36
+ try {
37
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
38
+ if (r.dispose) {
39
+ var result = r.dispose.call(r.value);
40
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
41
+ }
42
+ else s |= 1;
43
+ }
44
+ catch (e) {
45
+ fail(e);
46
+ }
47
+ }
48
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
49
+ if (env.hasError) throw env.error;
50
+ }
51
+ return next();
52
+ };
53
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
54
+ var e = new Error(message);
55
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
56
+ });
5
57
  import { assert, expect } from "chai";
6
- import { QueryOptionsBuilder, QueryRowFormat } from "@itwin/core-common";
58
+ import * as sinon from "sinon";
59
+ import { QueryBinder, QueryOptionsBuilder, QueryRowFormat } from "@itwin/core-common";
7
60
  import { SnapshotDb } from "../../IModelDb";
8
61
  import { IModelTestUtils } from "../IModelTestUtils";
9
62
  import { Id64 } from "@itwin/core-bentley";
63
+ import { ECSqlStatement } from "../../ECSqlStatement";
64
+ import { ECDbTestHelper } from "./ECDbTestHelper";
65
+ import { KnownTestLocations } from "../KnownTestLocations";
10
66
  describe("WithQueryReaderTests", () => {
11
67
  let iModel;
12
68
  before(async () => {
@@ -119,5 +175,87 @@ describe("WithQueryReaderTests", () => {
119
175
  assert.equal(classId, "BisCore.DrawingCategory");
120
176
  }, undefined, config);
121
177
  });
178
+ describe("statement caching (regression)", () => {
179
+ // `withQueryReader` used to build a fresh `ECSqlStatement` and re-compile the ECSQL on every
180
+ // call (via `ECSqlRowExecutor`), with no caching. Callers such as `IModelTransformer` invoke
181
+ // per-element helpers (e.g. `hasSubModel`) once per element, so on large models this turned one
182
+ // cached ECSQL prepare into N full native compiles - a significant performance regression. The
183
+ // reader now reuses a prepared statement from the owning db's `_statementCache`.
184
+ const sql = "SELECT ECInstanceId FROM bis.Element WHERE ECInstanceId=?";
185
+ afterEach(() => sinon.restore());
186
+ it("reuses a single prepared statement across repeated calls instead of re-preparing", () => {
187
+ iModel.clearCaches();
188
+ const prepareSpy = sinon.spy(ECSqlStatement.prototype, "prepare"); // eslint-disable-line @typescript-eslint/no-deprecated
189
+ for (let i = 0; i < 20; i++) {
190
+ iModel.withQueryReader(sql, (reader) => {
191
+ reader.step();
192
+ }, new QueryBinder().bindId(1, "0x1"));
193
+ }
194
+ expect(prepareSpy.callCount).to.equal(1, "queries with identical ECSQL text should re-use one cached prepared statement");
195
+ });
196
+ it("keeps nested withQueryReader calls on the same SQL independent", () => {
197
+ iModel.clearCaches();
198
+ // A nested reader on the same SQL must get its own statement (findAndRemove hands the outer
199
+ // reader's statement out of the cache), so results do not corrupt each other.
200
+ const outerId = iModel.withQueryReader(sql, (outer) => {
201
+ assert.isTrue(outer.step());
202
+ const innerId = iModel.withQueryReader(sql, (inner) => {
203
+ assert.isTrue(inner.step());
204
+ return inner.current[0];
205
+ }, new QueryBinder().bindId(1, "0xe"));
206
+ expect(innerId).to.equal("0xe");
207
+ // Outer reader's cursor must be unaffected by the nested reader.
208
+ return outer.current[0];
209
+ }, new QueryBinder().bindId(1, "0x1"));
210
+ expect(outerId).to.equal("0x1");
211
+ });
212
+ it("recovers from a prepare failure without poisoning the cache", () => {
213
+ iModel.clearCaches();
214
+ const invalidSql = "SELECT * FROM bis.ThisClassDoesNotExist";
215
+ const prepareSpy = sinon.spy(ECSqlStatement.prototype, "prepare"); // eslint-disable-line @typescript-eslint/no-deprecated
216
+ expect(() => iModel.withQueryReader(invalidSql, (reader) => reader.step())).to.throw();
217
+ expect(() => iModel.withQueryReader(invalidSql, (reader) => reader.step())).to.throw();
218
+ expect(prepareSpy.callCount).to.equal(2, "a statement that failed to prepare must not be cached");
219
+ iModel.withQueryReader(sql, (reader) => {
220
+ assert.isTrue(reader.step());
221
+ expect(reader.current[0]).to.equal("0x1");
222
+ }, new QueryBinder().bindId(1, "0x1"));
223
+ });
224
+ it("releases the executor and cached statement when binding fails during reader construction", () => {
225
+ iModel.clearCaches();
226
+ const prepareSpy = sinon.spy(ECSqlStatement.prototype, "prepare"); // eslint-disable-line @typescript-eslint/no-deprecated
227
+ iModel.withQueryReader(sql, (reader) => reader.step(), new QueryBinder().bindId(1, "0x1"));
228
+ const listenerCount = iModel.onBeforeClose.numberOfListeners;
229
+ const bindStub = sinon.stub(ECSqlStatement.prototype, "bindParams").throws(new Error("Expected bind failure")); // eslint-disable-line @typescript-eslint/no-deprecated
230
+ expect(() => iModel.withQueryReader(sql, () => undefined, new QueryBinder().bindId(1, "0x1"))).to.throw("Expected bind failure");
231
+ bindStub.restore();
232
+ expect(iModel.onBeforeClose.numberOfListeners).to.equal(listenerCount);
233
+ iModel.withQueryReader(sql, (reader) => reader.step(), new QueryBinder().bindId(1, "0x1"));
234
+ expect(prepareSpy.callCount).to.equal(1, "the statement checked out before the bind failure should be returned to the cache");
235
+ });
236
+ it("also caches for ECDb.withQueryReader (shared ECSqlRowExecutor path)", () => {
237
+ const env_1 = { stack: [], error: void 0, hasError: false };
238
+ try {
239
+ const ecdb = __addDisposableResource(env_1, ECDbTestHelper.createECDb(KnownTestLocations.outputDir, "syncReaderStmtCache.ecdb", `<ECSchema schemaName="Test" alias="ts" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.2">
240
+ <ECEntityClass typeName="Foo" modifier="Sealed">
241
+ <ECProperty propertyName="n" typeName="int"/>
242
+ </ECEntityClass>
243
+ </ECSchema>`), false);
244
+ ecdb.saveChanges();
245
+ const ecdbSql = "SELECT ECInstanceId FROM meta.ECClassDef WHERE ECInstanceId=?";
246
+ const prepareSpy = sinon.spy(ECSqlStatement.prototype, "prepare"); // eslint-disable-line @typescript-eslint/no-deprecated
247
+ for (let i = 0; i < 10; i++)
248
+ ecdb.withQueryReader(ecdbSql, (reader) => reader.step(), new QueryBinder().bindId(1, "0x1"));
249
+ expect(prepareSpy.callCount).to.equal(1, "ECDb.withQueryReader should also reuse a cached prepared statement");
250
+ }
251
+ catch (e_1) {
252
+ env_1.error = e_1;
253
+ env_1.hasError = true;
254
+ }
255
+ finally {
256
+ __disposeResources(env_1);
257
+ }
258
+ });
259
+ });
122
260
  });
123
261
  //# sourceMappingURL=ECSqlSyncReader.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ECSqlSyncReader.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECSqlSyncReader.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, expect } from \"chai\";\nimport { QueryOptionsBuilder, QueryRowFormat } from \"@itwin/core-common\";\nimport { SnapshotDb } from \"../../IModelDb\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { Id64 } from \"@itwin/core-bentley\";\n\ndescribe(\"WithQueryReaderTests\", () => {\n let iModel: SnapshotDb;\n\n before(async () => {\n iModel = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\n });\n\n after(async () => {\n iModel.close();\n });\n it(\"check behvaiour if we call clearCaches in between\", () => {\n let actualRowCount = 0;\n const expectedInstanceIds = [\"0x1\", \"0xe\", \"0x10\", \"0x11\", \"0x12\",\n \"0x13\", \"0x14\", \"0x15\", \"0x16\", \"0x17\"];\n\n expect(() => iModel.withQueryReader(\"SELECT * FROM bis.Element\", (reader) => {\n let loopCount = 0;\n // First loop - read first 10 rows\n while (loopCount < 10) {\n reader.step()\n actualRowCount++;\n loopCount++;\n assert.isDefined(reader.current[0]);\n assert.equal(reader.current[0], expectedInstanceIds[actualRowCount - 1]);\n }\n assert.equal(loopCount, 10);\n iModel.clearCaches();\n\n reader.step(); // step should fail after clearCaches\n })).to.throw(\"Step failed\");\n });\n it(\"should throw error if we try to step on a closed iModelDb object\", () => {\n const imodelPath = iModel.pathName;\n expect(() => iModel.withQueryReader(\"SELECT * FROM bis.Element\", (reader) => {\n let loopCount = 0;\n while (loopCount < 10) {\n reader.step();\n assert.isDefined(reader.current[0]);\n loopCount++;\n }\n assert.equal(loopCount, 10);\n iModel.close();\n\n iModel = SnapshotDb.openFile(imodelPath);\n assert.isDefined(reader.current[0]);\n reader.step(); // step should fail after iModelDb is closed\n })).to.throw(\"Statement is not prepared\");\n });\n it(\"returning reader from withQueryReader callback should throw error if we try to step on it\", () => {\n const readerObj = iModel.withQueryReader(\"SELECT * FROM bis.Element\", (reader) => {\n reader.step();\n return reader;\n });\n expect(readerObj.current[0]).to.equal(\"0x1\"); // will not throw error as we are just accessing current row\n expect(() => readerObj.step()).to.throw(\"Statement is not prepared\");\n });\n it(\"checking rowFormat unspecified case - values accessed by index\", () => {\n // Default rowFormat is UseECSqlPropertyIndexes: columns are accessed by their SELECT-order index.\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n const id: string = reader.current[0];\n const classId: string = reader.current[1];\n assert.isTrue(Id64.isValid(classId));\n assert.isTrue(Id64.isValid(id));\n assert.equal(id, \"0x19\");\n });\n });\n\n it(\"checking rowFormat UseECSqlPropertyIndexes - values accessed by index\", () => {\n const config = new QueryOptionsBuilder().setRowFormat(QueryRowFormat.UseECSqlPropertyIndexes).getOptions();\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n // Index 0 → ECInstanceId, index 1 → ECClassId\n const id: string = reader.current[0];\n const classId: string = reader.current[1];\n assert.equal(id, \"0x19\");\n assert.isTrue(Id64.isValid(classId));\n // Swapping column order changes index, not value\n }, undefined, config);\n });\n\n it(\"checking rowFormat UseECSqlPropertyNames - values accessed by ECSQL property name\", () => {\n const config = new QueryOptionsBuilder().setRowFormat(QueryRowFormat.UseECSqlPropertyNames).getOptions();\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n const id: string = reader.current.ECInstanceId;\n const classId: string = reader.current.ECClassId;\n assert.equal(id, \"0x19\");\n assert.isTrue(Id64.isValid(classId));\n }, undefined, config);\n });\n\n it(\"checking rowFormat UseJsPropertyNames - values accessed by JavaScript property name\", () => {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const config = new QueryOptionsBuilder().setRowFormat(QueryRowFormat.UseJsPropertyNames).getOptions();\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n // ECInstanceId → id, ECClassId → className (resolved to a fully-qualified class name string)\n const id: string = reader.current.id;\n const className: string = reader.current.className;\n assert.equal(id, \"0x19\");\n // className should be in the form \"SchemaName.ClassName\"\n assert.equal(className, \"BisCore.DrawingCategory\");\n }, undefined, config);\n });\n\n it(\"checking rowFormat UseECSqlPropertyNames with convertClassIdsToClassNames - ECClassId returned as class name string\", () => {\n const config = new QueryOptionsBuilder()\n .setRowFormat(QueryRowFormat.UseECSqlPropertyNames)\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n .setConvertClassIdsToNames(true)\n .getOptions();\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n const id: string = reader.current.ECInstanceId;\n const classId: string = reader.current.ECClassId;\n assert.equal(id, \"0x19\");\n // With convertClassIdsToClassNames, ECClassId is resolved to \"SchemaName.ClassName\" instead of an Id\n assert.equal(classId, \"BisCore.DrawingCategory\");\n }, undefined, config);\n });\n});\n"]}
1
+ {"version":3,"file":"ECSqlSyncReader.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECSqlSyncReader.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, expect } from \"chai\";\nimport * as sinon from \"sinon\";\nimport { QueryBinder, QueryOptionsBuilder, QueryRowFormat } from \"@itwin/core-common\";\nimport { SnapshotDb } from \"../../IModelDb\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { Id64 } from \"@itwin/core-bentley\";\nimport { ECSqlStatement } from \"../../ECSqlStatement\";\nimport { ECDbTestHelper } from \"./ECDbTestHelper\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\n\ndescribe(\"WithQueryReaderTests\", () => {\n let iModel: SnapshotDb;\n\n before(async () => {\n iModel = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\n });\n\n after(async () => {\n iModel.close();\n });\n it(\"check behvaiour if we call clearCaches in between\", () => {\n let actualRowCount = 0;\n const expectedInstanceIds = [\"0x1\", \"0xe\", \"0x10\", \"0x11\", \"0x12\",\n \"0x13\", \"0x14\", \"0x15\", \"0x16\", \"0x17\"];\n\n expect(() => iModel.withQueryReader(\"SELECT * FROM bis.Element\", (reader) => {\n let loopCount = 0;\n // First loop - read first 10 rows\n while (loopCount < 10) {\n reader.step()\n actualRowCount++;\n loopCount++;\n assert.isDefined(reader.current[0]);\n assert.equal(reader.current[0], expectedInstanceIds[actualRowCount - 1]);\n }\n assert.equal(loopCount, 10);\n iModel.clearCaches();\n\n reader.step(); // step should fail after clearCaches\n })).to.throw(\"Step failed\");\n });\n it(\"should throw error if we try to step on a closed iModelDb object\", () => {\n const imodelPath = iModel.pathName;\n expect(() => iModel.withQueryReader(\"SELECT * FROM bis.Element\", (reader) => {\n let loopCount = 0;\n while (loopCount < 10) {\n reader.step();\n assert.isDefined(reader.current[0]);\n loopCount++;\n }\n assert.equal(loopCount, 10);\n iModel.close();\n\n iModel = SnapshotDb.openFile(imodelPath);\n assert.isDefined(reader.current[0]);\n reader.step(); // step should fail after iModelDb is closed\n })).to.throw(\"Statement is not prepared\");\n });\n it(\"returning reader from withQueryReader callback should throw error if we try to step on it\", () => {\n const readerObj = iModel.withQueryReader(\"SELECT * FROM bis.Element\", (reader) => {\n reader.step();\n return reader;\n });\n expect(readerObj.current[0]).to.equal(\"0x1\"); // will not throw error as we are just accessing current row\n expect(() => readerObj.step()).to.throw(\"Statement is not prepared\");\n });\n it(\"checking rowFormat unspecified case - values accessed by index\", () => {\n // Default rowFormat is UseECSqlPropertyIndexes: columns are accessed by their SELECT-order index.\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n const id: string = reader.current[0];\n const classId: string = reader.current[1];\n assert.isTrue(Id64.isValid(classId));\n assert.isTrue(Id64.isValid(id));\n assert.equal(id, \"0x19\");\n });\n });\n\n it(\"checking rowFormat UseECSqlPropertyIndexes - values accessed by index\", () => {\n const config = new QueryOptionsBuilder().setRowFormat(QueryRowFormat.UseECSqlPropertyIndexes).getOptions();\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n // Index 0 → ECInstanceId, index 1 → ECClassId\n const id: string = reader.current[0];\n const classId: string = reader.current[1];\n assert.equal(id, \"0x19\");\n assert.isTrue(Id64.isValid(classId));\n // Swapping column order changes index, not value\n }, undefined, config);\n });\n\n it(\"checking rowFormat UseECSqlPropertyNames - values accessed by ECSQL property name\", () => {\n const config = new QueryOptionsBuilder().setRowFormat(QueryRowFormat.UseECSqlPropertyNames).getOptions();\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n const id: string = reader.current.ECInstanceId;\n const classId: string = reader.current.ECClassId;\n assert.equal(id, \"0x19\");\n assert.isTrue(Id64.isValid(classId));\n }, undefined, config);\n });\n\n it(\"checking rowFormat UseJsPropertyNames - values accessed by JavaScript property name\", () => {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const config = new QueryOptionsBuilder().setRowFormat(QueryRowFormat.UseJsPropertyNames).getOptions();\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n // ECInstanceId → id, ECClassId → className (resolved to a fully-qualified class name string)\n const id: string = reader.current.id;\n const className: string = reader.current.className;\n assert.equal(id, \"0x19\");\n // className should be in the form \"SchemaName.ClassName\"\n assert.equal(className, \"BisCore.DrawingCategory\");\n }, undefined, config);\n });\n\n it(\"checking rowFormat UseECSqlPropertyNames with convertClassIdsToClassNames - ECClassId returned as class name string\", () => {\n const config = new QueryOptionsBuilder()\n .setRowFormat(QueryRowFormat.UseECSqlPropertyNames)\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n .setConvertClassIdsToNames(true)\n .getOptions();\n iModel.withQueryReader(\"SELECT ECInstanceId, ECClassId FROM bis.Element\", (reader) => {\n assert.isTrue(reader.step());\n const id: string = reader.current.ECInstanceId;\n const classId: string = reader.current.ECClassId;\n assert.equal(id, \"0x19\");\n // With convertClassIdsToClassNames, ECClassId is resolved to \"SchemaName.ClassName\" instead of an Id\n assert.equal(classId, \"BisCore.DrawingCategory\");\n }, undefined, config);\n });\n\n describe(\"statement caching (regression)\", () => {\n // `withQueryReader` used to build a fresh `ECSqlStatement` and re-compile the ECSQL on every\n // call (via `ECSqlRowExecutor`), with no caching. Callers such as `IModelTransformer` invoke\n // per-element helpers (e.g. `hasSubModel`) once per element, so on large models this turned one\n // cached ECSQL prepare into N full native compiles - a significant performance regression. The\n // reader now reuses a prepared statement from the owning db's `_statementCache`.\n const sql = \"SELECT ECInstanceId FROM bis.Element WHERE ECInstanceId=?\";\n\n afterEach(() => sinon.restore());\n\n it(\"reuses a single prepared statement across repeated calls instead of re-preparing\", () => {\n iModel.clearCaches();\n const prepareSpy = sinon.spy(ECSqlStatement.prototype, \"prepare\"); // eslint-disable-line @typescript-eslint/no-deprecated\n for (let i = 0; i < 20; i++) {\n iModel.withQueryReader(sql, (reader) => {\n reader.step();\n }, new QueryBinder().bindId(1, \"0x1\"));\n }\n expect(prepareSpy.callCount).to.equal(1, \"queries with identical ECSQL text should re-use one cached prepared statement\");\n });\n\n it(\"keeps nested withQueryReader calls on the same SQL independent\", () => {\n iModel.clearCaches();\n // A nested reader on the same SQL must get its own statement (findAndRemove hands the outer\n // reader's statement out of the cache), so results do not corrupt each other.\n const outerId = iModel.withQueryReader(sql, (outer) => {\n assert.isTrue(outer.step());\n const innerId = iModel.withQueryReader(sql, (inner) => {\n assert.isTrue(inner.step());\n return inner.current[0] as string;\n }, new QueryBinder().bindId(1, \"0xe\"));\n expect(innerId).to.equal(\"0xe\");\n // Outer reader's cursor must be unaffected by the nested reader.\n return outer.current[0] as string;\n }, new QueryBinder().bindId(1, \"0x1\"));\n expect(outerId).to.equal(\"0x1\");\n });\n\n it(\"recovers from a prepare failure without poisoning the cache\", () => {\n iModel.clearCaches();\n const invalidSql = \"SELECT * FROM bis.ThisClassDoesNotExist\";\n const prepareSpy = sinon.spy(ECSqlStatement.prototype, \"prepare\"); // eslint-disable-line @typescript-eslint/no-deprecated\n expect(() => iModel.withQueryReader(invalidSql, (reader) => reader.step())).to.throw();\n expect(() => iModel.withQueryReader(invalidSql, (reader) => reader.step())).to.throw();\n expect(prepareSpy.callCount).to.equal(2, \"a statement that failed to prepare must not be cached\");\n\n iModel.withQueryReader(sql, (reader) => {\n assert.isTrue(reader.step());\n expect(reader.current[0]).to.equal(\"0x1\");\n }, new QueryBinder().bindId(1, \"0x1\"));\n });\n\n it(\"releases the executor and cached statement when binding fails during reader construction\", () => {\n iModel.clearCaches();\n const prepareSpy = sinon.spy(ECSqlStatement.prototype, \"prepare\"); // eslint-disable-line @typescript-eslint/no-deprecated\n iModel.withQueryReader(sql, (reader) => reader.step(), new QueryBinder().bindId(1, \"0x1\"));\n const listenerCount = iModel.onBeforeClose.numberOfListeners;\n\n const bindStub = sinon.stub(ECSqlStatement.prototype, \"bindParams\").throws(new Error(\"Expected bind failure\")); // eslint-disable-line @typescript-eslint/no-deprecated\n expect(() => iModel.withQueryReader(sql, () => undefined, new QueryBinder().bindId(1, \"0x1\"))).to.throw(\"Expected bind failure\");\n bindStub.restore();\n expect(iModel.onBeforeClose.numberOfListeners).to.equal(listenerCount);\n\n iModel.withQueryReader(sql, (reader) => reader.step(), new QueryBinder().bindId(1, \"0x1\"));\n expect(prepareSpy.callCount).to.equal(1, \"the statement checked out before the bind failure should be returned to the cache\");\n });\n\n it(\"also caches for ECDb.withQueryReader (shared ECSqlRowExecutor path)\", () => {\n using ecdb = ECDbTestHelper.createECDb(KnownTestLocations.outputDir, \"syncReaderStmtCache.ecdb\",\n `<ECSchema schemaName=\"Test\" alias=\"ts\" version=\"01.00.00\" xmlns=\"http://www.bentley.com/schemas/Bentley.ECXML.3.2\">\n <ECEntityClass typeName=\"Foo\" modifier=\"Sealed\">\n <ECProperty propertyName=\"n\" typeName=\"int\"/>\n </ECEntityClass>\n </ECSchema>`);\n ecdb.saveChanges();\n const ecdbSql = \"SELECT ECInstanceId FROM meta.ECClassDef WHERE ECInstanceId=?\";\n const prepareSpy = sinon.spy(ECSqlStatement.prototype, \"prepare\"); // eslint-disable-line @typescript-eslint/no-deprecated\n for (let i = 0; i < 10; i++)\n ecdb.withQueryReader(ecdbSql, (reader) => reader.step(), new QueryBinder().bindId(1, \"0x1\"));\n expect(prepareSpy.callCount).to.equal(1, \"ECDb.withQueryReader should also reuse a cached prepared statement\");\n });\n });\n});\n"]}
@@ -1288,6 +1288,26 @@ describe("iModel", () => {
1288
1288
  const physicalObjectIds = imodel2.queryEntityIds({ from: "generic.PhysicalObject", where: "codevalue is null", limit: 1, offset: 1, only: true, orderBy: "ecinstanceid desc" });
1289
1289
  assert.equal(physicalObjectIds.size, 1);
1290
1290
  });
1291
+ it("queryEntityIds should skip undefined and null bindings", () => {
1292
+ // Callers commonly build the WHERE clause conditionally but pass the bindings object
1293
+ // unconditionally, relying on undefined entries being skipped (legacy bindValues semantics).
1294
+ const baseline = imodel2.queryEntityIds({ from: "generic.PhysicalObject", where: "codevalue is null" });
1295
+ assert.isAtLeast(baseline.size, 1);
1296
+ const parent = undefined;
1297
+ const where = "codevalue is null";
1298
+ const withUnusedUndefined = imodel2.queryEntityIds({ from: "generic.PhysicalObject", where, bindings: { parent } });
1299
+ assert.deepEqual(withUnusedUndefined, baseline);
1300
+ const withUnusedNull = imodel2.queryEntityIds({ from: "generic.PhysicalObject", where: "codevalue is null", bindings: { parent: null } });
1301
+ assert.deepEqual(withUnusedNull, baseline);
1302
+ const someId = imodel2.queryEntityIds({ from: "bis.element", where: "CodeValue IS NOT NULL", limit: 1 }).values().next().value;
1303
+ assert.isDefined(someId);
1304
+ const codeValue = imodel2.elements.getElement(someId).code.value;
1305
+ const mixed = imodel2.queryEntityIds({ from: "bis.element", where: "CodeValue=:cv", bindings: { cv: codeValue, parent: undefined } });
1306
+ assert.isTrue(mixed.has(someId));
1307
+ // positional form: trailing undefined beyond the parameter count must be skipped, not bound
1308
+ const positional = imodel2.queryEntityIds({ from: "bis.element", where: "CodeValue=?", bindings: [codeValue, undefined] });
1309
+ assert.isTrue(positional.has(someId));
1310
+ });
1291
1311
  it("validate BisCodeSpecs", async () => {
1292
1312
  assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.nullCodeSpec).scopeType, CodeScopeSpec.Type.Repository);
1293
1313
  assert.equal(imodel2.codeSpecs.getByName(BisCodeSpec.subCategory).scopeType, CodeScopeSpec.Type.ParentElement);