@itwin/core-backend 5.8.0-dev.9 → 5.8.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.
- package/CHANGELOG.md +28 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +0 -3
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +28 -4
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +6 -0
- package/lib/cjs/LineStyle.d.ts.map +1 -1
- package/lib/cjs/LineStyle.js +41 -32
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.d.ts +17 -10
- package/lib/cjs/LocalHub.d.ts.map +1 -1
- package/lib/cjs/LocalHub.js +126 -28
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/core-backend.d.ts +2 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +2 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js +108 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js +8 -4
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +57 -14
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.d.ts +8 -0
- package/lib/cjs/workspace/Settings.d.ts.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
- package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsDb.js +19 -0
- package/lib/cjs/workspace/SettingsDb.js.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts +250 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.js +53 -0
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
- package/lib/cjs/workspace/Workspace.d.ts +42 -19
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts +32 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js +19 -0
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +0 -3
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js +28 -4
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +6 -0
- package/lib/esm/LineStyle.d.ts.map +1 -1
- package/lib/esm/LineStyle.js +41 -32
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.d.ts +17 -10
- package/lib/esm/LocalHub.d.ts.map +1 -1
- package/lib/esm/LocalHub.js +127 -29
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/core-backend.d.ts +2 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +2 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js +104 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js +5 -2
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +57 -15
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js +64 -13
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +35 -0
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +4 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +8 -0
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js +177 -7
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js +18 -0
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +160 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
- package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
- package/lib/esm/test/workspace/SettingsDb.test.js +465 -0
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
- package/lib/esm/workspace/Settings.d.ts +8 -0
- package/lib/esm/workspace/Settings.d.ts.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.d.ts +109 -0
- package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsDb.js +16 -0
- package/lib/esm/workspace/SettingsDb.js.map +1 -0
- package/lib/esm/workspace/SettingsEditor.d.ts +250 -0
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsEditor.js +50 -0
- package/lib/esm/workspace/SettingsEditor.js.map +1 -0
- package/lib/esm/workspace/Workspace.d.ts +42 -19
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts +32 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js +19 -0
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +15 -15
|
@@ -1,11 +1,31 @@
|
|
|
1
1
|
import * as sinon from "sinon";
|
|
2
2
|
import { expect } from "chai";
|
|
3
3
|
import { IpcHandler, IpcHost } from "../IpcHost";
|
|
4
|
+
class OuterError extends Error {
|
|
5
|
+
originalError;
|
|
6
|
+
context;
|
|
7
|
+
errors;
|
|
8
|
+
constructor(originalError) {
|
|
9
|
+
super("outer");
|
|
10
|
+
this.originalError = originalError;
|
|
11
|
+
this.context = { cause: originalError };
|
|
12
|
+
this.errors = [new Error("array-child-1"), new Error("array-child-2")];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
4
15
|
class MockIpcHandler extends IpcHandler {
|
|
5
16
|
get channelName() { return "mock-channel"; }
|
|
6
17
|
mockMethod() {
|
|
7
18
|
return "mock-value";
|
|
8
19
|
}
|
|
20
|
+
throwNestedError() {
|
|
21
|
+
const inner = new Error("inner-message");
|
|
22
|
+
throw new OuterError(inner);
|
|
23
|
+
}
|
|
24
|
+
throwCircularError() {
|
|
25
|
+
const err = new Error("circular");
|
|
26
|
+
err.cause = err; // circular reference
|
|
27
|
+
throw err;
|
|
28
|
+
}
|
|
9
29
|
#privateFunction() { }
|
|
10
30
|
}
|
|
11
31
|
describe("IpcHost", () => {
|
|
@@ -20,36 +40,67 @@ describe("IpcHost", () => {
|
|
|
20
40
|
await IpcHost.startup({ ipcHost: { socket } });
|
|
21
41
|
});
|
|
22
42
|
describe("IpcHandler", () => {
|
|
23
|
-
|
|
43
|
+
let handler;
|
|
44
|
+
beforeEach(() => {
|
|
24
45
|
MockIpcHandler.register();
|
|
25
46
|
const handleCall = socket.handle.getCalls().find((call) => call.args[0] === "itwin.mock-channel");
|
|
26
47
|
expect(handleCall).to.not.be.undefined;
|
|
27
|
-
|
|
28
|
-
|
|
48
|
+
handler = handleCall.args[1];
|
|
49
|
+
});
|
|
50
|
+
it("should call public methods", async () => {
|
|
29
51
|
const ipcReturn = await handler(undefined, "mockMethod");
|
|
30
52
|
expect(ipcReturn.result).to.equal("mock-value");
|
|
31
53
|
expect(ipcReturn.error).to.be.undefined;
|
|
32
54
|
});
|
|
33
55
|
it("should not call private methods", async () => {
|
|
34
|
-
MockIpcHandler.register();
|
|
35
|
-
const handleCall = socket.handle.getCalls().find((call) => call.args[0] === "itwin.mock-channel");
|
|
36
|
-
expect(handleCall).to.not.be.undefined;
|
|
37
|
-
const handler = handleCall.args[1];
|
|
38
|
-
expect(typeof handler).to.equal("function");
|
|
39
56
|
const ipcReturn = await handler(undefined, "#privateFunction");
|
|
40
57
|
expect(ipcReturn.result).to.be.undefined;
|
|
41
58
|
expect(ipcReturn.error).to.not.be.undefined;
|
|
42
59
|
});
|
|
43
60
|
it("should not call methods inherited from Object", async () => {
|
|
44
|
-
MockIpcHandler.register();
|
|
45
|
-
const handleCall = socket.handle.getCalls().find((call) => call.args[0] === "itwin.mock-channel");
|
|
46
|
-
expect(handleCall).to.not.be.undefined;
|
|
47
|
-
const handler = handleCall.args[1];
|
|
48
|
-
expect(typeof handler).to.equal("function");
|
|
49
61
|
const ipcReturn = await handler(undefined, "toString");
|
|
50
62
|
expect(ipcReturn.result).to.be.undefined;
|
|
51
63
|
expect(ipcReturn.error).to.not.be.undefined;
|
|
52
64
|
});
|
|
65
|
+
it("should serialize nested Error properties preserving message and stack", async () => {
|
|
66
|
+
const ipcReturn = await handler(undefined, "throwNestedError");
|
|
67
|
+
const error = ipcReturn.error;
|
|
68
|
+
// Top-level error
|
|
69
|
+
expect(error.message).to.equal("outer");
|
|
70
|
+
expect(error.stack).to.be.a("string");
|
|
71
|
+
// Direct Error property
|
|
72
|
+
expect(error.originalError.message).to.equal("inner-message");
|
|
73
|
+
expect(error.originalError.stack).to.be.a("string");
|
|
74
|
+
// Error nested inside a plain-object property
|
|
75
|
+
expect(error.context.cause.message).to.equal("inner-message");
|
|
76
|
+
expect(error.context.cause.stack).to.be.a("string");
|
|
77
|
+
// Array of Errors stays an array
|
|
78
|
+
expect(Array.isArray(error.errors)).to.be.true;
|
|
79
|
+
expect(error.errors[0].message).to.equal("array-child-1");
|
|
80
|
+
expect(error.errors[1].message).to.equal("array-child-2");
|
|
81
|
+
});
|
|
82
|
+
it("should omit stack on nested Errors when IpcHost.noStack is set", async () => {
|
|
83
|
+
const originalNoStack = IpcHost.noStack;
|
|
84
|
+
IpcHost.noStack = true;
|
|
85
|
+
try {
|
|
86
|
+
const ipcReturn = await handler(undefined, "throwNestedError");
|
|
87
|
+
const error = ipcReturn.error;
|
|
88
|
+
expect(error.stack).to.be.undefined;
|
|
89
|
+
expect(error.originalError.stack).to.be.undefined;
|
|
90
|
+
expect(error.context.cause.stack).to.be.undefined;
|
|
91
|
+
expect(error.errors[0].stack).to.be.undefined;
|
|
92
|
+
expect(error.errors[1].stack).to.be.undefined;
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
IpcHost.noStack = originalNoStack;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
it("should not infinitely recurse on circular Error references", async () => {
|
|
99
|
+
const ipcReturn = await handler(undefined, "throwCircularError");
|
|
100
|
+
const error = ipcReturn.error;
|
|
101
|
+
expect(error.message).to.equal("circular");
|
|
102
|
+
expect(error.cause).to.be.undefined;
|
|
103
|
+
});
|
|
53
104
|
});
|
|
54
105
|
});
|
|
55
106
|
//# sourceMappingURL=IpcHost.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IpcHost.test.js","sourceRoot":"","sources":["../../../src/test/IpcHost.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
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\";\r\nimport { expect } from \"chai\";\r\nimport { IpcInvokeReturn, IpcSocketBackend } from \"@itwin/core-common\";\r\nimport { IpcHandler, IpcHost } from \"../IpcHost\";\r\n\r\ninterface MockIpcInterface {\r\n mockMethod: () => string;\r\n throwNestedError: () => never;\r\n throwCircularError: () => never;\r\n}\r\n\r\nclass OuterError extends Error {\r\n public readonly context: { cause: Error };\r\n public readonly errors: Error[];\r\n constructor(public readonly originalError: Error) {\r\n super(\"outer\");\r\n this.context = { cause: originalError };\r\n this.errors = [new Error(\"array-child-1\"), new Error(\"array-child-2\")];\r\n }\r\n}\r\n\r\nclass MockIpcHandler extends IpcHandler implements MockIpcInterface {\r\n public override get channelName() { return \"mock-channel\"; }\r\n\r\n public mockMethod(): string {\r\n return \"mock-value\";\r\n }\r\n\r\n public throwNestedError(): never {\r\n const inner = new Error(\"inner-message\");\r\n throw new OuterError(inner);\r\n }\r\n\r\n public throwCircularError(): never {\r\n const err = new Error(\"circular\") as any;\r\n err.cause = err; // circular reference\r\n throw err;\r\n }\r\n\r\n #privateFunction(): void { }\r\n}\r\n\r\ndescribe(\"IpcHost\", () => {\r\n let socket: sinon.SinonStubbedInstance<IpcSocketBackend>;\r\n\r\n beforeEach(async () => {\r\n socket = {\r\n send: sinon.stub(),\r\n addListener: sinon.stub(),\r\n removeListener: sinon.stub(),\r\n handle: sinon.stub(),\r\n };\r\n\r\n await IpcHost.startup({ ipcHost: { socket } });\r\n });\r\n\r\n describe(\"IpcHandler\", () => {\r\n let handler: (...args: any[]) => Promise<IpcInvokeReturn>;\r\n\r\n beforeEach(() => {\r\n MockIpcHandler.register();\r\n const handleCall = socket.handle.getCalls().find((call) => call.args[0] === \"itwin.mock-channel\")!;\r\n expect(handleCall).to.not.be.undefined;\r\n handler = handleCall.args[1];\r\n });\r\n\r\n it(\"should call public methods\", async () => {\r\n const ipcReturn = await handler(undefined, \"mockMethod\");\r\n expect(ipcReturn.result).to.equal(\"mock-value\");\r\n expect(ipcReturn.error).to.be.undefined;\r\n });\r\n\r\n it(\"should not call private methods\", async () => {\r\n const ipcReturn = await handler(undefined, \"#privateFunction\");\r\n expect(ipcReturn.result).to.be.undefined;\r\n expect(ipcReturn.error).to.not.be.undefined;\r\n });\r\n\r\n it(\"should not call methods inherited from Object\", async () => {\r\n const ipcReturn = await handler(undefined, \"toString\");\r\n expect(ipcReturn.result).to.be.undefined;\r\n expect(ipcReturn.error).to.not.be.undefined;\r\n });\r\n\r\n it(\"should serialize nested Error properties preserving message and stack\", async () => {\r\n const ipcReturn = await handler(undefined, \"throwNestedError\");\r\n const error = ipcReturn.error as any;\r\n // Top-level error\r\n expect(error.message).to.equal(\"outer\");\r\n expect(error.stack).to.be.a(\"string\");\r\n // Direct Error property\r\n expect(error.originalError.message).to.equal(\"inner-message\");\r\n expect(error.originalError.stack).to.be.a(\"string\");\r\n // Error nested inside a plain-object property\r\n expect(error.context.cause.message).to.equal(\"inner-message\");\r\n expect(error.context.cause.stack).to.be.a(\"string\");\r\n // Array of Errors stays an array\r\n expect(Array.isArray(error.errors)).to.be.true;\r\n expect(error.errors[0].message).to.equal(\"array-child-1\");\r\n expect(error.errors[1].message).to.equal(\"array-child-2\");\r\n });\r\n\r\n it(\"should omit stack on nested Errors when IpcHost.noStack is set\", async () => {\r\n const originalNoStack = IpcHost.noStack;\r\n IpcHost.noStack = true;\r\n try {\r\n const ipcReturn = await handler(undefined, \"throwNestedError\");\r\n const error = ipcReturn.error as any;\r\n expect(error.stack).to.be.undefined;\r\n expect(error.originalError.stack).to.be.undefined;\r\n expect(error.context.cause.stack).to.be.undefined;\r\n expect(error.errors[0].stack).to.be.undefined;\r\n expect(error.errors[1].stack).to.be.undefined;\r\n } finally {\r\n IpcHost.noStack = originalNoStack;\r\n }\r\n });\r\n\r\n it(\"should not infinitely recurse on circular Error references\", async () => {\r\n const ipcReturn = await handler(undefined, \"throwCircularError\");\r\n const error = ipcReturn.error as any;\r\n expect(error.message).to.equal(\"circular\");\r\n expect(error.cause).to.be.undefined;\r\n });\r\n });\r\n});\r\n"]}
|
|
@@ -60,6 +60,7 @@ import { DefinitionModel, ElementTreeDeleter, ElementTreeWalkerScope, PhysicalMo
|
|
|
60
60
|
import { IModelTestUtils } from "../IModelTestUtils";
|
|
61
61
|
import { KnownTestLocations } from "../KnownTestLocations";
|
|
62
62
|
import { ECDbTestHelper } from "./ECDbTestHelper";
|
|
63
|
+
import { Range3d } from "@itwin/core-geometry";
|
|
63
64
|
import * as chai from "chai";
|
|
64
65
|
import * as chaiAsPromised from "chai-as-promised";
|
|
65
66
|
chai.use(chaiAsPromised);
|
|
@@ -263,6 +264,40 @@ describe("QueryReaders - createQueryReader() and withQueryReader() api tests", (
|
|
|
263
264
|
const reader = iModel.createQueryReader("SELECT ECInstanceId, ECClassId FROM bis.Element WHERE ECInstanceId=:firstId", params, { limit: { count: 1 } });
|
|
264
265
|
await readerCallback(reader);
|
|
265
266
|
});
|
|
267
|
+
it("should bind Range3d", async () => {
|
|
268
|
+
const env_5 = { stack: [], error: void 0, hasError: false };
|
|
269
|
+
try {
|
|
270
|
+
const testRange = new Range3d(1.2, 2.3, 3.4, 4.5, 5.6, 6.7);
|
|
271
|
+
const ecdb = __addDisposableResource(env_5, ECDbTestHelper.createECDb(outDir, "bindrange3d.ecdb", `<ECSchema schemaName="Test" alias="test" version="01.00.00" xmlns="http://www.bentley.com/schemas/Bentley.ECXML.3.1">
|
|
272
|
+
<ECEntityClass typeName="Foo" modifier="Sealed">
|
|
273
|
+
<ECProperty propertyName="Range3d" typeName="binary"/>
|
|
274
|
+
</ECEntityClass>
|
|
275
|
+
</ECSchema>`), false);
|
|
276
|
+
assert.isTrue(ecdb.isOpen);
|
|
277
|
+
ecdb.withCachedWriteStatement("INSERT INTO test.Foo([Range3d]) VALUES(?)", (stmt) => {
|
|
278
|
+
stmt.bindRange3d(1, testRange);
|
|
279
|
+
const res = stmt.stepForInsert();
|
|
280
|
+
assert.equal(res.status, DbResult.BE_SQLITE_DONE);
|
|
281
|
+
});
|
|
282
|
+
ecdb.saveChanges();
|
|
283
|
+
const params = new QueryBinder();
|
|
284
|
+
params.bindRange3d(1, testRange);
|
|
285
|
+
const reader = ecdb.createQueryReader("SELECT ECInstanceId, [Range3d] FROM test.Foo WHERE Range3d=?", params);
|
|
286
|
+
const rows = await reader.toArray();
|
|
287
|
+
const rangeBlob = rows[0][1];
|
|
288
|
+
const rangeFloatArray = new Float64Array(rangeBlob.buffer);
|
|
289
|
+
assert.equal(rangeFloatArray.length, 6);
|
|
290
|
+
const actualRange = new Range3d(...rangeFloatArray);
|
|
291
|
+
assert.isTrue(actualRange.isAlmostEqual(testRange));
|
|
292
|
+
}
|
|
293
|
+
catch (e_5) {
|
|
294
|
+
env_5.error = e_5;
|
|
295
|
+
env_5.hasError = true;
|
|
296
|
+
}
|
|
297
|
+
finally {
|
|
298
|
+
__disposeResources(env_5);
|
|
299
|
+
}
|
|
300
|
+
});
|
|
266
301
|
});
|
|
267
302
|
describe("Works as iterable iterator", () => {
|
|
268
303
|
it("iterable in for loop", async () => {
|