@itwin/core-backend 3.5.1 → 3.5.2
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 +8 -1
- package/lib/cjs/AliCloudStorageService.d.ts +23 -23
- package/lib/cjs/AliCloudStorageService.js +71 -71
- package/lib/cjs/AliCloudStorageService.js.map +1 -1
- package/lib/cjs/BackendHubAccess.d.ts +224 -224
- package/lib/cjs/BackendHubAccess.js +41 -41
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.d.ts +91 -91
- package/lib/cjs/BackendLoggerCategory.js +99 -99
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BisCoreSchema.d.ts +21 -21
- package/lib/cjs/BisCoreSchema.js +60 -60
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BriefcaseManager.d.ts +170 -170
- package/lib/cjs/BriefcaseManager.js +413 -413
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/Category.d.ts +153 -153
- package/lib/cjs/Category.js +243 -243
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.d.ts +187 -187
- package/lib/cjs/ChangeSummaryManager.js +447 -447
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.d.ts +99 -99
- package/lib/cjs/ChangedElementsDb.js +165 -165
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangedElementsManager.d.ts +39 -39
- package/lib/cjs/ChangedElementsManager.js +88 -88
- package/lib/cjs/ChangedElementsManager.js.map +1 -1
- package/lib/cjs/CheckpointManager.d.ts +120 -120
- package/lib/cjs/CheckpointManager.js +343 -343
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.d.ts +79 -79
- package/lib/cjs/ClassRegistry.js +249 -249
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +350 -350
- package/lib/cjs/CloudSqlite.js +152 -152
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CloudStorageBackend.d.ts +58 -58
- package/lib/cjs/CloudStorageBackend.js +173 -173
- package/lib/cjs/CloudStorageBackend.js.map +1 -1
- package/lib/cjs/CodeService.d.ts +396 -396
- package/lib/cjs/CodeService.js +63 -63
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.d.ts +50 -50
- package/lib/cjs/CodeSpecs.js +112 -112
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.d.ts +13 -13
- package/lib/cjs/ConcurrentQuery.js +36 -36
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.d.ts +21 -21
- package/lib/cjs/CustomViewState3dCreator.js +81 -81
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.d.ts +71 -71
- package/lib/cjs/DevTools.js +154 -154
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.d.ts +106 -106
- package/lib/cjs/DisplayStyle.js +256 -256
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +191 -191
- package/lib/cjs/ECDb.js +350 -350
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.d.ts +18 -18
- package/lib/cjs/ECSchemaXmlContext.js +41 -41
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlStatement.d.ts +466 -466
- package/lib/cjs/ECSqlStatement.js +791 -791
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/Element.d.ts +1102 -1102
- package/lib/cjs/Element.js +1416 -1416
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts +176 -176
- package/lib/cjs/ElementAspect.js +211 -211
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.d.ts +9 -9
- package/lib/cjs/ElementGraphics.js +41 -41
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.d.ts +162 -162
- package/lib/cjs/ElementTreeWalker.js +409 -409
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.d.ts +106 -106
- package/lib/cjs/Entity.js +134 -134
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/EntityReferences.d.ts +49 -49
- package/lib/cjs/EntityReferences.js +95 -95
- package/lib/cjs/EntityReferences.js.map +1 -1
- package/lib/cjs/ExportGraphics.d.ts +317 -317
- package/lib/cjs/ExportGraphics.js +208 -208
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.d.ts +96 -96
- package/lib/cjs/ExternalSource.js +131 -131
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.d.ts +19 -19
- package/lib/cjs/GeoCoordConfig.js +85 -85
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeometrySummary.d.ts +4 -4
- package/lib/cjs/GeometrySummary.js +380 -380
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/HubMock.d.ts +94 -94
- package/lib/cjs/HubMock.js +222 -222
- package/lib/cjs/HubMock.js.map +1 -1
- package/lib/cjs/IModelCloneContext.d.ts +8 -8
- package/lib/cjs/IModelCloneContext.js +15 -15
- package/lib/cjs/IModelCloneContext.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +1183 -1183
- package/lib/cjs/IModelDb.js +2374 -2374
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.d.ts +89 -89
- package/lib/cjs/IModelElementCloneContext.js +159 -159
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +370 -370
- package/lib/cjs/IModelHost.js +496 -496
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelJsFs.d.ts +62 -62
- package/lib/cjs/IModelJsFs.js +140 -140
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts +104 -104
- package/lib/cjs/IpcHost.js +278 -278
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +311 -311
- package/lib/cjs/LineStyle.js +295 -295
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.d.ts +162 -162
- package/lib/cjs/LocalHub.js +587 -587
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.d.ts +20 -20
- package/lib/cjs/LocalhostIpcHost.js +81 -81
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/Material.d.ts +103 -103
- package/lib/cjs/Material.js +147 -147
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.d.ts +392 -392
- package/lib/cjs/Model.js +485 -485
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.d.ts +51 -51
- package/lib/cjs/NativeAppStorage.js +202 -202
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.d.ts +52 -52
- package/lib/cjs/NativeHost.js +163 -163
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.d.ts +156 -156
- package/lib/cjs/NavigationRelationship.js +225 -225
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.d.ts +51 -51
- package/lib/cjs/PromiseMemoizer.js +101 -101
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.d.ts +132 -132
- package/lib/cjs/PropertyStore.js +11 -11
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.d.ts +416 -416
- package/lib/cjs/Relationship.js +494 -494
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/RpcBackend.d.ts +5 -5
- package/lib/cjs/RpcBackend.js +31 -31
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SQLiteDb.d.ts +219 -219
- package/lib/cjs/SQLiteDb.js +214 -214
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.d.ts +55 -55
- package/lib/cjs/Schema.js +83 -83
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/ServerBasedLocks.d.ts +57 -57
- package/lib/cjs/ServerBasedLocks.js +168 -168
- package/lib/cjs/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/SqliteStatement.d.ts +360 -360
- package/lib/cjs/SqliteStatement.js +586 -586
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/Texture.d.ts +58 -58
- package/lib/cjs/Texture.js +82 -82
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.d.ts +18 -18
- package/lib/cjs/TileStorage.js +90 -90
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +202 -202
- package/lib/cjs/TxnManager.js +356 -356
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.d.ts +439 -439
- package/lib/cjs/ViewDefinition.js +646 -646
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.d.ts +13 -13
- package/lib/cjs/ViewStateHydrator.js +103 -103
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
- package/lib/cjs/assets/Settings/Schemas/Cloud.Schema.json +67 -67
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +31 -31
- package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +52 -52
- package/lib/cjs/assets/Settings/backend.setting.json5 +138 -138
- package/lib/cjs/core-backend.d.ts +184 -184
- package/lib/cjs/core-backend.js +204 -204
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.d.ts +101 -101
- package/lib/cjs/domains/FunctionalElements.js +145 -145
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/FunctionalSchema.d.ts +13 -13
- package/lib/cjs/domains/FunctionalSchema.js +40 -40
- package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
- package/lib/cjs/domains/GenericElements.d.ts +177 -177
- package/lib/cjs/domains/GenericElements.js +263 -263
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/domains/GenericSchema.d.ts +10 -10
- package/lib/cjs/domains/GenericSchema.js +28 -28
- package/lib/cjs/domains/GenericSchema.js.map +1 -1
- package/lib/cjs/rpc/multipart.d.ts +11 -11
- package/lib/cjs/rpc/multipart.js +70 -70
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.d.ts +28 -28
- package/lib/cjs/rpc/tracing.js +73 -73
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/logging.d.ts +9 -9
- package/lib/cjs/rpc/web/logging.js +42 -42
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/request.d.ts +6 -6
- package/lib/cjs/rpc/web/request.js +73 -73
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.d.ts +6 -6
- package/lib/cjs/rpc/web/response.js +105 -105
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.d.ts +15 -15
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js +32 -32
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +47 -47
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +291 -291
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts +22 -22
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +202 -202
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +36 -36
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +168 -168
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +16 -16
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +43 -43
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/WipRpcImpl.d.ts +15 -15
- package/lib/cjs/rpc-impl/WipRpcImpl.js +37 -37
- package/lib/cjs/rpc-impl/WipRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.d.ts +186 -186
- package/lib/cjs/workspace/Settings.js +155 -155
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.d.ts +75 -75
- package/lib/cjs/workspace/SettingsSchemas.js +191 -191
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +414 -414
- package/lib/cjs/workspace/Workspace.js +543 -543
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/package.json +13 -13
|
@@ -1,203 +1,203 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
-
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
/** @packageDocumentation
|
|
7
|
-
* @module NativeApp
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.NativeAppStorage = void 0;
|
|
11
|
-
const path_1 = require("path");
|
|
12
|
-
const core_bentley_1 = require("@itwin/core-bentley");
|
|
13
|
-
const core_common_1 = require("@itwin/core-common");
|
|
14
|
-
const ECDb_1 = require("./ECDb");
|
|
15
|
-
const IModelHost_1 = require("./IModelHost");
|
|
16
|
-
const IModelJsFs_1 = require("./IModelJsFs");
|
|
17
|
-
const NativeHost_1 = require("./NativeHost");
|
|
18
|
-
// cspell:ignore ecdb
|
|
19
|
-
/**
|
|
20
|
-
* A local file stored in the [[NativeHost.appSettingsCacheDir]] for storing key/value pairs.
|
|
21
|
-
* @public
|
|
22
|
-
*/
|
|
23
|
-
class NativeAppStorage {
|
|
24
|
-
constructor(_ecdb, id) {
|
|
25
|
-
this._ecdb = _ecdb;
|
|
26
|
-
this.id = id;
|
|
27
|
-
}
|
|
28
|
-
/** Set the value for a key */
|
|
29
|
-
setData(key, value) {
|
|
30
|
-
const rc = this._ecdb.withPreparedSqliteStatement("INSERT INTO app_setting(key,type,val)VALUES(?,?,?) ON CONFLICT(key) DO UPDATE SET type=excluded.type,val=excluded.val", (stmt) => {
|
|
31
|
-
let valType = (value === undefined || value === null) ? "null" : typeof value;
|
|
32
|
-
if (valType === "object" && (value instanceof Uint8Array))
|
|
33
|
-
valType = "Uint8Array";
|
|
34
|
-
switch (valType) {
|
|
35
|
-
case "null":
|
|
36
|
-
case "number":
|
|
37
|
-
case "string":
|
|
38
|
-
case "boolean":
|
|
39
|
-
case "Uint8Array":
|
|
40
|
-
break;
|
|
41
|
-
default:
|
|
42
|
-
throw new core_common_1.IModelError(core_bentley_1.DbResult.BE_SQLITE_ERROR, `Unsupported type ${valType} for value for key='${key}`);
|
|
43
|
-
}
|
|
44
|
-
stmt.bindValue(1, key);
|
|
45
|
-
stmt.bindValue(2, valType);
|
|
46
|
-
stmt.bindValue(3, value);
|
|
47
|
-
return stmt.step();
|
|
48
|
-
});
|
|
49
|
-
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
|
|
50
|
-
throw new core_common_1.IModelError(rc, "SQLite error");
|
|
51
|
-
this._ecdb.saveChanges();
|
|
52
|
-
}
|
|
53
|
-
/** Get the value for a key from this Storage. If key is not present or is null, return undefined. */
|
|
54
|
-
getData(key) {
|
|
55
|
-
return this._ecdb.withPreparedSqliteStatement("SELECT type,val FROM app_setting WHERE key=?", (stmt) => {
|
|
56
|
-
stmt.bindValue(1, key);
|
|
57
|
-
if (core_bentley_1.DbResult.BE_SQLITE_ROW !== stmt.step())
|
|
58
|
-
return undefined;
|
|
59
|
-
const valType = stmt.getValueString(0);
|
|
60
|
-
switch (valType) {
|
|
61
|
-
case "number":
|
|
62
|
-
return stmt.getValueDouble(1);
|
|
63
|
-
case "string":
|
|
64
|
-
return stmt.getValueString(1);
|
|
65
|
-
case "boolean":
|
|
66
|
-
return Boolean(stmt.getValueInteger(1));
|
|
67
|
-
case "Uint8Array":
|
|
68
|
-
return stmt.getValueBlob(1);
|
|
69
|
-
case "null":
|
|
70
|
-
return undefined;
|
|
71
|
-
}
|
|
72
|
-
throw new core_common_1.IModelError(core_bentley_1.DbResult.BE_SQLITE_ERROR, `Unsupported type in cache ${valType}`);
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
/** return the type of the value for a key, or undefined if not present. */
|
|
76
|
-
getValueType(key) {
|
|
77
|
-
return this._ecdb.withSqliteStatement("SELECT type FROM app_setting WHERE key=?", (stmt) => {
|
|
78
|
-
stmt.bindValue(1, key);
|
|
79
|
-
return stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW ? stmt.getValueString(0) : undefined;
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
/** return `true` if the key is present, but has a null value. */
|
|
83
|
-
hasNullValue(key) {
|
|
84
|
-
return this.getValueType(key) === "null";
|
|
85
|
-
}
|
|
86
|
-
/** Get the value for a key as a string. If it is not present, or not of type string, return undefined */
|
|
87
|
-
getString(key) {
|
|
88
|
-
const val = this.getData(key);
|
|
89
|
-
return typeof val === "string" ? val : undefined;
|
|
90
|
-
}
|
|
91
|
-
/** Get the value for a key as a number. If it is not present, or not of type number, return undefined */
|
|
92
|
-
getNumber(key) {
|
|
93
|
-
const val = this.getData(key);
|
|
94
|
-
return typeof val === "number" ? val : undefined;
|
|
95
|
-
}
|
|
96
|
-
/** Get the value for a key as a boolean. If it is not present, or not of type boolean, return undefined */
|
|
97
|
-
getBoolean(key) {
|
|
98
|
-
const val = this.getData(key);
|
|
99
|
-
return typeof val === "boolean" ? val : undefined;
|
|
100
|
-
}
|
|
101
|
-
/** Get the value for a key as a Uint8Array. If it is not present, or not of type Uint8Array, return undefined */
|
|
102
|
-
getUint8Array(key) {
|
|
103
|
-
const val = this.getData(key);
|
|
104
|
-
return val instanceof Uint8Array ? val : undefined;
|
|
105
|
-
}
|
|
106
|
-
/** Get all key names in this Storage */
|
|
107
|
-
getKeys() {
|
|
108
|
-
const keys = new Array();
|
|
109
|
-
this._ecdb.withPreparedSqliteStatement("SELECT key FROM app_setting", (stmt) => {
|
|
110
|
-
while (core_bentley_1.DbResult.BE_SQLITE_ROW === stmt.step()) {
|
|
111
|
-
keys.push(stmt.getValueString(0));
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
return keys;
|
|
115
|
-
}
|
|
116
|
-
/** Remove a key/value pair from this Storage */
|
|
117
|
-
removeData(key) {
|
|
118
|
-
const rc = this._ecdb.withPreparedSqliteStatement("DELETE FROM app_setting WHERE key=?", (stmt) => {
|
|
119
|
-
stmt.bindValue(1, key);
|
|
120
|
-
return stmt.step();
|
|
121
|
-
});
|
|
122
|
-
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE) {
|
|
123
|
-
throw new core_common_1.IModelError(rc, "SQLite error");
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
/** Remove all key/value pairs */
|
|
127
|
-
removeAll() {
|
|
128
|
-
const rc = this._ecdb.withPreparedSqliteStatement("DELETE FROM app_setting", (stmt) => {
|
|
129
|
-
return stmt.step();
|
|
130
|
-
});
|
|
131
|
-
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE) {
|
|
132
|
-
throw new core_common_1.IModelError(rc, "SQLite error");
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/** Close this Storage. */
|
|
136
|
-
close(deleteFile = false) {
|
|
137
|
-
const storageFile = (0, path_1.join)(NativeHost_1.NativeHost.appSettingsCacheDir, this.id);
|
|
138
|
-
this._ecdb.saveChanges();
|
|
139
|
-
this._ecdb.closeDb();
|
|
140
|
-
this._ecdb = undefined;
|
|
141
|
-
if (deleteFile)
|
|
142
|
-
IModelJsFs_1.IModelJsFs.removeSync(storageFile);
|
|
143
|
-
NativeAppStorage._storages.delete(this.id);
|
|
144
|
-
}
|
|
145
|
-
static init(ecdb) {
|
|
146
|
-
return ecdb.withPreparedSqliteStatement("CREATE TABLE app_setting(key PRIMARY KEY,type,val);", (stmt) => {
|
|
147
|
-
return stmt.step();
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
/** find and open storage by its name. */
|
|
151
|
-
static find(name) {
|
|
152
|
-
const storage = this._storages.get(name);
|
|
153
|
-
if (undefined === storage)
|
|
154
|
-
throw new core_common_1.IModelError(core_bentley_1.IModelStatus.FileNotFound, `Storage ${name} not open`);
|
|
155
|
-
return storage;
|
|
156
|
-
}
|
|
157
|
-
/** Close all opened Storages.
|
|
158
|
-
* @internal
|
|
159
|
-
*/
|
|
160
|
-
static closeAll() {
|
|
161
|
-
this._storages.forEach((value) => value.close());
|
|
162
|
-
this._storages.clear();
|
|
163
|
-
}
|
|
164
|
-
/** @internal */
|
|
165
|
-
static getStorageNames() {
|
|
166
|
-
return IModelJsFs_1.IModelJsFs.readdirSync(NativeHost_1.NativeHost.appSettingsCacheDir).filter((name) => name.endsWith(this._ext));
|
|
167
|
-
}
|
|
168
|
-
/** Open or find a Storage by name. */
|
|
169
|
-
static open(name) {
|
|
170
|
-
if (!this._init) {
|
|
171
|
-
IModelHost_1.IModelHost.onBeforeShutdown.addOnce(() => this.closeAll());
|
|
172
|
-
this._init = true;
|
|
173
|
-
}
|
|
174
|
-
const fileName = name + this._ext;
|
|
175
|
-
if (!IModelJsFs_1.IModelJsFs.existsSync(NativeHost_1.NativeHost.appSettingsCacheDir))
|
|
176
|
-
IModelJsFs_1.IModelJsFs.recursiveMkDirSync(NativeHost_1.NativeHost.appSettingsCacheDir);
|
|
177
|
-
const storageFile = (0, path_1.join)(NativeHost_1.NativeHost.appSettingsCacheDir, fileName);
|
|
178
|
-
try {
|
|
179
|
-
return this.find(fileName); // see if it's already open
|
|
180
|
-
}
|
|
181
|
-
catch (err) {
|
|
182
|
-
const ecdb = new ECDb_1.ECDb();
|
|
183
|
-
if (IModelJsFs_1.IModelJsFs.existsSync(storageFile)) {
|
|
184
|
-
ecdb.openDb(storageFile, ECDb_1.ECDbOpenMode.ReadWrite);
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
ecdb.createDb(storageFile);
|
|
188
|
-
const rc = this.init(ecdb);
|
|
189
|
-
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
|
|
190
|
-
throw new core_common_1.IModelError(rc, "SQLite error");
|
|
191
|
-
ecdb.saveChanges();
|
|
192
|
-
}
|
|
193
|
-
const storage = new NativeAppStorage(ecdb, fileName);
|
|
194
|
-
this._storages.set(fileName, storage);
|
|
195
|
-
return storage;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
exports.NativeAppStorage = NativeAppStorage;
|
|
200
|
-
NativeAppStorage._ext = ".settings-db";
|
|
201
|
-
NativeAppStorage._storages = new Map();
|
|
202
|
-
NativeAppStorage._init = false;
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
+
*--------------------------------------------------------------------------------------------*/
|
|
6
|
+
/** @packageDocumentation
|
|
7
|
+
* @module NativeApp
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.NativeAppStorage = void 0;
|
|
11
|
+
const path_1 = require("path");
|
|
12
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
13
|
+
const core_common_1 = require("@itwin/core-common");
|
|
14
|
+
const ECDb_1 = require("./ECDb");
|
|
15
|
+
const IModelHost_1 = require("./IModelHost");
|
|
16
|
+
const IModelJsFs_1 = require("./IModelJsFs");
|
|
17
|
+
const NativeHost_1 = require("./NativeHost");
|
|
18
|
+
// cspell:ignore ecdb
|
|
19
|
+
/**
|
|
20
|
+
* A local file stored in the [[NativeHost.appSettingsCacheDir]] for storing key/value pairs.
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
class NativeAppStorage {
|
|
24
|
+
constructor(_ecdb, id) {
|
|
25
|
+
this._ecdb = _ecdb;
|
|
26
|
+
this.id = id;
|
|
27
|
+
}
|
|
28
|
+
/** Set the value for a key */
|
|
29
|
+
setData(key, value) {
|
|
30
|
+
const rc = this._ecdb.withPreparedSqliteStatement("INSERT INTO app_setting(key,type,val)VALUES(?,?,?) ON CONFLICT(key) DO UPDATE SET type=excluded.type,val=excluded.val", (stmt) => {
|
|
31
|
+
let valType = (value === undefined || value === null) ? "null" : typeof value;
|
|
32
|
+
if (valType === "object" && (value instanceof Uint8Array))
|
|
33
|
+
valType = "Uint8Array";
|
|
34
|
+
switch (valType) {
|
|
35
|
+
case "null":
|
|
36
|
+
case "number":
|
|
37
|
+
case "string":
|
|
38
|
+
case "boolean":
|
|
39
|
+
case "Uint8Array":
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
throw new core_common_1.IModelError(core_bentley_1.DbResult.BE_SQLITE_ERROR, `Unsupported type ${valType} for value for key='${key}`);
|
|
43
|
+
}
|
|
44
|
+
stmt.bindValue(1, key);
|
|
45
|
+
stmt.bindValue(2, valType);
|
|
46
|
+
stmt.bindValue(3, value);
|
|
47
|
+
return stmt.step();
|
|
48
|
+
});
|
|
49
|
+
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
|
|
50
|
+
throw new core_common_1.IModelError(rc, "SQLite error");
|
|
51
|
+
this._ecdb.saveChanges();
|
|
52
|
+
}
|
|
53
|
+
/** Get the value for a key from this Storage. If key is not present or is null, return undefined. */
|
|
54
|
+
getData(key) {
|
|
55
|
+
return this._ecdb.withPreparedSqliteStatement("SELECT type,val FROM app_setting WHERE key=?", (stmt) => {
|
|
56
|
+
stmt.bindValue(1, key);
|
|
57
|
+
if (core_bentley_1.DbResult.BE_SQLITE_ROW !== stmt.step())
|
|
58
|
+
return undefined;
|
|
59
|
+
const valType = stmt.getValueString(0);
|
|
60
|
+
switch (valType) {
|
|
61
|
+
case "number":
|
|
62
|
+
return stmt.getValueDouble(1);
|
|
63
|
+
case "string":
|
|
64
|
+
return stmt.getValueString(1);
|
|
65
|
+
case "boolean":
|
|
66
|
+
return Boolean(stmt.getValueInteger(1));
|
|
67
|
+
case "Uint8Array":
|
|
68
|
+
return stmt.getValueBlob(1);
|
|
69
|
+
case "null":
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
throw new core_common_1.IModelError(core_bentley_1.DbResult.BE_SQLITE_ERROR, `Unsupported type in cache ${valType}`);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** return the type of the value for a key, or undefined if not present. */
|
|
76
|
+
getValueType(key) {
|
|
77
|
+
return this._ecdb.withSqliteStatement("SELECT type FROM app_setting WHERE key=?", (stmt) => {
|
|
78
|
+
stmt.bindValue(1, key);
|
|
79
|
+
return stmt.step() === core_bentley_1.DbResult.BE_SQLITE_ROW ? stmt.getValueString(0) : undefined;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** return `true` if the key is present, but has a null value. */
|
|
83
|
+
hasNullValue(key) {
|
|
84
|
+
return this.getValueType(key) === "null";
|
|
85
|
+
}
|
|
86
|
+
/** Get the value for a key as a string. If it is not present, or not of type string, return undefined */
|
|
87
|
+
getString(key) {
|
|
88
|
+
const val = this.getData(key);
|
|
89
|
+
return typeof val === "string" ? val : undefined;
|
|
90
|
+
}
|
|
91
|
+
/** Get the value for a key as a number. If it is not present, or not of type number, return undefined */
|
|
92
|
+
getNumber(key) {
|
|
93
|
+
const val = this.getData(key);
|
|
94
|
+
return typeof val === "number" ? val : undefined;
|
|
95
|
+
}
|
|
96
|
+
/** Get the value for a key as a boolean. If it is not present, or not of type boolean, return undefined */
|
|
97
|
+
getBoolean(key) {
|
|
98
|
+
const val = this.getData(key);
|
|
99
|
+
return typeof val === "boolean" ? val : undefined;
|
|
100
|
+
}
|
|
101
|
+
/** Get the value for a key as a Uint8Array. If it is not present, or not of type Uint8Array, return undefined */
|
|
102
|
+
getUint8Array(key) {
|
|
103
|
+
const val = this.getData(key);
|
|
104
|
+
return val instanceof Uint8Array ? val : undefined;
|
|
105
|
+
}
|
|
106
|
+
/** Get all key names in this Storage */
|
|
107
|
+
getKeys() {
|
|
108
|
+
const keys = new Array();
|
|
109
|
+
this._ecdb.withPreparedSqliteStatement("SELECT key FROM app_setting", (stmt) => {
|
|
110
|
+
while (core_bentley_1.DbResult.BE_SQLITE_ROW === stmt.step()) {
|
|
111
|
+
keys.push(stmt.getValueString(0));
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return keys;
|
|
115
|
+
}
|
|
116
|
+
/** Remove a key/value pair from this Storage */
|
|
117
|
+
removeData(key) {
|
|
118
|
+
const rc = this._ecdb.withPreparedSqliteStatement("DELETE FROM app_setting WHERE key=?", (stmt) => {
|
|
119
|
+
stmt.bindValue(1, key);
|
|
120
|
+
return stmt.step();
|
|
121
|
+
});
|
|
122
|
+
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE) {
|
|
123
|
+
throw new core_common_1.IModelError(rc, "SQLite error");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Remove all key/value pairs */
|
|
127
|
+
removeAll() {
|
|
128
|
+
const rc = this._ecdb.withPreparedSqliteStatement("DELETE FROM app_setting", (stmt) => {
|
|
129
|
+
return stmt.step();
|
|
130
|
+
});
|
|
131
|
+
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE) {
|
|
132
|
+
throw new core_common_1.IModelError(rc, "SQLite error");
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Close this Storage. */
|
|
136
|
+
close(deleteFile = false) {
|
|
137
|
+
const storageFile = (0, path_1.join)(NativeHost_1.NativeHost.appSettingsCacheDir, this.id);
|
|
138
|
+
this._ecdb.saveChanges();
|
|
139
|
+
this._ecdb.closeDb();
|
|
140
|
+
this._ecdb = undefined;
|
|
141
|
+
if (deleteFile)
|
|
142
|
+
IModelJsFs_1.IModelJsFs.removeSync(storageFile);
|
|
143
|
+
NativeAppStorage._storages.delete(this.id);
|
|
144
|
+
}
|
|
145
|
+
static init(ecdb) {
|
|
146
|
+
return ecdb.withPreparedSqliteStatement("CREATE TABLE app_setting(key PRIMARY KEY,type,val);", (stmt) => {
|
|
147
|
+
return stmt.step();
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/** find and open storage by its name. */
|
|
151
|
+
static find(name) {
|
|
152
|
+
const storage = this._storages.get(name);
|
|
153
|
+
if (undefined === storage)
|
|
154
|
+
throw new core_common_1.IModelError(core_bentley_1.IModelStatus.FileNotFound, `Storage ${name} not open`);
|
|
155
|
+
return storage;
|
|
156
|
+
}
|
|
157
|
+
/** Close all opened Storages.
|
|
158
|
+
* @internal
|
|
159
|
+
*/
|
|
160
|
+
static closeAll() {
|
|
161
|
+
this._storages.forEach((value) => value.close());
|
|
162
|
+
this._storages.clear();
|
|
163
|
+
}
|
|
164
|
+
/** @internal */
|
|
165
|
+
static getStorageNames() {
|
|
166
|
+
return IModelJsFs_1.IModelJsFs.readdirSync(NativeHost_1.NativeHost.appSettingsCacheDir).filter((name) => name.endsWith(this._ext));
|
|
167
|
+
}
|
|
168
|
+
/** Open or find a Storage by name. */
|
|
169
|
+
static open(name) {
|
|
170
|
+
if (!this._init) {
|
|
171
|
+
IModelHost_1.IModelHost.onBeforeShutdown.addOnce(() => this.closeAll());
|
|
172
|
+
this._init = true;
|
|
173
|
+
}
|
|
174
|
+
const fileName = name + this._ext;
|
|
175
|
+
if (!IModelJsFs_1.IModelJsFs.existsSync(NativeHost_1.NativeHost.appSettingsCacheDir))
|
|
176
|
+
IModelJsFs_1.IModelJsFs.recursiveMkDirSync(NativeHost_1.NativeHost.appSettingsCacheDir);
|
|
177
|
+
const storageFile = (0, path_1.join)(NativeHost_1.NativeHost.appSettingsCacheDir, fileName);
|
|
178
|
+
try {
|
|
179
|
+
return this.find(fileName); // see if it's already open
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
const ecdb = new ECDb_1.ECDb();
|
|
183
|
+
if (IModelJsFs_1.IModelJsFs.existsSync(storageFile)) {
|
|
184
|
+
ecdb.openDb(storageFile, ECDb_1.ECDbOpenMode.ReadWrite);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
ecdb.createDb(storageFile);
|
|
188
|
+
const rc = this.init(ecdb);
|
|
189
|
+
if (rc !== core_bentley_1.DbResult.BE_SQLITE_DONE)
|
|
190
|
+
throw new core_common_1.IModelError(rc, "SQLite error");
|
|
191
|
+
ecdb.saveChanges();
|
|
192
|
+
}
|
|
193
|
+
const storage = new NativeAppStorage(ecdb, fileName);
|
|
194
|
+
this._storages.set(fileName, storage);
|
|
195
|
+
return storage;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
exports.NativeAppStorage = NativeAppStorage;
|
|
200
|
+
NativeAppStorage._ext = ".settings-db";
|
|
201
|
+
NativeAppStorage._storages = new Map();
|
|
202
|
+
NativeAppStorage._init = false;
|
|
203
203
|
//# sourceMappingURL=NativeAppStorage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeAppStorage.js","sourceRoot":"","sources":["../../src/NativeAppStorage.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/** @packageDocumentation\n * @module NativeApp\n */\n\nimport { join } from \"path\";\nimport { DbResult, IModelStatus } from \"@itwin/core-bentley\";\nimport { IModelError, StorageValue } from \"@itwin/core-common\";\nimport { ECDb, ECDbOpenMode } from \"./ECDb\";\nimport { IModelHost } from \"./IModelHost\";\nimport { IModelJsFs } from \"./IModelJsFs\";\nimport { NativeHost } from \"./NativeHost\";\n\n// cspell:ignore ecdb\n\n/**\n * A local file stored in the [[NativeHost.appSettingsCacheDir]] for storing key/value pairs.\n * @public\n */\nexport class NativeAppStorage {\n private static readonly _ext = \".settings-db\";\n private static _storages = new Map<string, NativeAppStorage>();\n private static _init: boolean = false;\n private constructor(private _ecdb: ECDb, public readonly id: string) { }\n\n /** Set the value for a key */\n public setData(key: string, value: StorageValue): void {\n const rc = this._ecdb.withPreparedSqliteStatement(\"INSERT INTO app_setting(key,type,val)VALUES(?,?,?) ON CONFLICT(key) DO UPDATE SET type=excluded.type,val=excluded.val\", (stmt) => {\n let valType = (value === undefined || value === null) ? \"null\" : typeof value;\n if (valType === \"object\" && (value instanceof Uint8Array))\n valType = \"Uint8Array\";\n\n switch (valType) {\n case \"null\":\n case \"number\":\n case \"string\":\n case \"boolean\":\n case \"Uint8Array\":\n break;\n default:\n throw new IModelError(DbResult.BE_SQLITE_ERROR, `Unsupported type ${valType} for value for key='${key}`);\n }\n\n stmt.bindValue(1, key);\n stmt.bindValue(2, valType);\n stmt.bindValue(3, value);\n return stmt.step();\n });\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"SQLite error\");\n\n this._ecdb.saveChanges();\n }\n\n /** Get the value for a key from this Storage. If key is not present or is null, return undefined. */\n public getData(key: string): StorageValue {\n return this._ecdb.withPreparedSqliteStatement(\"SELECT type,val FROM app_setting WHERE key=?\", (stmt) => {\n stmt.bindValue(1, key);\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\n return undefined;\n const valType = stmt.getValueString(0);\n switch (valType) {\n case \"number\":\n return stmt.getValueDouble(1);\n case \"string\":\n return stmt.getValueString(1);\n case \"boolean\":\n return Boolean(stmt.getValueInteger(1));\n case \"Uint8Array\":\n return stmt.getValueBlob(1);\n case \"null\":\n return undefined;\n }\n throw new IModelError(DbResult.BE_SQLITE_ERROR, `Unsupported type in cache ${valType}`);\n });\n }\n\n /** return the type of the value for a key, or undefined if not present. */\n public getValueType(key: string): \"number\" | \"string\" | \"boolean\" | \"Uint8Array\" | \"null\" | undefined {\n return this._ecdb.withSqliteStatement(\"SELECT type FROM app_setting WHERE key=?\", (stmt) => {\n stmt.bindValue(1, key);\n return stmt.step() === DbResult.BE_SQLITE_ROW ? stmt.getValueString(0) as any : undefined;\n });\n }\n\n /** return `true` if the key is present, but has a null value. */\n public hasNullValue(key: string): boolean {\n return this.getValueType(key) === \"null\";\n }\n\n /** Get the value for a key as a string. If it is not present, or not of type string, return undefined */\n public getString(key: string): string | undefined {\n const val = this.getData(key);\n return typeof val === \"string\" ? val : undefined;\n }\n\n /** Get the value for a key as a number. If it is not present, or not of type number, return undefined */\n public getNumber(key: string): number | undefined {\n const val = this.getData(key);\n return typeof val === \"number\" ? val : undefined;\n }\n\n /** Get the value for a key as a boolean. If it is not present, or not of type boolean, return undefined */\n public getBoolean(key: string): boolean | undefined {\n const val = this.getData(key);\n return typeof val === \"boolean\" ? val : undefined;\n }\n\n /** Get the value for a key as a Uint8Array. If it is not present, or not of type Uint8Array, return undefined */\n public getUint8Array(key: string): Uint8Array | undefined {\n const val = this.getData(key);\n return val instanceof Uint8Array ? val : undefined;\n }\n\n /** Get all key names in this Storage */\n public getKeys(): string[] {\n const keys = new Array<string>();\n this._ecdb.withPreparedSqliteStatement(\"SELECT key FROM app_setting\", (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n keys.push(stmt.getValueString(0));\n }\n });\n return keys;\n }\n\n /** Remove a key/value pair from this Storage */\n public removeData(key: string) {\n const rc = this._ecdb.withPreparedSqliteStatement(\"DELETE FROM app_setting WHERE key=?\", (stmt) => {\n stmt.bindValue(1, key);\n return stmt.step();\n });\n if (rc !== DbResult.BE_SQLITE_DONE) {\n throw new IModelError(rc, \"SQLite error\");\n }\n }\n\n /** Remove all key/value pairs */\n public removeAll() {\n const rc = this._ecdb.withPreparedSqliteStatement(\"DELETE FROM app_setting\", (stmt) => {\n return stmt.step();\n });\n if (rc !== DbResult.BE_SQLITE_DONE) {\n throw new IModelError(rc, \"SQLite error\");\n }\n }\n\n /** Close this Storage. */\n public close(deleteFile: boolean = false) {\n const storageFile = join(NativeHost.appSettingsCacheDir, this.id);\n this._ecdb.saveChanges();\n this._ecdb.closeDb();\n (this._ecdb as any) = undefined;\n if (deleteFile)\n IModelJsFs.removeSync(storageFile);\n NativeAppStorage._storages.delete(this.id);\n }\n\n private static init(ecdb: ECDb): DbResult {\n return ecdb.withPreparedSqliteStatement(\"CREATE TABLE app_setting(key PRIMARY KEY,type,val);\", (stmt) => {\n return stmt.step();\n });\n }\n\n /** find and open storage by its name. */\n public static find(name: string): NativeAppStorage {\n const storage = this._storages.get(name);\n if (undefined === storage)\n throw new IModelError(IModelStatus.FileNotFound, `Storage ${name} not open`);\n return storage;\n }\n\n /** Close all opened Storages.\n * @internal\n */\n public static closeAll() {\n this._storages.forEach((value) => value.close());\n this._storages.clear();\n }\n\n /** @internal */\n public static getStorageNames(): string[] {\n return IModelJsFs.readdirSync(NativeHost.appSettingsCacheDir).filter((name) => name.endsWith(this._ext));\n }\n\n /** Open or find a Storage by name. */\n public static open(name: string): NativeAppStorage {\n if (!this._init) {\n IModelHost.onBeforeShutdown.addOnce(() => this.closeAll());\n this._init = true;\n }\n const fileName = name + this._ext;\n if (!IModelJsFs.existsSync(NativeHost.appSettingsCacheDir))\n IModelJsFs.recursiveMkDirSync(NativeHost.appSettingsCacheDir);\n\n const storageFile = join(NativeHost.appSettingsCacheDir, fileName);\n try {\n return this.find(fileName); // see if it's already open\n } catch (err) {\n const ecdb = new ECDb();\n if (IModelJsFs.existsSync(storageFile)) {\n ecdb.openDb(storageFile, ECDbOpenMode.ReadWrite);\n } else {\n ecdb.createDb(storageFile);\n const rc = this.init(ecdb);\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"SQLite error\");\n ecdb.saveChanges();\n }\n const storage = new NativeAppStorage(ecdb, fileName);\n this._storages.set(fileName, storage);\n return storage;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NativeAppStorage.js","sourceRoot":"","sources":["../../src/NativeAppStorage.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/** @packageDocumentation\r\n * @module NativeApp\r\n */\r\n\r\nimport { join } from \"path\";\r\nimport { DbResult, IModelStatus } from \"@itwin/core-bentley\";\r\nimport { IModelError, StorageValue } from \"@itwin/core-common\";\r\nimport { ECDb, ECDbOpenMode } from \"./ECDb\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { NativeHost } from \"./NativeHost\";\r\n\r\n// cspell:ignore ecdb\r\n\r\n/**\r\n * A local file stored in the [[NativeHost.appSettingsCacheDir]] for storing key/value pairs.\r\n * @public\r\n */\r\nexport class NativeAppStorage {\r\n private static readonly _ext = \".settings-db\";\r\n private static _storages = new Map<string, NativeAppStorage>();\r\n private static _init: boolean = false;\r\n private constructor(private _ecdb: ECDb, public readonly id: string) { }\r\n\r\n /** Set the value for a key */\r\n public setData(key: string, value: StorageValue): void {\r\n const rc = this._ecdb.withPreparedSqliteStatement(\"INSERT INTO app_setting(key,type,val)VALUES(?,?,?) ON CONFLICT(key) DO UPDATE SET type=excluded.type,val=excluded.val\", (stmt) => {\r\n let valType = (value === undefined || value === null) ? \"null\" : typeof value;\r\n if (valType === \"object\" && (value instanceof Uint8Array))\r\n valType = \"Uint8Array\";\r\n\r\n switch (valType) {\r\n case \"null\":\r\n case \"number\":\r\n case \"string\":\r\n case \"boolean\":\r\n case \"Uint8Array\":\r\n break;\r\n default:\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, `Unsupported type ${valType} for value for key='${key}`);\r\n }\r\n\r\n stmt.bindValue(1, key);\r\n stmt.bindValue(2, valType);\r\n stmt.bindValue(3, value);\r\n return stmt.step();\r\n });\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"SQLite error\");\r\n\r\n this._ecdb.saveChanges();\r\n }\r\n\r\n /** Get the value for a key from this Storage. If key is not present or is null, return undefined. */\r\n public getData(key: string): StorageValue {\r\n return this._ecdb.withPreparedSqliteStatement(\"SELECT type,val FROM app_setting WHERE key=?\", (stmt) => {\r\n stmt.bindValue(1, key);\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\r\n return undefined;\r\n const valType = stmt.getValueString(0);\r\n switch (valType) {\r\n case \"number\":\r\n return stmt.getValueDouble(1);\r\n case \"string\":\r\n return stmt.getValueString(1);\r\n case \"boolean\":\r\n return Boolean(stmt.getValueInteger(1));\r\n case \"Uint8Array\":\r\n return stmt.getValueBlob(1);\r\n case \"null\":\r\n return undefined;\r\n }\r\n throw new IModelError(DbResult.BE_SQLITE_ERROR, `Unsupported type in cache ${valType}`);\r\n });\r\n }\r\n\r\n /** return the type of the value for a key, or undefined if not present. */\r\n public getValueType(key: string): \"number\" | \"string\" | \"boolean\" | \"Uint8Array\" | \"null\" | undefined {\r\n return this._ecdb.withSqliteStatement(\"SELECT type FROM app_setting WHERE key=?\", (stmt) => {\r\n stmt.bindValue(1, key);\r\n return stmt.step() === DbResult.BE_SQLITE_ROW ? stmt.getValueString(0) as any : undefined;\r\n });\r\n }\r\n\r\n /** return `true` if the key is present, but has a null value. */\r\n public hasNullValue(key: string): boolean {\r\n return this.getValueType(key) === \"null\";\r\n }\r\n\r\n /** Get the value for a key as a string. If it is not present, or not of type string, return undefined */\r\n public getString(key: string): string | undefined {\r\n const val = this.getData(key);\r\n return typeof val === \"string\" ? val : undefined;\r\n }\r\n\r\n /** Get the value for a key as a number. If it is not present, or not of type number, return undefined */\r\n public getNumber(key: string): number | undefined {\r\n const val = this.getData(key);\r\n return typeof val === \"number\" ? val : undefined;\r\n }\r\n\r\n /** Get the value for a key as a boolean. If it is not present, or not of type boolean, return undefined */\r\n public getBoolean(key: string): boolean | undefined {\r\n const val = this.getData(key);\r\n return typeof val === \"boolean\" ? val : undefined;\r\n }\r\n\r\n /** Get the value for a key as a Uint8Array. If it is not present, or not of type Uint8Array, return undefined */\r\n public getUint8Array(key: string): Uint8Array | undefined {\r\n const val = this.getData(key);\r\n return val instanceof Uint8Array ? val : undefined;\r\n }\r\n\r\n /** Get all key names in this Storage */\r\n public getKeys(): string[] {\r\n const keys = new Array<string>();\r\n this._ecdb.withPreparedSqliteStatement(\"SELECT key FROM app_setting\", (stmt) => {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n keys.push(stmt.getValueString(0));\r\n }\r\n });\r\n return keys;\r\n }\r\n\r\n /** Remove a key/value pair from this Storage */\r\n public removeData(key: string) {\r\n const rc = this._ecdb.withPreparedSqliteStatement(\"DELETE FROM app_setting WHERE key=?\", (stmt) => {\r\n stmt.bindValue(1, key);\r\n return stmt.step();\r\n });\r\n if (rc !== DbResult.BE_SQLITE_DONE) {\r\n throw new IModelError(rc, \"SQLite error\");\r\n }\r\n }\r\n\r\n /** Remove all key/value pairs */\r\n public removeAll() {\r\n const rc = this._ecdb.withPreparedSqliteStatement(\"DELETE FROM app_setting\", (stmt) => {\r\n return stmt.step();\r\n });\r\n if (rc !== DbResult.BE_SQLITE_DONE) {\r\n throw new IModelError(rc, \"SQLite error\");\r\n }\r\n }\r\n\r\n /** Close this Storage. */\r\n public close(deleteFile: boolean = false) {\r\n const storageFile = join(NativeHost.appSettingsCacheDir, this.id);\r\n this._ecdb.saveChanges();\r\n this._ecdb.closeDb();\r\n (this._ecdb as any) = undefined;\r\n if (deleteFile)\r\n IModelJsFs.removeSync(storageFile);\r\n NativeAppStorage._storages.delete(this.id);\r\n }\r\n\r\n private static init(ecdb: ECDb): DbResult {\r\n return ecdb.withPreparedSqliteStatement(\"CREATE TABLE app_setting(key PRIMARY KEY,type,val);\", (stmt) => {\r\n return stmt.step();\r\n });\r\n }\r\n\r\n /** find and open storage by its name. */\r\n public static find(name: string): NativeAppStorage {\r\n const storage = this._storages.get(name);\r\n if (undefined === storage)\r\n throw new IModelError(IModelStatus.FileNotFound, `Storage ${name} not open`);\r\n return storage;\r\n }\r\n\r\n /** Close all opened Storages.\r\n * @internal\r\n */\r\n public static closeAll() {\r\n this._storages.forEach((value) => value.close());\r\n this._storages.clear();\r\n }\r\n\r\n /** @internal */\r\n public static getStorageNames(): string[] {\r\n return IModelJsFs.readdirSync(NativeHost.appSettingsCacheDir).filter((name) => name.endsWith(this._ext));\r\n }\r\n\r\n /** Open or find a Storage by name. */\r\n public static open(name: string): NativeAppStorage {\r\n if (!this._init) {\r\n IModelHost.onBeforeShutdown.addOnce(() => this.closeAll());\r\n this._init = true;\r\n }\r\n const fileName = name + this._ext;\r\n if (!IModelJsFs.existsSync(NativeHost.appSettingsCacheDir))\r\n IModelJsFs.recursiveMkDirSync(NativeHost.appSettingsCacheDir);\r\n\r\n const storageFile = join(NativeHost.appSettingsCacheDir, fileName);\r\n try {\r\n return this.find(fileName); // see if it's already open\r\n } catch (err) {\r\n const ecdb = new ECDb();\r\n if (IModelJsFs.existsSync(storageFile)) {\r\n ecdb.openDb(storageFile, ECDbOpenMode.ReadWrite);\r\n } else {\r\n ecdb.createDb(storageFile);\r\n const rc = this.init(ecdb);\r\n if (rc !== DbResult.BE_SQLITE_DONE)\r\n throw new IModelError(rc, \"SQLite error\");\r\n ecdb.saveChanges();\r\n }\r\n const storage = new NativeAppStorage(ecdb, fileName);\r\n this._storages.set(fileName, storage);\r\n return storage;\r\n }\r\n }\r\n}\r\n"]}
|
package/lib/cjs/NativeHost.d.ts
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
/** @packageDocumentation
|
|
2
|
-
* @module NativeApp
|
|
3
|
-
*/
|
|
4
|
-
import { BeEvent } from "@itwin/core-bentley";
|
|
5
|
-
import { InternetConnectivityStatus, NativeAppNotifications, OverriddenBy } from "@itwin/core-common";
|
|
6
|
-
import { IpcHostOpts } from "./IpcHost";
|
|
7
|
-
import { NativeAppStorage } from "./NativeAppStorage";
|
|
8
|
-
/** Options for [[NativeHost.startup]]
|
|
9
|
-
* @public
|
|
10
|
-
*/
|
|
11
|
-
export interface NativeHostOpts extends IpcHostOpts {
|
|
12
|
-
nativeHost?: {
|
|
13
|
-
/** Application name. Used, for example, to name the settings file. If not supplied, defaults to "iTwinApp". */
|
|
14
|
-
applicationName?: string;
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Backend for desktop/mobile native applications
|
|
19
|
-
* @public
|
|
20
|
-
*/
|
|
21
|
-
export declare class NativeHost {
|
|
22
|
-
private static _reachability?;
|
|
23
|
-
private static _applicationName;
|
|
24
|
-
private constructor();
|
|
25
|
-
/** Event called when the internet connectivity changes, if known. */
|
|
26
|
-
static readonly onInternetConnectivityChanged: BeEvent<(status: InternetConnectivityStatus) => void>;
|
|
27
|
-
private static _appSettingsCacheDir?;
|
|
28
|
-
/** Get the local cache folder for application settings */
|
|
29
|
-
static get appSettingsCacheDir(): string;
|
|
30
|
-
/** Send a notification to the NativeApp connected to this NativeHost. */
|
|
31
|
-
static notifyNativeFrontend<T extends keyof NativeAppNotifications>(methodName: T, ...args: Parameters<NativeAppNotifications[T]>): void;
|
|
32
|
-
private static _isValid;
|
|
33
|
-
static get isValid(): boolean;
|
|
34
|
-
static get applicationName(): string;
|
|
35
|
-
/** Get the settings store for this NativeHost. */
|
|
36
|
-
static get settingsStore(): NativeAppStorage;
|
|
37
|
-
/**
|
|
38
|
-
* Start the backend of a native app.
|
|
39
|
-
* @note this method calls [[IpcHost.startup]] internally.
|
|
40
|
-
*/
|
|
41
|
-
static startup(opt?: NativeHostOpts): Promise<void>;
|
|
42
|
-
/** Shutdown native app backend. Also calls [[IpcHost.shutdown]] */
|
|
43
|
-
static shutdown(): Promise<void>;
|
|
44
|
-
/** get current value of internet connectivity */
|
|
45
|
-
static checkInternetConnectivity(): InternetConnectivityStatus;
|
|
46
|
-
/**
|
|
47
|
-
* Override internet connectivity state
|
|
48
|
-
* @param _overridenBy who overrode the value.
|
|
49
|
-
* @internal
|
|
50
|
-
*/
|
|
51
|
-
static overrideInternetConnectivity(_overridenBy: OverriddenBy, status: InternetConnectivityStatus): void;
|
|
52
|
-
}
|
|
1
|
+
/** @packageDocumentation
|
|
2
|
+
* @module NativeApp
|
|
3
|
+
*/
|
|
4
|
+
import { BeEvent } from "@itwin/core-bentley";
|
|
5
|
+
import { InternetConnectivityStatus, NativeAppNotifications, OverriddenBy } from "@itwin/core-common";
|
|
6
|
+
import { IpcHostOpts } from "./IpcHost";
|
|
7
|
+
import { NativeAppStorage } from "./NativeAppStorage";
|
|
8
|
+
/** Options for [[NativeHost.startup]]
|
|
9
|
+
* @public
|
|
10
|
+
*/
|
|
11
|
+
export interface NativeHostOpts extends IpcHostOpts {
|
|
12
|
+
nativeHost?: {
|
|
13
|
+
/** Application name. Used, for example, to name the settings file. If not supplied, defaults to "iTwinApp". */
|
|
14
|
+
applicationName?: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Backend for desktop/mobile native applications
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export declare class NativeHost {
|
|
22
|
+
private static _reachability?;
|
|
23
|
+
private static _applicationName;
|
|
24
|
+
private constructor();
|
|
25
|
+
/** Event called when the internet connectivity changes, if known. */
|
|
26
|
+
static readonly onInternetConnectivityChanged: BeEvent<(status: InternetConnectivityStatus) => void>;
|
|
27
|
+
private static _appSettingsCacheDir?;
|
|
28
|
+
/** Get the local cache folder for application settings */
|
|
29
|
+
static get appSettingsCacheDir(): string;
|
|
30
|
+
/** Send a notification to the NativeApp connected to this NativeHost. */
|
|
31
|
+
static notifyNativeFrontend<T extends keyof NativeAppNotifications>(methodName: T, ...args: Parameters<NativeAppNotifications[T]>): void;
|
|
32
|
+
private static _isValid;
|
|
33
|
+
static get isValid(): boolean;
|
|
34
|
+
static get applicationName(): string;
|
|
35
|
+
/** Get the settings store for this NativeHost. */
|
|
36
|
+
static get settingsStore(): NativeAppStorage;
|
|
37
|
+
/**
|
|
38
|
+
* Start the backend of a native app.
|
|
39
|
+
* @note this method calls [[IpcHost.startup]] internally.
|
|
40
|
+
*/
|
|
41
|
+
static startup(opt?: NativeHostOpts): Promise<void>;
|
|
42
|
+
/** Shutdown native app backend. Also calls [[IpcHost.shutdown]] */
|
|
43
|
+
static shutdown(): Promise<void>;
|
|
44
|
+
/** get current value of internet connectivity */
|
|
45
|
+
static checkInternetConnectivity(): InternetConnectivityStatus;
|
|
46
|
+
/**
|
|
47
|
+
* Override internet connectivity state
|
|
48
|
+
* @param _overridenBy who overrode the value.
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
51
|
+
static overrideInternetConnectivity(_overridenBy: OverriddenBy, status: InternetConnectivityStatus): void;
|
|
52
|
+
}
|
|
53
53
|
//# sourceMappingURL=NativeHost.d.ts.map
|