tinybase 6.1.0-beta.3 → 6.1.0-beta.5
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/@types/persisters/index.d.ts +83 -40
- package/@types/persisters/persister-automerge/index.d.ts +4 -4
- package/@types/persisters/persister-automerge/with-schemas/index.d.ts +4 -4
- package/@types/persisters/persister-browser/index.d.ts +4 -4
- package/@types/persisters/persister-browser/with-schemas/index.d.ts +4 -4
- package/@types/persisters/persister-cr-sqlite-wasm/index.d.ts +3 -3
- package/@types/persisters/persister-cr-sqlite-wasm/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-electric-sql/index.d.ts +3 -3
- package/@types/persisters/persister-electric-sql/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-expo-sqlite/index.d.ts +3 -3
- package/@types/persisters/persister-expo-sqlite/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-file/index.d.ts +2 -2
- package/@types/persisters/persister-file/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-indexed-db/index.d.ts +2 -2
- package/@types/persisters/persister-indexed-db/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-libsql/index.d.ts +3 -3
- package/@types/persisters/persister-libsql/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-partykit-client/index.d.ts +2 -2
- package/@types/persisters/persister-partykit-client/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-pglite/index.d.ts +3 -3
- package/@types/persisters/persister-pglite/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-postgres/index.d.ts +3 -3
- package/@types/persisters/persister-postgres/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-powersync/index.d.ts +3 -3
- package/@types/persisters/persister-powersync/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-remote/index.d.ts +2 -2
- package/@types/persisters/persister-remote/with-schemas/index.d.ts +2 -2
- package/@types/persisters/persister-sqlite-bun/index.d.ts +159 -0
- package/@types/persisters/persister-sqlite-bun/with-schemas/index.d.ts +178 -0
- package/@types/persisters/persister-sqlite-wasm/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite-wasm/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite3/index.d.ts +3 -3
- package/@types/persisters/persister-sqlite3/with-schemas/index.d.ts +3 -3
- package/@types/persisters/persister-yjs/index.d.ts +4 -4
- package/@types/persisters/persister-yjs/with-schemas/index.d.ts +4 -4
- package/@types/persisters/with-schemas/index.d.ts +87 -42
- package/@types/synchronizers/index.d.ts +18 -16
- package/@types/synchronizers/synchronizer-broadcast-channel/index.d.ts +3 -3
- package/@types/synchronizers/synchronizer-broadcast-channel/with-schemas/index.d.ts +3 -3
- package/@types/synchronizers/synchronizer-local/index.d.ts +2 -2
- package/@types/synchronizers/synchronizer-local/with-schemas/index.d.ts +2 -2
- package/@types/synchronizers/synchronizer-ws-client/index.d.ts +5 -5
- package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +5 -5
- package/@types/synchronizers/synchronizer-ws-server/index.d.ts +37 -37
- package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +37 -37
- package/@types/synchronizers/synchronizer-ws-server-simple/index.d.ts +7 -7
- package/@types/synchronizers/synchronizer-ws-server-simple/with-schemas/index.d.ts +7 -7
- package/@types/synchronizers/with-schemas/index.d.ts +18 -16
- package/@types/ui-react/index.d.ts +2 -2
- package/@types/ui-react/with-schemas/index.d.ts +2 -2
- package/index.js +23 -17
- package/mergeable-store/index.js +23 -17
- package/mergeable-store/with-schemas/index.js +23 -17
- package/min/index.js +1 -1
- package/min/index.js.gz +0 -0
- package/min/mergeable-store/index.js +1 -1
- package/min/mergeable-store/index.js.gz +0 -0
- package/min/mergeable-store/with-schemas/index.js +1 -1
- package/min/mergeable-store/with-schemas/index.js.gz +0 -0
- package/min/persisters/index.js +1 -1
- package/min/persisters/index.js.gz +0 -0
- package/min/persisters/persister-automerge/index.js +1 -1
- package/min/persisters/persister-automerge/index.js.gz +0 -0
- package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-browser/index.js +1 -1
- package/min/persisters/persister-browser/index.js.gz +0 -0
- package/min/persisters/persister-browser/with-schemas/index.js +1 -1
- package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/index.js +1 -1
- package/min/persisters/persister-electric-sql/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
- package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-file/index.js +1 -1
- package/min/persisters/persister-file/index.js.gz +0 -0
- package/min/persisters/persister-file/with-schemas/index.js +1 -1
- package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/index.js +1 -1
- package/min/persisters/persister-indexed-db/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
- package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-libsql/index.js +1 -1
- package/min/persisters/persister-libsql/index.js.gz +0 -0
- package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
- package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/index.js +1 -1
- package/min/persisters/persister-partykit-client/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
- package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pglite/index.js +1 -1
- package/min/persisters/persister-pglite/index.js.gz +0 -0
- package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
- package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-postgres/index.js +1 -1
- package/min/persisters/persister-postgres/index.js.gz +0 -0
- package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
- package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-powersync/index.js +1 -1
- package/min/persisters/persister-powersync/index.js.gz +0 -0
- package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
- package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-remote/index.js +1 -1
- package/min/persisters/persister-remote/index.js.gz +0 -0
- package/min/persisters/persister-remote/with-schemas/index.js +1 -1
- package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/index.js +1 -0
- package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/index.js +1 -1
- package/min/persisters/persister-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-yjs/index.js +1 -1
- package/min/persisters/persister-yjs/index.js.gz +0 -0
- package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
- package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
- package/min/persisters/with-schemas/index.js +1 -1
- package/min/persisters/with-schemas/index.js.gz +0 -0
- package/min/store/index.js +1 -1
- package/min/store/index.js.gz +0 -0
- package/min/store/with-schemas/index.js +1 -1
- package/min/store/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/index.js +1 -1
- package/min/synchronizers/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/index.js +1 -1
- package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/with-schemas/index.js +1 -1
- package/min/synchronizers/with-schemas/index.js.gz +0 -0
- package/min/ui-react-inspector/index.js +1 -1
- package/min/ui-react-inspector/index.js.gz +0 -0
- package/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/min/with-schemas/index.js +1 -1
- package/min/with-schemas/index.js.gz +0 -0
- package/package.json +46 -6
- package/persisters/index.js +293 -161
- package/persisters/persister-automerge/index.js +55 -50
- package/persisters/persister-automerge/with-schemas/index.js +55 -50
- package/persisters/persister-browser/index.js +56 -55
- package/persisters/persister-browser/with-schemas/index.js +56 -55
- package/persisters/persister-cr-sqlite-wasm/index.js +181 -134
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +181 -134
- package/persisters/persister-durable-object-storage/index.js +58 -53
- package/persisters/persister-durable-object-storage/with-schemas/index.js +58 -53
- package/persisters/persister-electric-sql/index.js +181 -134
- package/persisters/persister-electric-sql/with-schemas/index.js +181 -134
- package/persisters/persister-expo-sqlite/index.js +181 -134
- package/persisters/persister-expo-sqlite/with-schemas/index.js +181 -134
- package/persisters/persister-file/index.js +55 -50
- package/persisters/persister-file/with-schemas/index.js +55 -50
- package/persisters/persister-indexed-db/index.js +82 -78
- package/persisters/persister-indexed-db/with-schemas/index.js +82 -78
- package/persisters/persister-libsql/index.js +182 -135
- package/persisters/persister-libsql/with-schemas/index.js +182 -135
- package/persisters/persister-partykit-client/index.js +56 -51
- package/persisters/persister-partykit-client/with-schemas/index.js +56 -51
- package/persisters/persister-pglite/index.js +299 -173
- package/persisters/persister-pglite/with-schemas/index.js +299 -173
- package/persisters/persister-postgres/index.js +296 -171
- package/persisters/persister-postgres/with-schemas/index.js +296 -171
- package/persisters/persister-powersync/index.js +189 -138
- package/persisters/persister-powersync/with-schemas/index.js +189 -138
- package/persisters/persister-remote/index.js +55 -50
- package/persisters/persister-remote/with-schemas/index.js +55 -50
- package/persisters/persister-sqlite-bun/index.js +1171 -0
- package/persisters/persister-sqlite-bun/with-schemas/index.js +1171 -0
- package/persisters/persister-sqlite-wasm/index.js +182 -135
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +182 -135
- package/persisters/persister-sqlite3/index.js +181 -134
- package/persisters/persister-sqlite3/with-schemas/index.js +181 -134
- package/persisters/persister-yjs/index.js +55 -50
- package/persisters/persister-yjs/with-schemas/index.js +55 -50
- package/persisters/with-schemas/index.js +293 -161
- package/readme.md +2 -2
- package/releases.md +29 -1
- package/store/index.js +20 -15
- package/store/with-schemas/index.js +20 -15
- package/synchronizers/index.js +68 -63
- package/synchronizers/synchronizer-broadcast-channel/index.js +68 -63
- package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +68 -63
- package/synchronizers/synchronizer-local/index.js +68 -63
- package/synchronizers/synchronizer-local/with-schemas/index.js +68 -63
- package/synchronizers/synchronizer-ws-client/index.js +68 -63
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +68 -63
- package/synchronizers/synchronizer-ws-server/index.js +79 -70
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +79 -70
- package/synchronizers/synchronizer-ws-server-durable-object/index.js +69 -51
- package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +69 -51
- package/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/synchronizers/with-schemas/index.js +68 -63
- package/ui-react-inspector/index.js +68 -60
- package/ui-react-inspector/with-schemas/index.js +68 -60
- package/with-schemas/index.js +23 -17
|
@@ -3,7 +3,10 @@ const TINYBASE = 'tinybase';
|
|
|
3
3
|
const EMPTY_STRING = '';
|
|
4
4
|
const COMMA = ',';
|
|
5
5
|
const STRING = getTypeOf(EMPTY_STRING);
|
|
6
|
+
const TRUE = 'true';
|
|
6
7
|
const UNDEFINED = '\uFFFC';
|
|
8
|
+
const strReplace = (str, searchValue, replaceValue) =>
|
|
9
|
+
str.replace(searchValue, replaceValue);
|
|
7
10
|
|
|
8
11
|
const promise = Promise;
|
|
9
12
|
const THOUSAND = 1e3;
|
|
@@ -19,10 +22,19 @@ const isArray = (thing) => Array.isArray(thing);
|
|
|
19
22
|
const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
|
|
20
23
|
const size = (arrayOrString) => arrayOrString.length;
|
|
21
24
|
const test = (regex, subject) => regex.test(subject);
|
|
25
|
+
const noop = () => {};
|
|
22
26
|
const promiseAll = async (promises) => promise.all(promises);
|
|
23
27
|
const errorNew = (message) => {
|
|
24
28
|
throw new Error(message);
|
|
25
29
|
};
|
|
30
|
+
const tryCatch = async (action, then1, then2) => {
|
|
31
|
+
try {
|
|
32
|
+
return await action();
|
|
33
|
+
} catch (error) {
|
|
34
|
+
/* istanbul ignore next */
|
|
35
|
+
then1?.(error);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
26
38
|
|
|
27
39
|
const arrayForEach = (array, cb) => array.forEach(cb);
|
|
28
40
|
const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
|
|
@@ -85,14 +97,21 @@ const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
|
|
|
85
97
|
const SELECT = 'SELECT';
|
|
86
98
|
const WHERE = 'WHERE';
|
|
87
99
|
const TABLE = 'TABLE';
|
|
100
|
+
const INSERT = 'INSERT';
|
|
101
|
+
const DELETE = 'DELETE';
|
|
102
|
+
const UPDATE = 'UPDATE';
|
|
88
103
|
const ALTER_TABLE = 'ALTER ' + TABLE;
|
|
89
|
-
const
|
|
90
|
-
const
|
|
104
|
+
const FROM = 'FROM';
|
|
105
|
+
const DELETE_FROM = DELETE + ' ' + FROM;
|
|
106
|
+
const SELECT_STAR_FROM = SELECT + '*' + FROM;
|
|
91
107
|
const PRAGMA = 'pragma_';
|
|
92
108
|
const DATA_VERSION = 'data_version';
|
|
93
109
|
const SCHEMA_VERSION = 'schema_version';
|
|
94
|
-
const FROM = 'FROM ';
|
|
95
110
|
const PRAGMA_TABLE = 'pragma_table_';
|
|
111
|
+
const CREATE = 'CREATE ';
|
|
112
|
+
const CREATE_TABLE = CREATE + TABLE;
|
|
113
|
+
const OR_REPLACE = 'OR REPLACE ';
|
|
114
|
+
const TABLE_NAME_PLACEHOLDER = '$tableName';
|
|
96
115
|
const getWrappedCommand = (executeCommand, onSqlCommand) =>
|
|
97
116
|
onSqlCommand
|
|
98
117
|
? async (sql, params) => {
|
|
@@ -100,7 +119,7 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
|
|
|
100
119
|
return await executeCommand(sql, params);
|
|
101
120
|
}
|
|
102
121
|
: executeCommand;
|
|
103
|
-
const escapeId = (str) => `"${str
|
|
122
|
+
const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
|
|
104
123
|
const escapeColumnNames = (...columnNames) =>
|
|
105
124
|
arrayJoin(arrayMap(columnNames, escapeId), COMMA);
|
|
106
125
|
const getPlaceholders = (array, offset = [1]) =>
|
|
@@ -108,9 +127,14 @@ const getPlaceholders = (array, offset = [1]) =>
|
|
|
108
127
|
arrayMap(array, () => '$' + offset[0]++),
|
|
109
128
|
COMMA,
|
|
110
129
|
);
|
|
130
|
+
const getWhereCondition = (tableName, condition = TRUE) =>
|
|
131
|
+
WHERE +
|
|
132
|
+
`(${strReplace(condition, TABLE_NAME_PLACEHOLDER, escapeId(tableName))})`;
|
|
111
133
|
|
|
112
134
|
const mapNew = (entries) => new Map(entries);
|
|
113
135
|
const mapGet = (map, key) => map?.get(key);
|
|
136
|
+
const mapForEach = (map, cb) =>
|
|
137
|
+
collForEach(map, (value, key) => cb(key, value));
|
|
114
138
|
const mapMap = (coll, cb) =>
|
|
115
139
|
arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
|
|
116
140
|
const mapSet = (map, key, value) =>
|
|
@@ -157,6 +181,7 @@ const TABLE_ID = 'tableId';
|
|
|
157
181
|
const TABLE_NAME = 'tableName';
|
|
158
182
|
const DELETE_EMPTY_COLUMNS = 'deleteEmptyColumns';
|
|
159
183
|
const DELETE_EMPTY_TABLE = 'deleteEmptyTable';
|
|
184
|
+
const CONDITION = 'condition';
|
|
160
185
|
const DEFAULT_CONFIG = {
|
|
161
186
|
mode: JSON$1,
|
|
162
187
|
[AUTO_LOAD_INTERVAL_SECONDS]: 1,
|
|
@@ -224,29 +249,42 @@ const getConfigStructures = (configOrStoreTableName) => {
|
|
|
224
249
|
const valuesTable = valuesConfig[2];
|
|
225
250
|
const managedTableNames = setNew(valuesTable);
|
|
226
251
|
const excludedTableNames = setNew(valuesTable);
|
|
227
|
-
const
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
252
|
+
const tablesLoadConfig = getDefaultedTabularConfigMap(
|
|
253
|
+
load,
|
|
254
|
+
{
|
|
255
|
+
[TABLE_ID]: null,
|
|
256
|
+
[ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME,
|
|
257
|
+
[CONDITION]: TRUE,
|
|
258
|
+
},
|
|
259
|
+
TABLE_ID,
|
|
260
|
+
(tableName) => collHas(excludedTableNames, tableName),
|
|
261
|
+
(tableName) => setAdd(managedTableNames, tableName),
|
|
262
|
+
);
|
|
263
|
+
const tablesSaveConfig = getDefaultedTabularConfigMap(
|
|
264
|
+
save,
|
|
265
|
+
{
|
|
266
|
+
[TABLE_NAME]: null,
|
|
267
|
+
[ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME,
|
|
268
|
+
[DELETE_EMPTY_COLUMNS]: 0,
|
|
269
|
+
[DELETE_EMPTY_TABLE]: 0,
|
|
270
|
+
[CONDITION]: null,
|
|
271
|
+
},
|
|
272
|
+
TABLE_NAME,
|
|
273
|
+
(_, tableName) => collHas(excludedTableNames, tableName),
|
|
274
|
+
(_, tableName) => setAdd(managedTableNames, tableName),
|
|
275
|
+
);
|
|
276
|
+
mapForEach(
|
|
277
|
+
tablesSaveConfig,
|
|
278
|
+
(_, tableSaveConfig) =>
|
|
279
|
+
(tableSaveConfig[4] ??=
|
|
280
|
+
mapGet(tablesLoadConfig, tableSaveConfig[0])?.[2] ?? TRUE),
|
|
281
|
+
);
|
|
282
|
+
return [
|
|
283
|
+
0,
|
|
284
|
+
autoLoadIntervalSeconds,
|
|
285
|
+
[tablesLoadConfig, tablesSaveConfig, valuesConfig],
|
|
286
|
+
managedTableNames,
|
|
248
287
|
];
|
|
249
|
-
return [0, autoLoadIntervalSeconds, tabularConfig, managedTableNames];
|
|
250
288
|
};
|
|
251
289
|
|
|
252
290
|
const jsonString = JSON.stringify;
|
|
@@ -412,12 +450,7 @@ const createCustomPersister = (
|
|
|
412
450
|
while (
|
|
413
451
|
!isUndefined((action = arrayShift(mapGet(scheduleActions, scheduleId))))
|
|
414
452
|
) {
|
|
415
|
-
|
|
416
|
-
await action();
|
|
417
|
-
} catch (error) {
|
|
418
|
-
/* istanbul ignore next */
|
|
419
|
-
onIgnoredError?.(error);
|
|
420
|
-
}
|
|
453
|
+
await tryCatch(action, onIgnoredError);
|
|
421
454
|
}
|
|
422
455
|
mapSet(scheduleRunning, scheduleId, 0);
|
|
423
456
|
}
|
|
@@ -437,21 +470,23 @@ const createCustomPersister = (
|
|
|
437
470
|
setStatus(1 /* Loading */);
|
|
438
471
|
loads++;
|
|
439
472
|
await schedule(async () => {
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
473
|
+
await tryCatch(
|
|
474
|
+
async () => {
|
|
475
|
+
const content = await getPersisted();
|
|
476
|
+
if (isArray(content)) {
|
|
477
|
+
setContentOrChanges(content);
|
|
478
|
+
} else if (initialContent) {
|
|
479
|
+
setDefaultContent(initialContent);
|
|
480
|
+
} else {
|
|
481
|
+
errorNew(`Content is not an array: ${content}`);
|
|
482
|
+
}
|
|
483
|
+
},
|
|
484
|
+
() => {
|
|
485
|
+
if (initialContent) {
|
|
486
|
+
setDefaultContent(initialContent);
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
);
|
|
455
490
|
setStatus(0 /* Idle */);
|
|
456
491
|
});
|
|
457
492
|
}
|
|
@@ -460,29 +495,33 @@ const createCustomPersister = (
|
|
|
460
495
|
const startAutoLoad = async (initialContent) => {
|
|
461
496
|
stopAutoLoad();
|
|
462
497
|
await load(initialContent);
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
498
|
+
await tryCatch(
|
|
499
|
+
async () =>
|
|
500
|
+
(autoLoadHandle = await addPersisterListener(
|
|
501
|
+
async (content, changes) => {
|
|
502
|
+
if (changes || content) {
|
|
503
|
+
/* istanbul ignore else */
|
|
504
|
+
if (status != 2 /* Saving */) {
|
|
505
|
+
setStatus(1 /* Loading */);
|
|
506
|
+
loads++;
|
|
507
|
+
setContentOrChanges(changes ?? content);
|
|
508
|
+
setStatus(0 /* Idle */);
|
|
509
|
+
}
|
|
510
|
+
} else {
|
|
511
|
+
await load();
|
|
512
|
+
}
|
|
513
|
+
},
|
|
514
|
+
)),
|
|
515
|
+
onIgnoredError,
|
|
516
|
+
);
|
|
481
517
|
return persister;
|
|
482
518
|
};
|
|
483
|
-
const stopAutoLoad = () => {
|
|
519
|
+
const stopAutoLoad = async () => {
|
|
484
520
|
if (autoLoadHandle) {
|
|
485
|
-
|
|
521
|
+
await tryCatch(
|
|
522
|
+
() => delPersisterListener(autoLoadHandle),
|
|
523
|
+
onIgnoredError,
|
|
524
|
+
);
|
|
486
525
|
autoLoadHandle = void 0;
|
|
487
526
|
}
|
|
488
527
|
return persister;
|
|
@@ -494,12 +533,7 @@ const createCustomPersister = (
|
|
|
494
533
|
setStatus(2 /* Saving */);
|
|
495
534
|
saves++;
|
|
496
535
|
await schedule(async () => {
|
|
497
|
-
|
|
498
|
-
await setPersisted(getContent, changes);
|
|
499
|
-
} catch (error) {
|
|
500
|
-
/* istanbul ignore next */
|
|
501
|
-
onIgnoredError?.(error);
|
|
502
|
-
}
|
|
536
|
+
await tryCatch(() => setPersisted(getContent, changes), onIgnoredError);
|
|
503
537
|
setStatus(0 /* Idle */);
|
|
504
538
|
});
|
|
505
539
|
}
|
|
@@ -516,7 +550,7 @@ const createCustomPersister = (
|
|
|
516
550
|
});
|
|
517
551
|
return persister;
|
|
518
552
|
};
|
|
519
|
-
const stopAutoSave = () => {
|
|
553
|
+
const stopAutoSave = async () => {
|
|
520
554
|
if (autoSaveListenerId) {
|
|
521
555
|
store.delListener(autoSaveListenerId);
|
|
522
556
|
autoSaveListenerId = void 0;
|
|
@@ -537,9 +571,10 @@ const createCustomPersister = (
|
|
|
537
571
|
return persister;
|
|
538
572
|
};
|
|
539
573
|
const getStore = () => store;
|
|
540
|
-
const destroy = () => {
|
|
574
|
+
const destroy = async () => {
|
|
541
575
|
arrayClear(mapGet(scheduleActions, scheduleId));
|
|
542
|
-
|
|
576
|
+
await persister.stopAutoLoad();
|
|
577
|
+
return await persister.stopAutoSave();
|
|
543
578
|
};
|
|
544
579
|
const getStats = () => ({loads, saves});
|
|
545
580
|
const persister = {
|
|
@@ -583,13 +618,15 @@ const getCommandFunctions = (
|
|
|
583
618
|
({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
|
|
584
619
|
);
|
|
585
620
|
};
|
|
586
|
-
const loadTable = async (tableName, rowIdColumnName) =>
|
|
621
|
+
const loadTable = async (tableName, rowIdColumnName, condition) =>
|
|
587
622
|
canSelect(tableName, rowIdColumnName)
|
|
588
623
|
? objNew(
|
|
589
624
|
arrayFilter(
|
|
590
625
|
arrayMap(
|
|
591
626
|
await databaseExecuteCommand(
|
|
592
|
-
SELECT_STAR_FROM +
|
|
627
|
+
SELECT_STAR_FROM +
|
|
628
|
+
escapeId(tableName) +
|
|
629
|
+
getWhereCondition(tableName, condition),
|
|
593
630
|
),
|
|
594
631
|
(row) => [
|
|
595
632
|
row[rowIdColumnName],
|
|
@@ -609,6 +646,7 @@ const getCommandFunctions = (
|
|
|
609
646
|
deleteEmptyColumns,
|
|
610
647
|
deleteEmptyTable,
|
|
611
648
|
partial = false,
|
|
649
|
+
condition = TRUE,
|
|
612
650
|
) => {
|
|
613
651
|
const settingColumnNameSet = setNew();
|
|
614
652
|
objMap(content ?? {}, (contentRow) =>
|
|
@@ -620,6 +658,7 @@ const getCommandFunctions = (
|
|
|
620
658
|
if (
|
|
621
659
|
!partial &&
|
|
622
660
|
deleteEmptyTable &&
|
|
661
|
+
condition == TRUE &&
|
|
623
662
|
arrayIsEmpty(settingColumnNames) &&
|
|
624
663
|
collHas(schemaMap, tableName)
|
|
625
664
|
) {
|
|
@@ -632,8 +671,7 @@ const getCommandFunctions = (
|
|
|
632
671
|
if (!arrayIsEmpty(settingColumnNames)) {
|
|
633
672
|
if (!collHas(schemaMap, tableName)) {
|
|
634
673
|
await databaseExecuteCommand(
|
|
635
|
-
|
|
636
|
-
TABLE +
|
|
674
|
+
CREATE_TABLE +
|
|
637
675
|
escapeId(tableName) +
|
|
638
676
|
`(${escapeId(rowIdColumnName)}${columnType} PRIMARY KEY${arrayJoin(
|
|
639
677
|
arrayMap(
|
|
@@ -696,7 +734,9 @@ const getCommandFunctions = (
|
|
|
696
734
|
if (partial) {
|
|
697
735
|
if (isUndefined(content)) {
|
|
698
736
|
await databaseExecuteCommand(
|
|
699
|
-
DELETE_FROM +
|
|
737
|
+
DELETE_FROM +
|
|
738
|
+
escapeId(tableName) +
|
|
739
|
+
getWhereCondition(tableName, condition),
|
|
700
740
|
);
|
|
701
741
|
} else {
|
|
702
742
|
await promiseAll(
|
|
@@ -705,9 +745,8 @@ const getCommandFunctions = (
|
|
|
705
745
|
await databaseExecuteCommand(
|
|
706
746
|
DELETE_FROM +
|
|
707
747
|
escapeId(tableName) +
|
|
708
|
-
|
|
709
|
-
escapeId(rowIdColumnName)
|
|
710
|
-
'=$1',
|
|
748
|
+
getWhereCondition(tableName, condition) +
|
|
749
|
+
`AND(${escapeId(rowIdColumnName)}=$1)`,
|
|
711
750
|
[rowId],
|
|
712
751
|
);
|
|
713
752
|
} else if (!arrayIsEmpty(settingColumnNames)) {
|
|
@@ -751,14 +790,15 @@ const getCommandFunctions = (
|
|
|
751
790
|
await databaseExecuteCommand(
|
|
752
791
|
DELETE_FROM +
|
|
753
792
|
escapeId(tableName) +
|
|
754
|
-
|
|
755
|
-
escapeId(rowIdColumnName)
|
|
756
|
-
`NOT IN(${getPlaceholders(deleteRowIds)})`,
|
|
793
|
+
getWhereCondition(tableName, condition) + // eslint-disable-next-line max-len
|
|
794
|
+
`AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
|
|
757
795
|
deleteRowIds,
|
|
758
796
|
);
|
|
759
797
|
} else if (collHas(schemaMap, tableName)) {
|
|
760
798
|
await databaseExecuteCommand(
|
|
761
|
-
DELETE_FROM +
|
|
799
|
+
DELETE_FROM +
|
|
800
|
+
escapeId(tableName) +
|
|
801
|
+
getWhereCondition(tableName, condition),
|
|
762
802
|
);
|
|
763
803
|
}
|
|
764
804
|
}
|
|
@@ -766,11 +806,7 @@ const getCommandFunctions = (
|
|
|
766
806
|
const transaction = async (actions) => {
|
|
767
807
|
let result;
|
|
768
808
|
await databaseExecuteCommand('BEGIN');
|
|
769
|
-
|
|
770
|
-
result = await actions();
|
|
771
|
-
} catch (error) {
|
|
772
|
-
onIgnoredError?.(error);
|
|
773
|
-
}
|
|
809
|
+
await tryCatch(async () => (result = await actions()), onIgnoredError);
|
|
774
810
|
await databaseExecuteCommand('END');
|
|
775
811
|
return result;
|
|
776
812
|
};
|
|
@@ -785,7 +821,8 @@ const defaultUpsert = async (
|
|
|
785
821
|
) => {
|
|
786
822
|
const offset = [1];
|
|
787
823
|
await executeCommand(
|
|
788
|
-
|
|
824
|
+
INSERT +
|
|
825
|
+
' INTO' +
|
|
789
826
|
escapeId(tableName) +
|
|
790
827
|
'(' +
|
|
791
828
|
escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
|
|
@@ -800,7 +837,7 @@ const defaultUpsert = async (
|
|
|
800
837
|
) +
|
|
801
838
|
'ON CONFLICT(' +
|
|
802
839
|
escapeId(rowIdColumnName) +
|
|
803
|
-
|
|
840
|
+
`)DO ${UPDATE} SET` +
|
|
804
841
|
arrayJoin(
|
|
805
842
|
arrayMap(
|
|
806
843
|
changingColumnNames,
|
|
@@ -822,7 +859,7 @@ const createJsonPersister = (
|
|
|
822
859
|
addPersisterListener,
|
|
823
860
|
delPersisterListener,
|
|
824
861
|
onIgnoredError,
|
|
825
|
-
|
|
862
|
+
extraDestroy,
|
|
826
863
|
persist,
|
|
827
864
|
[storeTableName, storeIdColumnName, storeColumnName],
|
|
828
865
|
managedTableNames,
|
|
@@ -841,8 +878,8 @@ const createJsonPersister = (
|
|
|
841
878
|
columnType,
|
|
842
879
|
upsert,
|
|
843
880
|
);
|
|
844
|
-
const getPersisted =
|
|
845
|
-
|
|
881
|
+
const getPersisted = () =>
|
|
882
|
+
transaction(async () => {
|
|
846
883
|
await refreshSchema();
|
|
847
884
|
return jsonParseWithUndefined(
|
|
848
885
|
(await loadTable(storeTableName, storeIdColumnName))[SINGLE_ROW_ID]?.[
|
|
@@ -850,8 +887,8 @@ const createJsonPersister = (
|
|
|
850
887
|
] ?? 'null',
|
|
851
888
|
);
|
|
852
889
|
});
|
|
853
|
-
const setPersisted =
|
|
854
|
-
|
|
890
|
+
const setPersisted = (getContent) =>
|
|
891
|
+
transaction(async () => {
|
|
855
892
|
await refreshSchema();
|
|
856
893
|
await saveTable(
|
|
857
894
|
storeTableName,
|
|
@@ -865,9 +902,10 @@ const createJsonPersister = (
|
|
|
865
902
|
true,
|
|
866
903
|
);
|
|
867
904
|
});
|
|
868
|
-
const destroy = () => {
|
|
869
|
-
persister.stopAutoLoad()
|
|
870
|
-
|
|
905
|
+
const destroy = async () => {
|
|
906
|
+
await persister.stopAutoLoad();
|
|
907
|
+
await persister.stopAutoSave();
|
|
908
|
+
extraDestroy();
|
|
871
909
|
return persister;
|
|
872
910
|
};
|
|
873
911
|
const persister = createCustomPersister(
|
|
@@ -891,7 +929,7 @@ const createTabularPersister = (
|
|
|
891
929
|
addPersisterListener,
|
|
892
930
|
delPersisterListener,
|
|
893
931
|
onIgnoredError,
|
|
894
|
-
|
|
932
|
+
extraDestroy,
|
|
895
933
|
persist,
|
|
896
934
|
[
|
|
897
935
|
tablesLoadConfig,
|
|
@@ -918,12 +956,18 @@ const createTabularPersister = (
|
|
|
918
956
|
encode,
|
|
919
957
|
decode,
|
|
920
958
|
);
|
|
921
|
-
const saveTables =
|
|
922
|
-
|
|
959
|
+
const saveTables = (tables, partial) =>
|
|
960
|
+
promiseAll(
|
|
923
961
|
mapMap(
|
|
924
962
|
tablesSaveConfig,
|
|
925
963
|
async (
|
|
926
|
-
[
|
|
964
|
+
[
|
|
965
|
+
tableName,
|
|
966
|
+
rowIdColumnName,
|
|
967
|
+
deleteEmptyColumns,
|
|
968
|
+
deleteEmptyTable,
|
|
969
|
+
condition,
|
|
970
|
+
],
|
|
927
971
|
tableId,
|
|
928
972
|
) => {
|
|
929
973
|
if (!partial || objHas(tables, tableId)) {
|
|
@@ -934,6 +978,7 @@ const createTabularPersister = (
|
|
|
934
978
|
deleteEmptyColumns,
|
|
935
979
|
deleteEmptyTable,
|
|
936
980
|
partial,
|
|
981
|
+
condition,
|
|
937
982
|
);
|
|
938
983
|
}
|
|
939
984
|
},
|
|
@@ -956,9 +1001,9 @@ const createTabularPersister = (
|
|
|
956
1001
|
await promiseAll(
|
|
957
1002
|
mapMap(
|
|
958
1003
|
tablesLoadConfig,
|
|
959
|
-
async ([tableId, rowIdColumnName], tableName) => [
|
|
1004
|
+
async ([tableId, rowIdColumnName, condition], tableName) => [
|
|
960
1005
|
tableId,
|
|
961
|
-
await loadTable(tableName, rowIdColumnName),
|
|
1006
|
+
await loadTable(tableName, rowIdColumnName, condition),
|
|
962
1007
|
],
|
|
963
1008
|
),
|
|
964
1009
|
),
|
|
@@ -971,8 +1016,8 @@ const createTabularPersister = (
|
|
|
971
1016
|
SINGLE_ROW_ID
|
|
972
1017
|
]
|
|
973
1018
|
: {};
|
|
974
|
-
const getPersisted =
|
|
975
|
-
|
|
1019
|
+
const getPersisted = () =>
|
|
1020
|
+
transaction(async () => {
|
|
976
1021
|
await refreshSchema();
|
|
977
1022
|
const tables = await loadTables();
|
|
978
1023
|
const values = await loadValues();
|
|
@@ -980,8 +1025,8 @@ const createTabularPersister = (
|
|
|
980
1025
|
? [tables, values]
|
|
981
1026
|
: void 0;
|
|
982
1027
|
});
|
|
983
|
-
const setPersisted =
|
|
984
|
-
|
|
1028
|
+
const setPersisted = (getContent, changes) =>
|
|
1029
|
+
transaction(async () => {
|
|
985
1030
|
await refreshSchema();
|
|
986
1031
|
if (!isUndefined(changes)) {
|
|
987
1032
|
await saveTables(changes[0], true);
|
|
@@ -992,9 +1037,10 @@ const createTabularPersister = (
|
|
|
992
1037
|
await saveValues(values);
|
|
993
1038
|
}
|
|
994
1039
|
});
|
|
995
|
-
const destroy = () => {
|
|
996
|
-
persister.stopAutoLoad()
|
|
997
|
-
|
|
1040
|
+
const destroy = async () => {
|
|
1041
|
+
await persister.stopAutoLoad();
|
|
1042
|
+
await persister.stopAutoSave();
|
|
1043
|
+
extraDestroy();
|
|
998
1044
|
return persister;
|
|
999
1045
|
};
|
|
1000
1046
|
const persister = createCustomPersister(
|
|
@@ -1039,22 +1085,24 @@ const createCustomSqlitePersister = (
|
|
|
1039
1085
|
const addPersisterListener = (listener) => {
|
|
1040
1086
|
let interval;
|
|
1041
1087
|
const startPolling = () =>
|
|
1042
|
-
(interval = startInterval(
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
if (dataVersion !=
|
|
1050
|
-
|
|
1088
|
+
(interval = startInterval(
|
|
1089
|
+
() =>
|
|
1090
|
+
tryCatch(async () => {
|
|
1091
|
+
const [{d, s, c}] = await executeCommand(
|
|
1092
|
+
SELECT + // eslint-disable-next-line max-len
|
|
1093
|
+
` ${DATA_VERSION} d,${SCHEMA_VERSION} s,TOTAL_CHANGES() c FROM ${PRAGMA}${DATA_VERSION} JOIN ${PRAGMA}${SCHEMA_VERSION}`,
|
|
1094
|
+
);
|
|
1095
|
+
if (d != dataVersion || s != schemaVersion || c != totalChanges) {
|
|
1096
|
+
if (dataVersion != null) {
|
|
1097
|
+
listener();
|
|
1098
|
+
}
|
|
1099
|
+
dataVersion = d;
|
|
1100
|
+
schemaVersion = s;
|
|
1101
|
+
totalChanges = c;
|
|
1051
1102
|
}
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
}
|
|
1056
|
-
} catch {}
|
|
1057
|
-
}, autoLoadIntervalSeconds));
|
|
1103
|
+
}),
|
|
1104
|
+
autoLoadIntervalSeconds,
|
|
1105
|
+
));
|
|
1058
1106
|
const stopPolling = () => {
|
|
1059
1107
|
dataVersion = schemaVersion = totalChanges = null;
|
|
1060
1108
|
stopInterval(interval);
|
|
@@ -1086,8 +1134,8 @@ const createCustomSqlitePersister = (
|
|
|
1086
1134
|
collValues(managedTableNamesSet),
|
|
1087
1135
|
async (executeCommand2, managedTableNames) =>
|
|
1088
1136
|
await executeCommand2(
|
|
1089
|
-
// eslint-disable-next-line max-len
|
|
1090
|
-
|
|
1137
|
+
SELECT + // eslint-disable-next-line max-len
|
|
1138
|
+
` t.name tn,c.name cn FROM ${PRAGMA_TABLE}list()t,${PRAGMA_TABLE}info(t.name)c ${WHERE} t.schema='main'AND t.type IN('table','view')AND t.name IN(${getPlaceholders(managedTableNames)})ORDER BY t.name,c.name`,
|
|
1091
1139
|
managedTableNames,
|
|
1092
1140
|
),
|
|
1093
1141
|
thing,
|
|
@@ -1137,7 +1185,7 @@ const createPowerSyncPersister = (
|
|
|
1137
1185
|
},
|
|
1138
1186
|
onSqlCommand,
|
|
1139
1187
|
onIgnoredError,
|
|
1140
|
-
|
|
1188
|
+
noop,
|
|
1141
1189
|
1,
|
|
1142
1190
|
// StoreOnly,
|
|
1143
1191
|
powerSync,
|
|
@@ -1168,11 +1216,11 @@ const viewUpsert = async (
|
|
|
1168
1216
|
const unchangingData = objNew(
|
|
1169
1217
|
arrayMap(
|
|
1170
1218
|
await executeCommand(
|
|
1171
|
-
|
|
1219
|
+
SELECT +
|
|
1172
1220
|
escapeColumnNames(rowIdColumnName, ...unchangingColumnNames) +
|
|
1173
|
-
|
|
1221
|
+
FROM +
|
|
1174
1222
|
escapeId(tableName) +
|
|
1175
|
-
|
|
1223
|
+
WHERE +
|
|
1176
1224
|
escapeId(rowIdColumnName) +
|
|
1177
1225
|
'IN(' +
|
|
1178
1226
|
getPlaceholders(ids) +
|
|
@@ -1194,7 +1242,10 @@ const viewUpsert = async (
|
|
|
1194
1242
|
);
|
|
1195
1243
|
}
|
|
1196
1244
|
await executeCommand(
|
|
1197
|
-
|
|
1245
|
+
INSERT +
|
|
1246
|
+
' ' +
|
|
1247
|
+
OR_REPLACE +
|
|
1248
|
+
'INTO' +
|
|
1198
1249
|
escapeId(tableName) +
|
|
1199
1250
|
'(' +
|
|
1200
1251
|
escapeColumnNames(
|