@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
114 lines • 16.6 kB
JavaScript
import { __decorate, __param } from "tslib";
import { Inject } from "@angular/core";
import { Capacitor } from "@capacitor/core";
import { Device } from "@capacitor/device";
import { CapacitorSQLite, SQLiteConnection, } from "@capacitor-community/sqlite";
import { random, SqlApiABC } from "./sql-api-abc";
import { assert, dateStr } from "../UtilMisc";
export let CapSqlApi = class CapSqlApi extends SqlApiABC {
_CapacitorSQLite = null;
_sqliteConnection = null;
constructor(dbName, dbSchema) {
super(dbName, dbSchema);
}
get capDbConn() {
return this.db;
}
set capDbConn(val) {
this.db = val;
}
async isOpen() {
return this.db != null;
}
async close() {
await this._sqliteConnection.closeAllConnections();
this.db = null;
this._CapacitorSQLite = null;
}
async _openDb() {
if (await this.isOpen()) {
return;
}
// Wait for the platform to initialise
const info = await Device.getInfo();
// Get the plugin
console.log(`${dateStr()} *** platform ${info.platform}`);
this._CapacitorSQLite = CapacitorSQLite;
if (Capacitor.getPlatform() === "android") {
try {
await this._CapacitorSQLite.requestPermissions();
}
catch (e) {
throw new Error("This app can't work without Database access.");
}
}
this._sqliteConnection = new SQLiteConnection(this._CapacitorSQLite);
this.capDbConn = await this._sqliteConnection.createConnection(this.dbName, false, "no-encryption", 1, false);
await this.capDbConn.open();
await this.installSchema();
}
async transaction(executeData, isQuery) {
if (!(await this.isOpen()))
await this.open();
let retries = 5;
while (true) {
try {
return await this._transactionInner(executeData, isQuery);
}
catch (e) {
if (retries >= 0
/* &&
(CapSqlApi.checkRetryMessage(e) ||
CapSqlApi.isLockedMsg(e)) */
) {
retries--;
await new Promise((r) => setTimeout(() => r(), 100 + random()));
continue;
}
throw new Error(e);
}
}
}
async _transactionInner(executeData, isQuery) {
if (isQuery)
return await this._transactionInnerQuery(executeData);
await this._transactionInnerExecute(executeData);
}
async _transactionInnerQuery(executeData) {
assert(executeData.length === 1, "We expect executeData.length === 1 for a query");
const data = (await this.capDbConn.query(executeData[0].sql, executeData[0].bindParams))?.values;
return data?.length ? data : null;
}
async _transactionInnerExecute(executeData) {
const capData = [];
const sqlOnlyList = [];
for (const data of executeData) {
if (!data.bindParams?.length /* null or 0 */) {
sqlOnlyList.push(data.sql);
}
else {
capData.push({
statement: data.sql,
values: data.bindParams,
});
}
}
for (const sql of sqlOnlyList) {
// Just execute it, usually if we want a transaction we're
// only inserting lots of data.
const result = await this.capDbConn.run(sql);
if (result.changes.changes === -1)
throw new Error("An error occurred in the SQL");
}
if (capData.length) {
const result = await this.capDbConn.executeSet(capData);
if (result.changes.changes === -1)
throw new Error("An error occurred in the SQL");
}
}
};
CapSqlApi = __decorate([
__param(0, Inject("")),
__param(1, Inject([]))
], CapSqlApi);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwLXNxbC1hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdm9ydGV4L3N0b3JhZ2UtYXBpL2NhcC1zcWwtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFM0MsT0FBTyxFQUNILGVBQWUsRUFFZixnQkFBZ0IsR0FDbkIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHdkMsV0FBTSxTQUFTLEdBQWYsTUFBTSxTQUFVLFNBQVEsU0FBUztJQUM1QixnQkFBZ0IsR0FBZSxJQUFJLENBQUM7SUFDcEMsaUJBQWlCLEdBQTRCLElBQUksQ0FBQztJQUUxRCxZQUF3QixNQUFjLEVBQWMsUUFBa0I7UUFDbEUsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBWSxTQUFTO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBWSxTQUFTLENBQUMsR0FBdUI7UUFDekMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDUCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxFQUFFLEdB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S1ksU0FBUztJQUlMLFdBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQWtCLFdBQUEsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0dBSjFDLFNBQVMsQ0FxS3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENhcGFjaXRvciB9IGZyb20gXCJAY2FwYWNpdG9yL2NvcmVcIjtcbmltcG9ydCB7IERldmljZSB9IGZyb20gXCJAY2FwYWNpdG9yL2RldmljZVwiO1xuXG5pbXBvcnQge1xuICAgIENhcGFjaXRvclNRTGl0ZSxcbiAgICBjYXBTUUxpdGVTZXQsXG4gICAgU1FMaXRlQ29ubmVjdGlvbixcbn0gZnJvbSBcIkBjYXBhY2l0b3ItY29tbXVuaXR5L3NxbGl0ZVwiO1xuaW1wb3J0IHsgcmFuZG9tLCBTcWxBcGlBQkMsIFNxbEV4ZWN1dGVEYXRhIH0gZnJvbSBcIi4vc3FsLWFwaS1hYmNcIjtcbmltcG9ydCB7IGFzc2VydCwgZGF0ZVN0ciB9IGZyb20gXCIuLi9VdGlsTWlzY1wiO1xuaW1wb3J0IHsgU1FMaXRlREJDb25uZWN0aW9uIH0gZnJvbSBcIkBjYXBhY2l0b3ItY29tbXVuaXR5L3NxbGl0ZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2FwU3FsQXBpIGV4dGVuZHMgU3FsQXBpQUJDIHtcbiAgICBwcml2YXRlIF9DYXBhY2l0b3JTUUxpdGU6IGFueSB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX3NxbGl0ZUNvbm5lY3Rpb246IFNRTGl0ZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoXCJcIikgZGJOYW1lOiBzdHJpbmcsIEBJbmplY3QoW10pIGRiU2NoZW1hOiBzdHJpbmdbXSkge1xuICAgICAgICBzdXBlcihkYk5hbWUsIGRiU2NoZW1hKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBjYXBEYkNvbm4oKTogU1FMaXRlREJDb25uZWN0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXQgY2FwRGJDb25uKHZhbDogU1FMaXRlREJDb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuZGIgPSB2YWw7XG4gICAgfVxuXG4gICAgYXN5bmMgaXNPcGVuKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYiAhPSBudWxsO1xuICAgIH1cblxuICAgIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9zcWxpdGVDb25uZWN0aW9uLmNsb3NlQWxsQ29ubmVjdGlvbnMoKTtcbiAgICAgICAgdGhpcy5kYiA9IG51bGw7XG4gICAgICAgIHRoaXMuX0NhcGFjaXRvclNRTGl0ZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIF9vcGVuRGIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChhd2FpdCB0aGlzLmlzT3BlbigpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgcGxhdGZvcm0gdG8gaW5pdGlhbGlzZVxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgRGV2aWNlLmdldEluZm8oKTtcblxuICAgICAgICAvLyBHZXQgdGhlIHBsdWdpblxuICAgICAgICBjb25zb2xlLmxvZyhgJHtkYXRlU3RyKCl9ICoqKiBwbGF0Zm9ybSAke2luZm8ucGxhdGZvcm19YCk7XG4gICAgICAgIHRoaXMuX0NhcGFjaXRvclNRTGl0ZSA9IENhcGFjaXRvclNRTGl0ZTtcblxuICAgICAgICBpZiAoQ2FwYWNpdG9yLmdldFBsYXRmb3JtKCkgPT09IFwiYW5kcm9pZFwiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX0NhcGFjaXRvclNRTGl0ZS5yZXF1ZXN0UGVybWlzc2lvbnMoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGFwcCBjYW4ndCB3b3JrIHdpdGhvdXQgRGF0YWJhc2UgYWNjZXNzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3NxbGl0ZUNvbm5lY3Rpb24gPSBuZXcgU1FMaXRlQ29ubmVjdGlvbih0aGlzLl9DYXBhY2l0b3JTUUxpdGUpO1xuICAgICAgICB0aGlzLmNhcERiQ29ubiA9IGF3YWl0IHRoaXMuX3NxbGl0ZUNvbm5lY3Rpb24uY3JlYXRlQ29ubmVjdGlvbihcbiAgICAgICAgICAgIHRoaXMuZGJOYW1lLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBcIm5vLWVuY3J5cHRpb25cIixcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLmNhcERiQ29ubi5vcGVuKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5zdGFsbFNjaGVtYSgpO1xuICAgIH1cblxuICAgIGFzeW5jIHRyYW5zYWN0aW9uKFxuICAgICAgICBleGVjdXRlRGF0YTogU3FsRXhlY3V0ZURhdGFbXSxcbiAgICAgICAgaXNRdWVyeTogYm9vbGVhblxuICAgICk6IFByb21pc2U8YW55W10gfCBudWxsPiB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuaXNPcGVuKCkpKSBhd2FpdCB0aGlzLm9wZW4oKTtcblxuICAgICAgICBsZXQgcmV0cmllcyA9IDU7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl90cmFuc2FjdGlvbklubmVyKGV4ZWN1dGVEYXRhLCBpc1F1ZXJ5KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJldHJpZXMgPj0gMFxuICAgICAgICAgICAgICAgICAgICAvKiAmJlxuICAgICAgICAgICAgICAgICAgICAgKENhcFNxbEFwaS5jaGVja1JldHJ5TWVzc2FnZShlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgQ2FwU3FsQXBpLmlzTG9ja2VkTXNnKGUpKSAqL1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXRyaWVzLS07XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiByKCksIDEwMCArIHJhbmRvbSgpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF90cmFuc2FjdGlvbklubmVyKFxuICAgICAgICBleGVjdXRlRGF0YTogU3FsRXhlY3V0ZURhdGFbXSxcbiAgICAgICAgaXNRdWVyeTogYm9vbGVhblxuICAgICk6IFByb21pc2U8YW55W10gfCBudWxsPiB7XG4gICAgICAgIGlmIChpc1F1ZXJ5KSByZXR1cm4gYXdhaXQgdGhpcy5fdHJhbnNhY3Rpb25Jbm5lclF1ZXJ5KGV4ZWN1dGVEYXRhKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl90cmFuc2FjdGlvbklubmVyRXhlY3V0ZShleGVjdXRlRGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfdHJhbnNhY3Rpb25Jbm5lclF1ZXJ5KFxuICAgICAgICBleGVjdXRlRGF0YTogU3FsRXhlY3V0ZURhdGFbXVxuICAgICk6IFByb21pc2U8YW55W10gfCBudWxsPiB7XG4gICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIGV4ZWN1dGVEYXRhLmxlbmd0aCA9PT0gMSxcbiAgICAgICAgICAgIFwiV2UgZXhwZWN0IGV4ZWN1dGVEYXRhLmxlbmd0aCA9PT0gMSBmb3IgYSBxdWVyeVwiXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IChcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY2FwRGJDb25uLnF1ZXJ5KFxuICAgICAgICAgICAgICAgIGV4ZWN1dGVEYXRhWzBdLnNxbCxcbiAgICAgICAgICAgICAgICBleGVjdXRlRGF0YVswXS5iaW5kUGFyYW1zXG4gICAgICAgICAgICApXG4gICAgICAgICk/LnZhbHVlcztcblxuICAgICAgICByZXR1cm4gZGF0YT8ubGVuZ3RoID8gZGF0YSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfdHJhbnNhY3Rpb25Jbm5lckV4ZWN1dGUoXG4gICAgICAgIGV4ZWN1dGVEYXRhOiBTcWxFeGVjdXRlRGF0YVtdXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNhcERhdGE6IEFycmF5PGNhcFNRTGl0ZVNldD4gPSBbXTtcbiAgICAgICAgY29uc3Qgc3FsT25seUxpc3Q6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZGF0YSBvZiBleGVjdXRlRGF0YSkge1xuICAgICAgICAgICAgaWYgKCFkYXRhLmJpbmRQYXJhbXM/Lmxlbmd0aCAvKiBudWxsIG9yIDAgKi8pIHtcbiAgICAgICAgICAgICAgICBzcWxPbmx5TGlzdC5wdXNoKGRhdGEuc3FsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FwRGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50OiBkYXRhLnNxbCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBkYXRhLmJpbmRQYXJhbXMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHNxbCBvZiBzcWxPbmx5TGlzdCkge1xuICAgICAgICAgICAgLy8gSnVzdCBleGVjdXRlIGl0LCB1c3VhbGx5IGlmIHdlIHdhbnQgYSB0cmFuc2FjdGlvbiB3ZSdyZVxuICAgICAgICAgICAgLy8gb25seSBpbnNlcnRpbmcgbG90cyBvZiBkYXRhLlxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYXBEYkNvbm4ucnVuKHNxbCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmNoYW5nZXMuY2hhbmdlcyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW4gdGhlIFNRTFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYXBEYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYXBEYkNvbm4uZXhlY3V0ZVNldChjYXBEYXRhKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY2hhbmdlcy5jaGFuZ2VzID09PSAtMSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbiBlcnJvciBvY2N1cnJlZCBpbiB0aGUgU1FMXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgY2hlY2tSZXRyeU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gICAgIGlmIChtZXNzYWdlLmluZGV4T2YoUkVUUllfTk9fU1BBQ0UpICE9PSAtMSkgcmV0dXJuIHRydWU7XG4gICAgLy9cbiAgICAvLyAgICAgcmV0dXJuIG1lc3NhZ2UuaW5kZXhPZihSRVRSWV9ESVNLX0VSUk9SKSAhPT0gLTE7XG4gICAgLy8gfVxuICAgIC8vXG4gICAgLy8gcHJpdmF0ZSBzdGF0aWMgaXNMb2NrZWRNc2coZXJyOiBhbnkpOiBib29sZWFuIHtcbiAgICAvLyAgICAgY29uc3QgbXNnID0gZXJyLnRvU3RyaW5nKCk7XG4gICAgLy9cbiAgICAvLyAgICAgY29uc3QgaGFzTnNTcWxFcnJvciA9XG4gICAgLy8gICAgICAgICBtc2cuaW5kZXhPZihcIlNRTElURS5BTEwgLSBEYXRhYmFzZSBFcnJvcjVcIikgIT09IC0xO1xuICAgIC8vXG4gICAgLy8gICAgIC8vIHVuYWJsZSB0byBiZWdpbiB0cmFuc2FjdGlvbiAoNSBkYXRhYmFzZSBpcyBsb2NrZWQpXG4gICAgLy8gICAgIGNvbnN0IGhhc0NhcFNxbEVycm9yID0gbXNnLmluZGV4T2YoXCI1IGRhdGFiYXNlIGlzIGxvY2tlZFwiKSAhPT0gLTE7XG4gICAgLy9cbiAgICAvLyAgICAgaWYgKGhhc05zU3FsRXJyb3IgfHwgaGFzQ2FwU3FsRXJyb3IpIHJldHVybiB0cnVlO1xuICAgIC8vXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKGBXZWJTUUw6IEZvdW5kIGVycm9yIG1lc3NhZ2UgdGhhdCBpc24ndCBhIGxvY2sgOiAke21zZ31gKTtcbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIH1cbn1cbiJdfQ==