@mgarlik/datastore 0.1.0 → 0.1.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/README.md CHANGED
@@ -5,7 +5,7 @@ Standalone DataStore package extracted from `src/dataStore` with its original be
5
5
  - React DataStore provider and hooks
6
6
  - REST synchronization helpers
7
7
  - Socket message handling
8
- - SQLite persistence helpers
8
+ - Pluggable persistence storage
9
9
 
10
10
  ## Install
11
11
 
@@ -13,6 +13,12 @@ Standalone DataStore package extracted from `src/dataStore` with its original be
13
13
  npm install @mgarlik/datastore
14
14
  ```
15
15
 
16
+ Optional Expo SQLite adapter:
17
+
18
+ ```bash
19
+ npm install expo-sqlite
20
+ ```
21
+
16
22
  ## Build
17
23
 
18
24
  ```bash
@@ -27,3 +33,24 @@ npm run build
27
33
  - `useDocument`
28
34
  - `useProviderActions`
29
35
  - package types
36
+
37
+ ## Persistence
38
+
39
+ The main package no longer depends on `expo-sqlite` directly. To enable local persistence, pass a storage adapter to `DataStoreProvider`.
40
+
41
+ Expo example:
42
+
43
+ ```ts
44
+ import { DataStoreProvider } from "@mgarlik/datastore";
45
+ import { createExpoSQLiteStorage } from "@mgarlik/datastore/expo-sqlite";
46
+
47
+ const storage = createExpoSQLiteStorage("modelaz.db");
48
+ ```
49
+
50
+ Then:
51
+
52
+ ```tsx
53
+ <DataStoreProvider storage={storage} usePersistentStorage>
54
+ {/* app */}
55
+ </DataStoreProvider>
56
+ ```
@@ -0,0 +1,14 @@
1
+ // src/log.ts
2
+ function systemLog(..._args) {
3
+ }
4
+ function systemLogError(...args) {
5
+ if (typeof console !== "undefined" && typeof console.error === "function") {
6
+ console.error(...args);
7
+ }
8
+ }
9
+
10
+ export {
11
+ systemLog,
12
+ systemLogError
13
+ };
14
+ //# sourceMappingURL=chunk-7XDRKNJQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/log.ts"],"sourcesContent":["export function systemLog(..._args: unknown[]): void {\n // No-op by default in the package. Consumers can wrap these calls if needed.\n}\n\nexport function systemLogError(...args: unknown[]): void {\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\n console.error(...args);\n }\n}\n"],"mappings":";AAAO,SAAS,aAAa,OAAwB;AAErD;AAEO,SAAS,kBAAkB,MAAuB;AACrD,MAAI,OAAO,YAAY,eAAe,OAAO,QAAQ,UAAU,YAAY;AACvE,YAAQ,MAAM,GAAG,IAAI;AAAA,EACzB;AACJ;","names":[]}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/expo-sqlite.ts
31
+ var expo_sqlite_exports = {};
32
+ __export(expo_sqlite_exports, {
33
+ ExpoSQLiteStorage: () => SQLite,
34
+ createExpoSQLiteStorage: () => createExpoSQLiteStorage
35
+ });
36
+ module.exports = __toCommonJS(expo_sqlite_exports);
37
+
38
+ // src/database.ts
39
+ var SQL = __toESM(require("expo-sqlite"), 1);
40
+
41
+ // src/log.ts
42
+ function systemLog(..._args) {
43
+ }
44
+ function systemLogError(...args) {
45
+ if (typeof console !== "undefined" && typeof console.error === "function") {
46
+ console.error(...args);
47
+ }
48
+ }
49
+
50
+ // src/database.ts
51
+ var SQLite = class {
52
+ constructor(name) {
53
+ this.db = null;
54
+ this.dbName = name || "modelaz.db";
55
+ this.initDB();
56
+ }
57
+ async initDB() {
58
+ if (!this.db) {
59
+ try {
60
+ systemLog("sql", "[initDB]");
61
+ this.db = await SQL.openDatabaseAsync(this.dbName);
62
+ await this.createTables({
63
+ documents: "id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT"
64
+ // logs: "time TEXT PRIMARY KEY, module TEXT, message TEXT",
65
+ });
66
+ } catch (e) {
67
+ console.log("INITDB ERROR", e);
68
+ throw e;
69
+ }
70
+ }
71
+ }
72
+ async getDb() {
73
+ if (!this.db) {
74
+ await this.initDB();
75
+ }
76
+ if (!this.db) {
77
+ throw new Error("Database is not initialized");
78
+ }
79
+ return this.db;
80
+ }
81
+ async createTable(table, tableSchema) {
82
+ try {
83
+ systemLog("sql", "[createTable]", table);
84
+ const db = await this.getDb();
85
+ const result = await db.runAsync(`CREATE TABLE IF NOT EXISTS '${table}' (${tableSchema})`);
86
+ systemLog("sql", "[createTable] result: ", JSON.stringify(result));
87
+ return result;
88
+ } catch (e) {
89
+ systemLogError("sql", "[createTable]", e);
90
+ throw e;
91
+ }
92
+ }
93
+ async createTables(tables) {
94
+ try {
95
+ systemLog("sql", "[createTables]", tables);
96
+ const query = Object.entries(tables).reduce((acc, [table, schema]) => {
97
+ return acc + `CREATE TABLE IF NOT EXISTS '${table}' (${schema});`;
98
+ }, "");
99
+ const db = await this.getDb();
100
+ const result = await db.runAsync(query);
101
+ systemLog("sql", "[createTables] result: ", JSON.stringify(result));
102
+ return result;
103
+ } catch (e) {
104
+ systemLogError("sql", "[createTable]", e);
105
+ throw e;
106
+ }
107
+ }
108
+ /**
109
+ * Smazani starych logu
110
+ */
111
+ async deleteLogs() {
112
+ systemLog("sql", "[query] delete old Logs", this.db);
113
+ try {
114
+ const db = await this.getDb();
115
+ await db.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);
116
+ } catch (error) {
117
+ throw error;
118
+ }
119
+ }
120
+ async read(query, args) {
121
+ try {
122
+ systemLog("sql", "[read]", query);
123
+ const db = await this.getDb();
124
+ const result = args === void 0 ? await db.getAllAsync(query) : await db.getAllAsync(query, args);
125
+ systemLog("sql", "[read] result ", result.length);
126
+ return result;
127
+ } catch (e) {
128
+ systemLogError("sql", "[read]", e);
129
+ throw e;
130
+ }
131
+ }
132
+ async query(query, args) {
133
+ try {
134
+ systemLog("sql", "[query]->", query);
135
+ const db = await this.getDb();
136
+ const result = args === void 0 ? await db.getAllAsync(query) : await db.getAllAsync(query, args);
137
+ systemLog("sql", result);
138
+ return result;
139
+ } catch (error) {
140
+ console.error("INSERT ERROR", error);
141
+ systemLogError("sql", error);
142
+ throw error;
143
+ }
144
+ }
145
+ async dropTable(table) {
146
+ try {
147
+ systemLog("sql", "dropTable", table);
148
+ console.time("[SQL] dropTable");
149
+ const db = await this.getDb();
150
+ const result = await db.runAsync(`DROP TABLE ${table}`);
151
+ console.timeEnd("[SQL] dropTable");
152
+ return result;
153
+ } catch (error) {
154
+ throw error;
155
+ }
156
+ }
157
+ async emptyTable(table) {
158
+ try {
159
+ systemLog("sql", `[emptyTable]`, table);
160
+ const db = await this.getDb();
161
+ const result = await db.runAsync(`DELETE FROM '${table}'`);
162
+ systemLog("sql", "[emptyTable] result", result);
163
+ return result;
164
+ } catch (error) {
165
+ throw error;
166
+ }
167
+ }
168
+ async getTables() {
169
+ systemLog("sql", "Jdu zkusit nacist tabulky z ", JSON.stringify(this.dbName));
170
+ try {
171
+ const db = await this.getDb();
172
+ const result = await db.getAllAsync('SELECT name FROM sqlite_master WHERE type="table"');
173
+ systemLog("sql", "DB Result:", result);
174
+ return result;
175
+ } catch (error) {
176
+ throw error;
177
+ }
178
+ }
179
+ async resetDatabase() {
180
+ try {
181
+ systemLog("sql", "Reset database", this.dbName);
182
+ console.time("DELETING");
183
+ systemLog("sql", "Closing");
184
+ const db = await this.getDb();
185
+ await db.closeAsync();
186
+ systemLog("sql", "Deleting");
187
+ await SQL.deleteDatabaseAsync(this.dbName);
188
+ console.timeEnd("DELETING");
189
+ console.time("INIT");
190
+ this.db = null;
191
+ systemLog("sql", "Zacinam inicializovat databazi databaze");
192
+ await this.initDB();
193
+ systemLog("sql", "Inicializovana databaze");
194
+ console.timeEnd("INIT");
195
+ } catch (e) {
196
+ systemLogError("sql", "[resetDatabase]", e);
197
+ }
198
+ }
199
+ };
200
+
201
+ // src/expo-sqlite.ts
202
+ function createExpoSQLiteStorage(name) {
203
+ return new SQLite(name);
204
+ }
205
+ // Annotate the CommonJS export names for ESM import in node:
206
+ 0 && (module.exports = {
207
+ ExpoSQLiteStorage,
208
+ createExpoSQLiteStorage
209
+ });
210
+ //# sourceMappingURL=expo-sqlite.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/expo-sqlite.ts","../src/database.ts","../src/log.ts"],"sourcesContent":["export { SQLite as ExpoSQLiteStorage } from \"./database\";\n\nimport { SQLite } from \"./database\";\n\n/**\n * Vytvoří výchozí Expo SQLite adapter pro DataStoreProvider.\n *\n * @param name Volitelný název SQLite databázového souboru.\n */\nexport function createExpoSQLiteStorage(name?: string) {\n return new SQLite(name);\n}","import * as SQL from \"expo-sqlite\";\nimport { systemLog, systemLogError } from \"./log\";\nimport type { DataStoreStorage } from \"./storage\";\n\nexport class SQLite implements DataStoreStorage {\n dbName: string;\n private db: SQL.SQLiteDatabase | null = null;\n\n constructor(name?: string) {\n this.dbName = name || \"modelaz.db\";\n this.initDB();\n }\n\n private async initDB(): Promise<void> {\n if (!this.db) {\n try {\n systemLog(\"sql\", \"[initDB]\");\n this.db = await SQL.openDatabaseAsync(this.dbName);\n // await this.createTable(\"documents\", \"id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT\");\n // await this.createTable(\"logs\", \"time TEXT PRIMARY KEY, module TEXT, message TEXT\");\n await this.createTables({\n documents: \"id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT\",\n // logs: \"time TEXT PRIMARY KEY, module TEXT, message TEXT\",\n });\n // await this.createTable(\"providers\", \"id TEXT PRIMARY KEY, data TEXT, lastUpdate TEXT\");\n // await this.db?.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);\n } catch (e) {\n console.log(\"INITDB ERROR\", e);\n // systemLogError(\"sql\", \"[initDB]\", e);\n throw e;\n }\n }\n }\n\n private async getDb(): Promise<SQL.SQLiteDatabase> {\n if (!this.db) {\n await this.initDB();\n }\n\n if (!this.db) {\n throw new Error(\"Database is not initialized\");\n }\n\n return this.db;\n }\n\n private async createTable(table: string, tableSchema: string): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", \"[createTable]\", table);\n const db = await this.getDb();\n const result = await db.runAsync(`CREATE TABLE IF NOT EXISTS '${table}' (${tableSchema})`);\n systemLog(\"sql\", \"[createTable] result: \", JSON.stringify(result));\n return result;\n } catch (e) {\n systemLogError(\"sql\", \"[createTable]\", e);\n throw e;\n }\n }\n private async createTables(tables: { [key: string]: string }): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", \"[createTables]\", tables);\n const query = Object.entries(tables).reduce((acc, [table, schema]) => {\n return acc + `CREATE TABLE IF NOT EXISTS '${table}' (${schema});`;\n }, \"\");\n // console.log(\"Query: \", query);\n const db = await this.getDb();\n const result = await db.runAsync(query);\n systemLog(\"sql\", \"[createTables] result: \", JSON.stringify(result));\n return result;\n } catch (e) {\n systemLogError(\"sql\", \"[createTable]\", e);\n throw e;\n }\n }\n\n /**\n * Smazani starych logu\n */\n private async deleteLogs(): Promise<void> {\n systemLog(\"sql\", \"[query] delete old Logs\", this.db);\n try {\n const db = await this.getDb();\n await db.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);\n } catch (error) {\n throw error;\n }\n }\n\n public async read<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]> {\n try {\n // Smazani starych zaznamu z logu\n systemLog(\"sql\", \"[read]\", query);\n const db = await this.getDb();\n const result = args === undefined ? await db.getAllAsync<T>(query) : await db.getAllAsync<T>(query, args);\n systemLog(\"sql\", \"[read] result \", result.length);\n return result;\n } catch (e) {\n systemLogError(\"sql\", \"[read]\", e);\n throw e;\n }\n }\n\n public async query<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]> {\n try {\n systemLog(\"sql\", \"[query]->\", query);\n const db = await this.getDb();\n const result = args === undefined ? await db.getAllAsync<T>(query) : await db.getAllAsync<T>(query, args);\n systemLog(\"sql\", result);\n return result;\n } catch (error) {\n console.error(\"INSERT ERROR\", error);\n systemLogError(\"sql\", error);\n throw error;\n }\n }\n\n public async dropTable(table: string): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", \"dropTable\", table);\n console.time(\"[SQL] dropTable\");\n const db = await this.getDb();\n const result = await db.runAsync(`DROP TABLE ${table}`);\n console.timeEnd(\"[SQL] dropTable\");\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n public async emptyTable(table: string): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", `[emptyTable]`, table);\n const db = await this.getDb();\n const result = await db.runAsync(`DELETE FROM '${table}'`);\n systemLog(\"sql\", \"[emptyTable] result\", result);\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n public async getTables() {\n systemLog(\"sql\", \"Jdu zkusit nacist tabulky z \", JSON.stringify(this.dbName));\n try {\n const db = await this.getDb();\n const result = await db.getAllAsync('SELECT name FROM sqlite_master WHERE type=\"table\"');\n systemLog(\"sql\", \"DB Result:\", result);\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n public async resetDatabase() {\n try {\n systemLog(\"sql\", \"Reset database\", this.dbName);\n console.time(\"DELETING\");\n systemLog(\"sql\", \"Closing\");\n const db = await this.getDb();\n await db.closeAsync();\n systemLog(\"sql\", \"Deleting\");\n await SQL.deleteDatabaseAsync(this.dbName);\n console.timeEnd(\"DELETING\");\n console.time(\"INIT\");\n this.db = null;\n systemLog(\"sql\", \"Zacinam inicializovat databazi databaze\");\n await this.initDB();\n systemLog(\"sql\", \"Inicializovana databaze\");\n console.timeEnd(\"INIT\");\n } catch (e) {\n systemLogError(\"sql\", \"[resetDatabase]\", e);\n }\n }\n}\n","export function systemLog(..._args: unknown[]): void {\n // No-op by default in the package. Consumers can wrap these calls if needed.\n}\n\nexport function systemLogError(...args: unknown[]): void {\n if (typeof console !== \"undefined\" && typeof console.error === \"function\") {\n console.error(...args);\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,31 @@
1
+ import * as SQL from 'expo-sqlite';
2
+ import { D as DataStoreStorage } from './storage-D_xv8gFb.cjs';
3
+
4
+ declare class SQLite implements DataStoreStorage {
5
+ dbName: string;
6
+ private db;
7
+ constructor(name?: string);
8
+ private initDB;
9
+ private getDb;
10
+ private createTable;
11
+ private createTables;
12
+ /**
13
+ * Smazani starych logu
14
+ */
15
+ private deleteLogs;
16
+ read<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]>;
17
+ query<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]>;
18
+ dropTable(table: string): Promise<SQL.SQLiteRunResult>;
19
+ emptyTable(table: string): Promise<SQL.SQLiteRunResult>;
20
+ getTables(): Promise<unknown[]>;
21
+ resetDatabase(): Promise<void>;
22
+ }
23
+
24
+ /**
25
+ * Vytvoří výchozí Expo SQLite adapter pro DataStoreProvider.
26
+ *
27
+ * @param name Volitelný název SQLite databázového souboru.
28
+ */
29
+ declare function createExpoSQLiteStorage(name?: string): SQLite;
30
+
31
+ export { SQLite as ExpoSQLiteStorage, createExpoSQLiteStorage };
@@ -0,0 +1,31 @@
1
+ import * as SQL from 'expo-sqlite';
2
+ import { D as DataStoreStorage } from './storage-D_xv8gFb.js';
3
+
4
+ declare class SQLite implements DataStoreStorage {
5
+ dbName: string;
6
+ private db;
7
+ constructor(name?: string);
8
+ private initDB;
9
+ private getDb;
10
+ private createTable;
11
+ private createTables;
12
+ /**
13
+ * Smazani starych logu
14
+ */
15
+ private deleteLogs;
16
+ read<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]>;
17
+ query<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]>;
18
+ dropTable(table: string): Promise<SQL.SQLiteRunResult>;
19
+ emptyTable(table: string): Promise<SQL.SQLiteRunResult>;
20
+ getTables(): Promise<unknown[]>;
21
+ resetDatabase(): Promise<void>;
22
+ }
23
+
24
+ /**
25
+ * Vytvoří výchozí Expo SQLite adapter pro DataStoreProvider.
26
+ *
27
+ * @param name Volitelný název SQLite databázového souboru.
28
+ */
29
+ declare function createExpoSQLiteStorage(name?: string): SQLite;
30
+
31
+ export { SQLite as ExpoSQLiteStorage, createExpoSQLiteStorage };
@@ -0,0 +1,166 @@
1
+ import {
2
+ systemLog,
3
+ systemLogError
4
+ } from "./chunk-7XDRKNJQ.js";
5
+
6
+ // src/database.ts
7
+ import * as SQL from "expo-sqlite";
8
+ var SQLite = class {
9
+ constructor(name) {
10
+ this.db = null;
11
+ this.dbName = name || "modelaz.db";
12
+ this.initDB();
13
+ }
14
+ async initDB() {
15
+ if (!this.db) {
16
+ try {
17
+ systemLog("sql", "[initDB]");
18
+ this.db = await SQL.openDatabaseAsync(this.dbName);
19
+ await this.createTables({
20
+ documents: "id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT"
21
+ // logs: "time TEXT PRIMARY KEY, module TEXT, message TEXT",
22
+ });
23
+ } catch (e) {
24
+ console.log("INITDB ERROR", e);
25
+ throw e;
26
+ }
27
+ }
28
+ }
29
+ async getDb() {
30
+ if (!this.db) {
31
+ await this.initDB();
32
+ }
33
+ if (!this.db) {
34
+ throw new Error("Database is not initialized");
35
+ }
36
+ return this.db;
37
+ }
38
+ async createTable(table, tableSchema) {
39
+ try {
40
+ systemLog("sql", "[createTable]", table);
41
+ const db = await this.getDb();
42
+ const result = await db.runAsync(`CREATE TABLE IF NOT EXISTS '${table}' (${tableSchema})`);
43
+ systemLog("sql", "[createTable] result: ", JSON.stringify(result));
44
+ return result;
45
+ } catch (e) {
46
+ systemLogError("sql", "[createTable]", e);
47
+ throw e;
48
+ }
49
+ }
50
+ async createTables(tables) {
51
+ try {
52
+ systemLog("sql", "[createTables]", tables);
53
+ const query = Object.entries(tables).reduce((acc, [table, schema]) => {
54
+ return acc + `CREATE TABLE IF NOT EXISTS '${table}' (${schema});`;
55
+ }, "");
56
+ const db = await this.getDb();
57
+ const result = await db.runAsync(query);
58
+ systemLog("sql", "[createTables] result: ", JSON.stringify(result));
59
+ return result;
60
+ } catch (e) {
61
+ systemLogError("sql", "[createTable]", e);
62
+ throw e;
63
+ }
64
+ }
65
+ /**
66
+ * Smazani starych logu
67
+ */
68
+ async deleteLogs() {
69
+ systemLog("sql", "[query] delete old Logs", this.db);
70
+ try {
71
+ const db = await this.getDb();
72
+ await db.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);
73
+ } catch (error) {
74
+ throw error;
75
+ }
76
+ }
77
+ async read(query, args) {
78
+ try {
79
+ systemLog("sql", "[read]", query);
80
+ const db = await this.getDb();
81
+ const result = args === void 0 ? await db.getAllAsync(query) : await db.getAllAsync(query, args);
82
+ systemLog("sql", "[read] result ", result.length);
83
+ return result;
84
+ } catch (e) {
85
+ systemLogError("sql", "[read]", e);
86
+ throw e;
87
+ }
88
+ }
89
+ async query(query, args) {
90
+ try {
91
+ systemLog("sql", "[query]->", query);
92
+ const db = await this.getDb();
93
+ const result = args === void 0 ? await db.getAllAsync(query) : await db.getAllAsync(query, args);
94
+ systemLog("sql", result);
95
+ return result;
96
+ } catch (error) {
97
+ console.error("INSERT ERROR", error);
98
+ systemLogError("sql", error);
99
+ throw error;
100
+ }
101
+ }
102
+ async dropTable(table) {
103
+ try {
104
+ systemLog("sql", "dropTable", table);
105
+ console.time("[SQL] dropTable");
106
+ const db = await this.getDb();
107
+ const result = await db.runAsync(`DROP TABLE ${table}`);
108
+ console.timeEnd("[SQL] dropTable");
109
+ return result;
110
+ } catch (error) {
111
+ throw error;
112
+ }
113
+ }
114
+ async emptyTable(table) {
115
+ try {
116
+ systemLog("sql", `[emptyTable]`, table);
117
+ const db = await this.getDb();
118
+ const result = await db.runAsync(`DELETE FROM '${table}'`);
119
+ systemLog("sql", "[emptyTable] result", result);
120
+ return result;
121
+ } catch (error) {
122
+ throw error;
123
+ }
124
+ }
125
+ async getTables() {
126
+ systemLog("sql", "Jdu zkusit nacist tabulky z ", JSON.stringify(this.dbName));
127
+ try {
128
+ const db = await this.getDb();
129
+ const result = await db.getAllAsync('SELECT name FROM sqlite_master WHERE type="table"');
130
+ systemLog("sql", "DB Result:", result);
131
+ return result;
132
+ } catch (error) {
133
+ throw error;
134
+ }
135
+ }
136
+ async resetDatabase() {
137
+ try {
138
+ systemLog("sql", "Reset database", this.dbName);
139
+ console.time("DELETING");
140
+ systemLog("sql", "Closing");
141
+ const db = await this.getDb();
142
+ await db.closeAsync();
143
+ systemLog("sql", "Deleting");
144
+ await SQL.deleteDatabaseAsync(this.dbName);
145
+ console.timeEnd("DELETING");
146
+ console.time("INIT");
147
+ this.db = null;
148
+ systemLog("sql", "Zacinam inicializovat databazi databaze");
149
+ await this.initDB();
150
+ systemLog("sql", "Inicializovana databaze");
151
+ console.timeEnd("INIT");
152
+ } catch (e) {
153
+ systemLogError("sql", "[resetDatabase]", e);
154
+ }
155
+ }
156
+ };
157
+
158
+ // src/expo-sqlite.ts
159
+ function createExpoSQLiteStorage(name) {
160
+ return new SQLite(name);
161
+ }
162
+ export {
163
+ SQLite as ExpoSQLiteStorage,
164
+ createExpoSQLiteStorage
165
+ };
166
+ //# sourceMappingURL=expo-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/database.ts","../src/expo-sqlite.ts"],"sourcesContent":["import * as SQL from \"expo-sqlite\";\nimport { systemLog, systemLogError } from \"./log\";\nimport type { DataStoreStorage } from \"./storage\";\n\nexport class SQLite implements DataStoreStorage {\n dbName: string;\n private db: SQL.SQLiteDatabase | null = null;\n\n constructor(name?: string) {\n this.dbName = name || \"modelaz.db\";\n this.initDB();\n }\n\n private async initDB(): Promise<void> {\n if (!this.db) {\n try {\n systemLog(\"sql\", \"[initDB]\");\n this.db = await SQL.openDatabaseAsync(this.dbName);\n // await this.createTable(\"documents\", \"id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT\");\n // await this.createTable(\"logs\", \"time TEXT PRIMARY KEY, module TEXT, message TEXT\");\n await this.createTables({\n documents: \"id TEXT PRIMARY KEY, data TEXT, model TEXT, lastUpdate TEXT\",\n // logs: \"time TEXT PRIMARY KEY, module TEXT, message TEXT\",\n });\n // await this.createTable(\"providers\", \"id TEXT PRIMARY KEY, data TEXT, lastUpdate TEXT\");\n // await this.db?.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);\n } catch (e) {\n console.log(\"INITDB ERROR\", e);\n // systemLogError(\"sql\", \"[initDB]\", e);\n throw e;\n }\n }\n }\n\n private async getDb(): Promise<SQL.SQLiteDatabase> {\n if (!this.db) {\n await this.initDB();\n }\n\n if (!this.db) {\n throw new Error(\"Database is not initialized\");\n }\n\n return this.db;\n }\n\n private async createTable(table: string, tableSchema: string): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", \"[createTable]\", table);\n const db = await this.getDb();\n const result = await db.runAsync(`CREATE TABLE IF NOT EXISTS '${table}' (${tableSchema})`);\n systemLog(\"sql\", \"[createTable] result: \", JSON.stringify(result));\n return result;\n } catch (e) {\n systemLogError(\"sql\", \"[createTable]\", e);\n throw e;\n }\n }\n private async createTables(tables: { [key: string]: string }): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", \"[createTables]\", tables);\n const query = Object.entries(tables).reduce((acc, [table, schema]) => {\n return acc + `CREATE TABLE IF NOT EXISTS '${table}' (${schema});`;\n }, \"\");\n // console.log(\"Query: \", query);\n const db = await this.getDb();\n const result = await db.runAsync(query);\n systemLog(\"sql\", \"[createTables] result: \", JSON.stringify(result));\n return result;\n } catch (e) {\n systemLogError(\"sql\", \"[createTable]\", e);\n throw e;\n }\n }\n\n /**\n * Smazani starych logu\n */\n private async deleteLogs(): Promise<void> {\n systemLog(\"sql\", \"[query] delete old Logs\", this.db);\n try {\n const db = await this.getDb();\n await db.runAsync(`DELETE FROM logs WHERE strftime('%s', 'now') - strftime('%s', time) > 3600`);\n } catch (error) {\n throw error;\n }\n }\n\n public async read<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]> {\n try {\n // Smazani starych zaznamu z logu\n systemLog(\"sql\", \"[read]\", query);\n const db = await this.getDb();\n const result = args === undefined ? await db.getAllAsync<T>(query) : await db.getAllAsync<T>(query, args);\n systemLog(\"sql\", \"[read] result \", result.length);\n return result;\n } catch (e) {\n systemLogError(\"sql\", \"[read]\", e);\n throw e;\n }\n }\n\n public async query<T>(query: string, args?: SQL.SQLiteBindParams): Promise<T[]> {\n try {\n systemLog(\"sql\", \"[query]->\", query);\n const db = await this.getDb();\n const result = args === undefined ? await db.getAllAsync<T>(query) : await db.getAllAsync<T>(query, args);\n systemLog(\"sql\", result);\n return result;\n } catch (error) {\n console.error(\"INSERT ERROR\", error);\n systemLogError(\"sql\", error);\n throw error;\n }\n }\n\n public async dropTable(table: string): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", \"dropTable\", table);\n console.time(\"[SQL] dropTable\");\n const db = await this.getDb();\n const result = await db.runAsync(`DROP TABLE ${table}`);\n console.timeEnd(\"[SQL] dropTable\");\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n public async emptyTable(table: string): Promise<SQL.SQLiteRunResult> {\n try {\n systemLog(\"sql\", `[emptyTable]`, table);\n const db = await this.getDb();\n const result = await db.runAsync(`DELETE FROM '${table}'`);\n systemLog(\"sql\", \"[emptyTable] result\", result);\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n public async getTables() {\n systemLog(\"sql\", \"Jdu zkusit nacist tabulky z \", JSON.stringify(this.dbName));\n try {\n const db = await this.getDb();\n const result = await db.getAllAsync('SELECT name FROM sqlite_master WHERE type=\"table\"');\n systemLog(\"sql\", \"DB Result:\", result);\n return result;\n } catch (error) {\n throw error;\n }\n }\n\n public async resetDatabase() {\n try {\n systemLog(\"sql\", \"Reset database\", this.dbName);\n console.time(\"DELETING\");\n systemLog(\"sql\", \"Closing\");\n const db = await this.getDb();\n await db.closeAsync();\n systemLog(\"sql\", \"Deleting\");\n await SQL.deleteDatabaseAsync(this.dbName);\n console.timeEnd(\"DELETING\");\n console.time(\"INIT\");\n this.db = null;\n systemLog(\"sql\", \"Zacinam inicializovat databazi databaze\");\n await this.initDB();\n systemLog(\"sql\", \"Inicializovana databaze\");\n console.timeEnd(\"INIT\");\n } catch (e) {\n systemLogError(\"sql\", \"[resetDatabase]\", e);\n }\n }\n}\n","export { SQLite as ExpoSQLiteStorage } from \"./database\";\n\nimport { SQLite } from \"./database\";\n\n/**\n * Vytvoří výchozí Expo SQLite adapter pro DataStoreProvider.\n *\n * @param name Volitelný název SQLite databázového souboru.\n */\nexport function createExpoSQLiteStorage(name?: string) {\n return new SQLite(name);\n}"],"mappings":"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","names":[]}