@powersync/op-sqlite 0.9.2 → 0.9.4
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/lib/commonjs/db/OPSQLiteConnection.js +4 -17
- package/lib/commonjs/db/OPSQLiteConnection.js.map +1 -1
- package/lib/commonjs/db/OPSqliteAdapter.js +31 -89
- package/lib/commonjs/db/OPSqliteAdapter.js.map +1 -1
- package/lib/module/db/OPSQLiteConnection.js +5 -18
- package/lib/module/db/OPSQLiteConnection.js.map +1 -1
- package/lib/module/db/OPSqliteAdapter.js +31 -89
- package/lib/module/db/OPSqliteAdapter.js.map +1 -1
- package/lib/typescript/commonjs/src/db/OPSQLiteConnection.d.ts +11 -3
- package/lib/typescript/commonjs/src/db/OPSQLiteConnection.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts +15 -5
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/lib/typescript/module/src/db/OPSQLiteConnection.d.ts +11 -3
- package/lib/typescript/module/src/db/OPSQLiteConnection.d.ts.map +1 -1
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts +15 -5
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/package.json +3 -4
- package/src/db/OPSQLiteConnection.ts +7 -20
- package/src/db/OPSqliteAdapter.ts +36 -99
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.OPSQLiteConnection = void 0;
|
|
7
7
|
var _common = require("@powersync/common");
|
|
8
|
-
class
|
|
8
|
+
class OPSQLiteExecutor extends _common.BaseObserver {
|
|
9
9
|
constructor(options) {
|
|
10
10
|
super();
|
|
11
11
|
this.options = options;
|
|
@@ -75,7 +75,7 @@ class OPSQLiteConnection extends _common.BaseObserver {
|
|
|
75
75
|
async executeRaw(query, params) {
|
|
76
76
|
return await this.DB.executeRaw(query, params);
|
|
77
77
|
}
|
|
78
|
-
async
|
|
78
|
+
async executeNativeBatch(query, params = []) {
|
|
79
79
|
const tuple = [[query, params[0]]];
|
|
80
80
|
params.slice(1).forEach(p => tuple.push([query, p]));
|
|
81
81
|
const result = await this.DB.executeBatch(tuple);
|
|
@@ -83,21 +83,8 @@ class OPSQLiteConnection extends _common.BaseObserver {
|
|
|
83
83
|
rowsAffected: result.rowsAffected ?? 0
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return result.rows ?? [];
|
|
89
|
-
}
|
|
90
|
-
async getOptional(sql, parameters) {
|
|
91
|
-
const result = await this.DB.execute(sql, parameters);
|
|
92
|
-
return result.rows?.[0] ?? null;
|
|
93
|
-
}
|
|
94
|
-
async get(sql, parameters) {
|
|
95
|
-
const result = await this.getOptional(sql, parameters);
|
|
96
|
-
if (!result) {
|
|
97
|
-
throw new Error('Result set is empty');
|
|
98
|
-
}
|
|
99
|
-
return result;
|
|
100
|
-
}
|
|
86
|
+
}
|
|
87
|
+
class OPSQLiteConnection extends (0, _common.DBGetUtilsDefaultMixin)(OPSQLiteExecutor) {
|
|
101
88
|
async refreshSchema() {
|
|
102
89
|
await this.get("PRAGMA table_info('sqlite_master')");
|
|
103
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_common","require","
|
|
1
|
+
{"version":3,"names":["_common","require","OPSQLiteExecutor","BaseObserver","constructor","options","DB","baseDB","updateBuffer","rollbackHook","updateHook","update","addTableUpdate","opType","operation","RowUpdateType","SQLITE_INSERT","SQLITE_DELETE","SQLITE_UPDATE","push","table","rowId","flushUpdates","length","groupedUpdates","reduce","grouping","updateGroup","batchedUpdate","rawUpdates","tables","Object","keys","iterateListeners","l","tablesUpdated","close","execute","query","params","res","insertId","rowsAffected","rows","_array","item","index","executeRaw","executeNativeBatch","tuple","slice","forEach","p","result","executeBatch","OPSQLiteConnection","DBGetUtilsDefaultMixin","refreshSchema","get","exports"],"sourceRoot":"../../../src","sources":["db/OPSQLiteConnection.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.OPSQLiteDBAdapter = void 0;
|
|
7
7
|
var _opSqlite = require("@op-engineering/op-sqlite");
|
|
8
8
|
var _common = require("@powersync/common");
|
|
9
|
-
var _asyncMutex = require("async-mutex");
|
|
10
9
|
var _reactNative = require("react-native");
|
|
11
10
|
var _OPSQLiteConnection = require("./OPSQLiteConnection.js");
|
|
12
11
|
/**
|
|
@@ -14,13 +13,13 @@ var _OPSQLiteConnection = require("./OPSQLiteConnection.js");
|
|
|
14
13
|
*/
|
|
15
14
|
|
|
16
15
|
const READ_CONNECTIONS = 5;
|
|
17
|
-
class
|
|
16
|
+
class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
18
17
|
readQueue = [];
|
|
19
18
|
constructor(options) {
|
|
20
19
|
super();
|
|
21
20
|
this.options = options;
|
|
22
21
|
this.name = this.options.name;
|
|
23
|
-
this.writeMutex = new
|
|
22
|
+
this.writeMutex = new _common.Mutex();
|
|
24
23
|
this.readConnections = null;
|
|
25
24
|
this.writeConnection = null;
|
|
26
25
|
this.abortController = new AbortController();
|
|
@@ -157,94 +156,30 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
157
156
|
}
|
|
158
157
|
async writeLock(fn, options) {
|
|
159
158
|
await this.initialized;
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
159
|
+
const outerSignal = this.abortController.signal;
|
|
160
|
+
let signal;
|
|
161
|
+
let cleanUpInnerSignal;
|
|
162
|
+
if (options?.timeoutMs && !outerSignal.aborted) {
|
|
163
|
+
// This is essentially an AbortSignal.any() polyfill.
|
|
164
|
+
const innerController = new AbortController();
|
|
165
|
+
cleanUpInnerSignal = () => {
|
|
166
|
+
innerController.abort();
|
|
167
|
+
outerSignal.removeEventListener('abort', cleanUpInnerSignal);
|
|
168
|
+
timeout.removeEventListener('abort', cleanUpInnerSignal);
|
|
164
169
|
};
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
resolve(await fn(this.writeConnection));
|
|
173
|
-
}, options);
|
|
174
|
-
// flush updates once a write lock has been released
|
|
175
|
-
this.writeConnection.flushUpdates();
|
|
176
|
-
} catch (ex) {
|
|
177
|
-
reject(ex);
|
|
178
|
-
} finally {
|
|
179
|
-
this.abortController.signal.removeEventListener('abort', abortListener);
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
readTransaction(fn, options) {
|
|
184
|
-
return this.readLock(ctx => this.internalTransaction(ctx, fn));
|
|
185
|
-
}
|
|
186
|
-
writeTransaction(fn, options) {
|
|
187
|
-
return this.writeLock(ctx => this.internalTransaction(ctx, fn));
|
|
188
|
-
}
|
|
189
|
-
getAll(sql, parameters) {
|
|
190
|
-
return this.readLock(ctx => ctx.getAll(sql, parameters));
|
|
191
|
-
}
|
|
192
|
-
getOptional(sql, parameters) {
|
|
193
|
-
return this.readLock(ctx => ctx.getOptional(sql, parameters));
|
|
194
|
-
}
|
|
195
|
-
get(sql, parameters) {
|
|
196
|
-
return this.readLock(ctx => ctx.get(sql, parameters));
|
|
197
|
-
}
|
|
198
|
-
execute(query, params) {
|
|
199
|
-
return this.writeLock(ctx => ctx.execute(query, params));
|
|
200
|
-
}
|
|
201
|
-
executeRaw(query, params) {
|
|
202
|
-
return this.writeLock(ctx => ctx.executeRaw(query, params));
|
|
203
|
-
}
|
|
204
|
-
async executeBatch(query, params = []) {
|
|
205
|
-
return this.writeLock(ctx => ctx.executeBatch(query, params));
|
|
206
|
-
}
|
|
207
|
-
async internalTransaction(connection, fn) {
|
|
208
|
-
let finalized = false;
|
|
209
|
-
const commit = async () => {
|
|
210
|
-
if (finalized) {
|
|
211
|
-
return {
|
|
212
|
-
rowsAffected: 0
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
finalized = true;
|
|
216
|
-
return connection.execute('COMMIT');
|
|
217
|
-
};
|
|
218
|
-
const rollback = async () => {
|
|
219
|
-
if (finalized) {
|
|
220
|
-
return {
|
|
221
|
-
rowsAffected: 0
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
finalized = true;
|
|
225
|
-
return connection.execute('ROLLBACK');
|
|
226
|
-
};
|
|
170
|
+
outerSignal.addEventListener('abort', cleanUpInnerSignal);
|
|
171
|
+
const timeout = (0, _common.timeoutSignal)(options.timeoutMs);
|
|
172
|
+
timeout.addEventListener('abort', cleanUpInnerSignal);
|
|
173
|
+
signal = innerController.signal;
|
|
174
|
+
} else {
|
|
175
|
+
signal = outerSignal;
|
|
176
|
+
}
|
|
227
177
|
try {
|
|
228
|
-
await
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
getAll: (query, params) => connection.getAll(query, params),
|
|
234
|
-
getOptional: (query, params) => connection.getOptional(query, params),
|
|
235
|
-
commit,
|
|
236
|
-
rollback
|
|
237
|
-
});
|
|
238
|
-
await commit();
|
|
239
|
-
return result;
|
|
240
|
-
} catch (ex) {
|
|
241
|
-
try {
|
|
242
|
-
await rollback();
|
|
243
|
-
} catch (ex2) {
|
|
244
|
-
// In rare cases, a rollback may fail.
|
|
245
|
-
// Safe to ignore.
|
|
246
|
-
}
|
|
247
|
-
throw ex;
|
|
178
|
+
return await this.writeMutex.runExclusive(() => fn(this.writeConnection), signal);
|
|
179
|
+
} finally {
|
|
180
|
+
// flush updates once a write lock has been released
|
|
181
|
+
this.writeConnection.flushUpdates();
|
|
182
|
+
cleanUpInnerSignal?.();
|
|
248
183
|
}
|
|
249
184
|
}
|
|
250
185
|
async refreshSchema() {
|
|
@@ -257,5 +192,12 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
257
192
|
}
|
|
258
193
|
}
|
|
259
194
|
}
|
|
195
|
+
class OPSQLiteDBAdapter extends (0, _common.DBAdapterDefaultMixin)(OPSQLiteConnectionPool) {
|
|
196
|
+
async executeBatch(query, params = []) {
|
|
197
|
+
return await this.writeLock(async tx => {
|
|
198
|
+
return await tx.executeNativeBatch(query, params);
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
260
202
|
exports.OPSQLiteDBAdapter = OPSQLiteDBAdapter;
|
|
261
203
|
//# sourceMappingURL=OPSqliteAdapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_opSqlite","require","_common","
|
|
1
|
+
{"version":3,"names":["_opSqlite","require","_common","_reactNative","_OPSQLiteConnection","READ_CONNECTIONS","OPSQLiteConnectionPool","BaseObserver","readQueue","constructor","options","name","writeMutex","Mutex","readConnections","writeConnection","abortController","AbortController","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","cacheSizeKb","temporaryStorage","sqliteOptions","dbFilename","openConnection","baseStatements","writeConnectionStatements","readConnectionStatements","statement","tries","execute","e","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","i","conn","push","busy","connection","filenameOverride","DB","openDatabase","encryptionKey","undefined","loadAdditionalExtensions","loadPowerSyncExtension","OPSQLiteConnection","baseDB","openOptions","dbLocation","location","open","extensions","length","extension","loadExtension","path","entryPoint","Platform","OS","libPath","getDylibPath","close","abort","forEach","c","readLock","fn","Promise","resolve","reject","availableConnection","find","error","processQueue","next","shift","writeLock","outerSignal","signal","cleanUpInnerSignal","timeoutMs","aborted","innerController","removeEventListener","timeout","addEventListener","timeoutSignal","runExclusive","flushUpdates","refreshSchema","readConnection","OPSQLiteDBAdapter","DBAdapterDefaultMixin","executeBatch","query","params","tx","executeNativeBatch","exports"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { BaseObserver, RowUpdateType } from '@powersync/common';
|
|
4
|
-
|
|
3
|
+
import { BaseObserver, DBGetUtilsDefaultMixin, RowUpdateType } from '@powersync/common';
|
|
4
|
+
class OPSQLiteExecutor extends BaseObserver {
|
|
5
5
|
constructor(options) {
|
|
6
6
|
super();
|
|
7
7
|
this.options = options;
|
|
@@ -71,7 +71,7 @@ export class OPSQLiteConnection extends BaseObserver {
|
|
|
71
71
|
async executeRaw(query, params) {
|
|
72
72
|
return await this.DB.executeRaw(query, params);
|
|
73
73
|
}
|
|
74
|
-
async
|
|
74
|
+
async executeNativeBatch(query, params = []) {
|
|
75
75
|
const tuple = [[query, params[0]]];
|
|
76
76
|
params.slice(1).forEach(p => tuple.push([query, p]));
|
|
77
77
|
const result = await this.DB.executeBatch(tuple);
|
|
@@ -79,21 +79,8 @@ export class OPSQLiteConnection extends BaseObserver {
|
|
|
79
79
|
rowsAffected: result.rowsAffected ?? 0
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return result.rows ?? [];
|
|
85
|
-
}
|
|
86
|
-
async getOptional(sql, parameters) {
|
|
87
|
-
const result = await this.DB.execute(sql, parameters);
|
|
88
|
-
return result.rows?.[0] ?? null;
|
|
89
|
-
}
|
|
90
|
-
async get(sql, parameters) {
|
|
91
|
-
const result = await this.getOptional(sql, parameters);
|
|
92
|
-
if (!result) {
|
|
93
|
-
throw new Error('Result set is empty');
|
|
94
|
-
}
|
|
95
|
-
return result;
|
|
96
|
-
}
|
|
82
|
+
}
|
|
83
|
+
export class OPSQLiteConnection extends DBGetUtilsDefaultMixin(OPSQLiteExecutor) {
|
|
97
84
|
async refreshSchema() {
|
|
98
85
|
await this.get("PRAGMA table_info('sqlite_master')");
|
|
99
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseObserver","RowUpdateType","
|
|
1
|
+
{"version":3,"names":["BaseObserver","DBGetUtilsDefaultMixin","RowUpdateType","OPSQLiteExecutor","constructor","options","DB","baseDB","updateBuffer","rollbackHook","updateHook","update","addTableUpdate","opType","operation","SQLITE_INSERT","SQLITE_DELETE","SQLITE_UPDATE","push","table","rowId","flushUpdates","length","groupedUpdates","reduce","grouping","updateGroup","batchedUpdate","rawUpdates","tables","Object","keys","iterateListeners","l","tablesUpdated","close","execute","query","params","res","insertId","rowsAffected","rows","_array","item","index","executeRaw","executeNativeBatch","tuple","slice","forEach","p","result","executeBatch","OPSQLiteConnection","refreshSchema","get"],"sourceRoot":"../../../src","sources":["db/OPSQLiteConnection.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { getDylibPath, open } from '@op-engineering/op-sqlite';
|
|
4
|
-
import { BaseObserver,
|
|
5
|
-
import { Mutex } from 'async-mutex';
|
|
4
|
+
import { BaseObserver, DBAdapterDefaultMixin, Mutex, timeoutSignal } from '@powersync/common';
|
|
6
5
|
import { Platform } from 'react-native';
|
|
7
6
|
import { OPSQLiteConnection } from "./OPSQLiteConnection.js";
|
|
8
7
|
|
|
@@ -11,7 +10,7 @@ import { OPSQLiteConnection } from "./OPSQLiteConnection.js";
|
|
|
11
10
|
*/
|
|
12
11
|
|
|
13
12
|
const READ_CONNECTIONS = 5;
|
|
14
|
-
|
|
13
|
+
class OPSQLiteConnectionPool extends BaseObserver {
|
|
15
14
|
readQueue = [];
|
|
16
15
|
constructor(options) {
|
|
17
16
|
super();
|
|
@@ -154,94 +153,30 @@ export class OPSQLiteDBAdapter extends BaseObserver {
|
|
|
154
153
|
}
|
|
155
154
|
async writeLock(fn, options) {
|
|
156
155
|
await this.initialized;
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
156
|
+
const outerSignal = this.abortController.signal;
|
|
157
|
+
let signal;
|
|
158
|
+
let cleanUpInnerSignal;
|
|
159
|
+
if (options?.timeoutMs && !outerSignal.aborted) {
|
|
160
|
+
// This is essentially an AbortSignal.any() polyfill.
|
|
161
|
+
const innerController = new AbortController();
|
|
162
|
+
cleanUpInnerSignal = () => {
|
|
163
|
+
innerController.abort();
|
|
164
|
+
outerSignal.removeEventListener('abort', cleanUpInnerSignal);
|
|
165
|
+
timeout.removeEventListener('abort', cleanUpInnerSignal);
|
|
161
166
|
};
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
resolve(await fn(this.writeConnection));
|
|
170
|
-
}, options);
|
|
171
|
-
// flush updates once a write lock has been released
|
|
172
|
-
this.writeConnection.flushUpdates();
|
|
173
|
-
} catch (ex) {
|
|
174
|
-
reject(ex);
|
|
175
|
-
} finally {
|
|
176
|
-
this.abortController.signal.removeEventListener('abort', abortListener);
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
readTransaction(fn, options) {
|
|
181
|
-
return this.readLock(ctx => this.internalTransaction(ctx, fn));
|
|
182
|
-
}
|
|
183
|
-
writeTransaction(fn, options) {
|
|
184
|
-
return this.writeLock(ctx => this.internalTransaction(ctx, fn));
|
|
185
|
-
}
|
|
186
|
-
getAll(sql, parameters) {
|
|
187
|
-
return this.readLock(ctx => ctx.getAll(sql, parameters));
|
|
188
|
-
}
|
|
189
|
-
getOptional(sql, parameters) {
|
|
190
|
-
return this.readLock(ctx => ctx.getOptional(sql, parameters));
|
|
191
|
-
}
|
|
192
|
-
get(sql, parameters) {
|
|
193
|
-
return this.readLock(ctx => ctx.get(sql, parameters));
|
|
194
|
-
}
|
|
195
|
-
execute(query, params) {
|
|
196
|
-
return this.writeLock(ctx => ctx.execute(query, params));
|
|
197
|
-
}
|
|
198
|
-
executeRaw(query, params) {
|
|
199
|
-
return this.writeLock(ctx => ctx.executeRaw(query, params));
|
|
200
|
-
}
|
|
201
|
-
async executeBatch(query, params = []) {
|
|
202
|
-
return this.writeLock(ctx => ctx.executeBatch(query, params));
|
|
203
|
-
}
|
|
204
|
-
async internalTransaction(connection, fn) {
|
|
205
|
-
let finalized = false;
|
|
206
|
-
const commit = async () => {
|
|
207
|
-
if (finalized) {
|
|
208
|
-
return {
|
|
209
|
-
rowsAffected: 0
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
finalized = true;
|
|
213
|
-
return connection.execute('COMMIT');
|
|
214
|
-
};
|
|
215
|
-
const rollback = async () => {
|
|
216
|
-
if (finalized) {
|
|
217
|
-
return {
|
|
218
|
-
rowsAffected: 0
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
finalized = true;
|
|
222
|
-
return connection.execute('ROLLBACK');
|
|
223
|
-
};
|
|
167
|
+
outerSignal.addEventListener('abort', cleanUpInnerSignal);
|
|
168
|
+
const timeout = timeoutSignal(options.timeoutMs);
|
|
169
|
+
timeout.addEventListener('abort', cleanUpInnerSignal);
|
|
170
|
+
signal = innerController.signal;
|
|
171
|
+
} else {
|
|
172
|
+
signal = outerSignal;
|
|
173
|
+
}
|
|
224
174
|
try {
|
|
225
|
-
await
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
getAll: (query, params) => connection.getAll(query, params),
|
|
231
|
-
getOptional: (query, params) => connection.getOptional(query, params),
|
|
232
|
-
commit,
|
|
233
|
-
rollback
|
|
234
|
-
});
|
|
235
|
-
await commit();
|
|
236
|
-
return result;
|
|
237
|
-
} catch (ex) {
|
|
238
|
-
try {
|
|
239
|
-
await rollback();
|
|
240
|
-
} catch (ex2) {
|
|
241
|
-
// In rare cases, a rollback may fail.
|
|
242
|
-
// Safe to ignore.
|
|
243
|
-
}
|
|
244
|
-
throw ex;
|
|
175
|
+
return await this.writeMutex.runExclusive(() => fn(this.writeConnection), signal);
|
|
176
|
+
} finally {
|
|
177
|
+
// flush updates once a write lock has been released
|
|
178
|
+
this.writeConnection.flushUpdates();
|
|
179
|
+
cleanUpInnerSignal?.();
|
|
245
180
|
}
|
|
246
181
|
}
|
|
247
182
|
async refreshSchema() {
|
|
@@ -254,4 +189,11 @@ export class OPSQLiteDBAdapter extends BaseObserver {
|
|
|
254
189
|
}
|
|
255
190
|
}
|
|
256
191
|
}
|
|
192
|
+
export class OPSQLiteDBAdapter extends DBAdapterDefaultMixin(OPSQLiteConnectionPool) {
|
|
193
|
+
async executeBatch(query, params = []) {
|
|
194
|
+
return await this.writeLock(async tx => {
|
|
195
|
+
return await tx.executeNativeBatch(query, params);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
257
199
|
//# sourceMappingURL=OPSqliteAdapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getDylibPath","open","BaseObserver","
|
|
1
|
+
{"version":3,"names":["getDylibPath","open","BaseObserver","DBAdapterDefaultMixin","Mutex","timeoutSignal","Platform","OPSQLiteConnection","READ_CONNECTIONS","OPSQLiteConnectionPool","readQueue","constructor","options","name","writeMutex","readConnections","writeConnection","abortController","AbortController","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","cacheSizeKb","temporaryStorage","sqliteOptions","dbFilename","openConnection","baseStatements","writeConnectionStatements","readConnectionStatements","statement","tries","execute","e","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","i","conn","push","busy","connection","filenameOverride","DB","openDatabase","encryptionKey","undefined","loadAdditionalExtensions","loadPowerSyncExtension","baseDB","openOptions","dbLocation","location","extensions","length","extension","loadExtension","path","entryPoint","OS","libPath","close","abort","forEach","c","readLock","fn","Promise","resolve","reject","availableConnection","find","error","processQueue","next","shift","writeLock","outerSignal","signal","cleanUpInnerSignal","timeoutMs","aborted","innerController","removeEventListener","timeout","addEventListener","runExclusive","flushUpdates","refreshSchema","readConnection","OPSQLiteDBAdapter","executeBatch","query","params","tx","executeNativeBatch"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DB, UpdateHookOperation } from '@op-engineering/op-sqlite';
|
|
2
|
-
import { BaseObserver, DBAdapterListener, QueryResult } from '@powersync/common';
|
|
2
|
+
import { BaseObserver, DBAdapterListener, LockContext, QueryResult, SqlExecutor } from '@powersync/common';
|
|
3
3
|
export type OPSQLiteConnectionOptions = {
|
|
4
4
|
baseDB: DB;
|
|
5
5
|
};
|
|
@@ -9,7 +9,7 @@ export type OPSQLiteUpdateNotification = {
|
|
|
9
9
|
row?: any;
|
|
10
10
|
rowId: number;
|
|
11
11
|
};
|
|
12
|
-
|
|
12
|
+
declare class OPSQLiteExecutor extends BaseObserver<DBAdapterListener> implements Omit<SqlExecutor, 'executeBatch'> {
|
|
13
13
|
protected options: OPSQLiteConnectionOptions;
|
|
14
14
|
protected DB: DB;
|
|
15
15
|
private updateBuffer;
|
|
@@ -19,10 +19,18 @@ export declare class OPSQLiteConnection extends BaseObserver<DBAdapterListener>
|
|
|
19
19
|
close(): void;
|
|
20
20
|
execute(query: string, params?: any[]): Promise<QueryResult>;
|
|
21
21
|
executeRaw(query: string, params?: any[]): Promise<any[][]>;
|
|
22
|
-
|
|
22
|
+
executeNativeBatch(query: string, params?: any[][]): Promise<QueryResult>;
|
|
23
|
+
}
|
|
24
|
+
declare const OPSQLiteConnection_base: (new (...args: any[]) => {
|
|
23
25
|
getAll<T>(sql: string, parameters?: any[]): Promise<T[]>;
|
|
24
26
|
getOptional<T>(sql: string, parameters?: any[]): Promise<T | null>;
|
|
25
27
|
get<T>(sql: string, parameters?: any[]): Promise<T>;
|
|
28
|
+
executeBatch(query: string, params?: any[][]): Promise<QueryResult>;
|
|
29
|
+
execute: (query: string, params?: any[] | undefined) => Promise<QueryResult>;
|
|
30
|
+
executeRaw: (query: string, params?: any[] | undefined) => Promise<any[][]>;
|
|
31
|
+
}) & typeof OPSQLiteExecutor;
|
|
32
|
+
export declare class OPSQLiteConnection extends OPSQLiteConnection_base implements LockContext {
|
|
26
33
|
refreshSchema(): Promise<void>;
|
|
27
34
|
}
|
|
35
|
+
export {};
|
|
28
36
|
//# sourceMappingURL=OPSQLiteConnection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OPSQLiteConnection.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSQLiteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EACL,YAAY,EAEZ,iBAAiB,
|
|
1
|
+
{"version":3,"file":"OPSQLiteConnection.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSQLiteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EACL,YAAY,EAEZ,iBAAiB,EAEjB,WAAW,EACX,WAAW,EAEX,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,mBAAmB,CAAC;IAC/B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,cAAM,gBAAiB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;IAI7F,SAAS,CAAC,OAAO,EAAE,yBAAyB;IAHxD,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACjB,OAAO,CAAC,YAAY,CAAuB;gBAErB,OAAO,EAAE,yBAAyB;IAcxD,cAAc,CAAC,MAAM,EAAE,0BAA0B;IAqBjD,YAAY;IAsBZ,KAAK;IAIC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAa5D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAI3D,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CASpF;;qCAOM,CAAC;0CAAsE,CAAC;kCAAmE,CAAC;sCAAgE,CAAC;mCAAyE,CAAC;sCAAwF,CAAC;;AALvX,qBAAa,kBAAmB,SAAQ,uBAAyC,YAAW,WAAW;IAC/F,aAAa;CAGpB"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { BaseObserver, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction } from '@powersync/common';
|
|
2
|
-
import { Mutex } from 'async-mutex';
|
|
1
|
+
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Mutex } from '@powersync/common';
|
|
3
2
|
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
4
3
|
import { SqliteOptions } from './SqliteOptions';
|
|
5
4
|
/**
|
|
@@ -10,7 +9,7 @@ export type OPSQLiteAdapterOptions = {
|
|
|
10
9
|
dbLocation?: string;
|
|
11
10
|
sqliteOptions?: SqliteOptions;
|
|
12
11
|
};
|
|
13
|
-
|
|
12
|
+
declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
|
|
14
13
|
protected options: OPSQLiteAdapterOptions;
|
|
15
14
|
name: string;
|
|
16
15
|
protected writeMutex: Mutex;
|
|
@@ -32,6 +31,9 @@ export declare class OPSQLiteDBAdapter extends BaseObserver<DBAdapterListener> i
|
|
|
32
31
|
readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
33
32
|
private processQueue;
|
|
34
33
|
writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
34
|
+
refreshSchema(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
declare const OPSQLiteDBAdapter_base: (new (...args: any[]) => {
|
|
35
37
|
readTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
36
38
|
writeTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
37
39
|
getAll<T>(sql: string, parameters?: any[]): Promise<T[]>;
|
|
@@ -40,7 +42,15 @@ export declare class OPSQLiteDBAdapter extends BaseObserver<DBAdapterListener> i
|
|
|
40
42
|
execute(query: string, params?: any[]): Promise<QueryResult>;
|
|
41
43
|
executeRaw(query: string, params?: any[]): Promise<any[][]>;
|
|
42
44
|
executeBatch(query: string, params?: any[][]): Promise<QueryResult>;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
name: string;
|
|
46
|
+
close: () => void | Promise<void>;
|
|
47
|
+
readLock: <T>(fn: (tx: import("@powersync/common").LockContext) => Promise<T>, options?: DBLockOptions) => Promise<T>;
|
|
48
|
+
writeLock: <T>(fn: (tx: import("@powersync/common").LockContext) => Promise<T>, options?: DBLockOptions) => Promise<T>;
|
|
49
|
+
refreshSchema: () => Promise<void>;
|
|
50
|
+
registerListener(listener: Partial<DBAdapterListener>): () => void;
|
|
51
|
+
}) & typeof OPSQLiteConnectionPool;
|
|
52
|
+
export declare class OPSQLiteDBAdapter extends OPSQLiteDBAdapter_base implements DBAdapter {
|
|
53
|
+
executeBatch(query: string, params?: any[][]): Promise<QueryResult>;
|
|
45
54
|
}
|
|
55
|
+
export {};
|
|
46
56
|
//# sourceMappingURL=OPSqliteAdapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,SAAS,
|
|
1
|
+
{"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EAET,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EACX,KAAK,EAEN,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAIF,cAAM,sBAAuB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,cAAc;IAahF,SAAS,CAAC,OAAO,EAAE,sBAAsB;IAZrD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC;IAE5B,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,kBAAkB,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAE3F,SAAS,CAAC,eAAe,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAErD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,eAAe,CAAkB;gBAEnB,OAAO,EAAE,sBAAsB;cAWrC,IAAI;cAoDJ,cAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAetF,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,wBAAwB;YAQlB,sBAAsB;IAS9B,KAAK;IAUL,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;YA6BpF,YAAY;IASpB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAkC7F,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAUrC;;mEA5CuD,CAAC;oEAG/B,CAAC;qCAEX,CAAC;0CAEe,CAAC;kCACa,CAAC;iCACD,CAAC;oCAEhB,CAAC;sCACqC,CAAC;;;0FAKhD,CAAC;2FAGjB,CAAD;;;;AA0BL,qBAAa,iBAAkB,SAAQ,sBAA8C,YAAW,SAAS;IACjG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CAK9E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DB, UpdateHookOperation } from '@op-engineering/op-sqlite';
|
|
2
|
-
import { BaseObserver, DBAdapterListener, QueryResult } from '@powersync/common';
|
|
2
|
+
import { BaseObserver, DBAdapterListener, LockContext, QueryResult, SqlExecutor } from '@powersync/common';
|
|
3
3
|
export type OPSQLiteConnectionOptions = {
|
|
4
4
|
baseDB: DB;
|
|
5
5
|
};
|
|
@@ -9,7 +9,7 @@ export type OPSQLiteUpdateNotification = {
|
|
|
9
9
|
row?: any;
|
|
10
10
|
rowId: number;
|
|
11
11
|
};
|
|
12
|
-
|
|
12
|
+
declare class OPSQLiteExecutor extends BaseObserver<DBAdapterListener> implements Omit<SqlExecutor, 'executeBatch'> {
|
|
13
13
|
protected options: OPSQLiteConnectionOptions;
|
|
14
14
|
protected DB: DB;
|
|
15
15
|
private updateBuffer;
|
|
@@ -19,10 +19,18 @@ export declare class OPSQLiteConnection extends BaseObserver<DBAdapterListener>
|
|
|
19
19
|
close(): void;
|
|
20
20
|
execute(query: string, params?: any[]): Promise<QueryResult>;
|
|
21
21
|
executeRaw(query: string, params?: any[]): Promise<any[][]>;
|
|
22
|
-
|
|
22
|
+
executeNativeBatch(query: string, params?: any[][]): Promise<QueryResult>;
|
|
23
|
+
}
|
|
24
|
+
declare const OPSQLiteConnection_base: (new (...args: any[]) => {
|
|
23
25
|
getAll<T>(sql: string, parameters?: any[]): Promise<T[]>;
|
|
24
26
|
getOptional<T>(sql: string, parameters?: any[]): Promise<T | null>;
|
|
25
27
|
get<T>(sql: string, parameters?: any[]): Promise<T>;
|
|
28
|
+
executeBatch(query: string, params?: any[][]): Promise<QueryResult>;
|
|
29
|
+
execute: (query: string, params?: any[] | undefined) => Promise<QueryResult>;
|
|
30
|
+
executeRaw: (query: string, params?: any[] | undefined) => Promise<any[][]>;
|
|
31
|
+
}) & typeof OPSQLiteExecutor;
|
|
32
|
+
export declare class OPSQLiteConnection extends OPSQLiteConnection_base implements LockContext {
|
|
26
33
|
refreshSchema(): Promise<void>;
|
|
27
34
|
}
|
|
35
|
+
export {};
|
|
28
36
|
//# sourceMappingURL=OPSQLiteConnection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OPSQLiteConnection.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSQLiteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EACL,YAAY,EAEZ,iBAAiB,
|
|
1
|
+
{"version":3,"file":"OPSQLiteConnection.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSQLiteConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EACL,YAAY,EAEZ,iBAAiB,EAEjB,WAAW,EACX,WAAW,EAEX,WAAW,EAEZ,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,mBAAmB,CAAC;IAC/B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,cAAM,gBAAiB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC;IAI7F,SAAS,CAAC,OAAO,EAAE,yBAAyB;IAHxD,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;IACjB,OAAO,CAAC,YAAY,CAAuB;gBAErB,OAAO,EAAE,yBAAyB;IAcxD,cAAc,CAAC,MAAM,EAAE,0BAA0B;IAqBjD,YAAY;IAsBZ,KAAK;IAIC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAa5D,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;IAI3D,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CASpF;;qCAOM,CAAC;0CAAsE,CAAC;kCAAmE,CAAC;sCAAgE,CAAC;mCAAyE,CAAC;sCAAwF,CAAC;;AALvX,qBAAa,kBAAmB,SAAQ,uBAAyC,YAAW,WAAW;IAC/F,aAAa;CAGpB"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { BaseObserver, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction } from '@powersync/common';
|
|
2
|
-
import { Mutex } from 'async-mutex';
|
|
1
|
+
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Mutex } from '@powersync/common';
|
|
3
2
|
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
4
3
|
import { SqliteOptions } from './SqliteOptions';
|
|
5
4
|
/**
|
|
@@ -10,7 +9,7 @@ export type OPSQLiteAdapterOptions = {
|
|
|
10
9
|
dbLocation?: string;
|
|
11
10
|
sqliteOptions?: SqliteOptions;
|
|
12
11
|
};
|
|
13
|
-
|
|
12
|
+
declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
|
|
14
13
|
protected options: OPSQLiteAdapterOptions;
|
|
15
14
|
name: string;
|
|
16
15
|
protected writeMutex: Mutex;
|
|
@@ -32,6 +31,9 @@ export declare class OPSQLiteDBAdapter extends BaseObserver<DBAdapterListener> i
|
|
|
32
31
|
readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
33
32
|
private processQueue;
|
|
34
33
|
writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
34
|
+
refreshSchema(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
declare const OPSQLiteDBAdapter_base: (new (...args: any[]) => {
|
|
35
37
|
readTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
36
38
|
writeTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
37
39
|
getAll<T>(sql: string, parameters?: any[]): Promise<T[]>;
|
|
@@ -40,7 +42,15 @@ export declare class OPSQLiteDBAdapter extends BaseObserver<DBAdapterListener> i
|
|
|
40
42
|
execute(query: string, params?: any[]): Promise<QueryResult>;
|
|
41
43
|
executeRaw(query: string, params?: any[]): Promise<any[][]>;
|
|
42
44
|
executeBatch(query: string, params?: any[][]): Promise<QueryResult>;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
+
name: string;
|
|
46
|
+
close: () => void | Promise<void>;
|
|
47
|
+
readLock: <T>(fn: (tx: import("@powersync/common").LockContext) => Promise<T>, options?: DBLockOptions) => Promise<T>;
|
|
48
|
+
writeLock: <T>(fn: (tx: import("@powersync/common").LockContext) => Promise<T>, options?: DBLockOptions) => Promise<T>;
|
|
49
|
+
refreshSchema: () => Promise<void>;
|
|
50
|
+
registerListener(listener: Partial<DBAdapterListener>): () => void;
|
|
51
|
+
}) & typeof OPSQLiteConnectionPool;
|
|
52
|
+
export declare class OPSQLiteDBAdapter extends OPSQLiteDBAdapter_base implements DBAdapter {
|
|
53
|
+
executeBatch(query: string, params?: any[][]): Promise<QueryResult>;
|
|
45
54
|
}
|
|
55
|
+
export {};
|
|
46
56
|
//# sourceMappingURL=OPSqliteAdapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,SAAS,
|
|
1
|
+
{"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,SAAS,EAET,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,WAAW,EACX,KAAK,EAEN,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,CAAC;AAIF,cAAM,sBAAuB,SAAQ,YAAY,CAAC,iBAAiB,CAAE,YAAW,cAAc;IAahF,SAAS,CAAC,OAAO,EAAE,sBAAsB;IAZrD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC;IAE5B,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,SAAS,CAAC,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,kBAAkB,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAE3F,SAAS,CAAC,eAAe,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAErD,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,eAAe,CAAkB;gBAEnB,OAAO,EAAE,sBAAsB;cAWrC,IAAI;cAoDJ,cAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAetF,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,wBAAwB;YAQlB,sBAAsB;IAS9B,KAAK;IAUL,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;YA6BpF,YAAY;IASpB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC;IAkC7F,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAUrC;;mEA5CuD,CAAC;oEAG/B,CAAC;qCAEX,CAAC;0CAEe,CAAC;kCACa,CAAC;iCACD,CAAC;oCAEhB,CAAC;sCACqC,CAAC;;;0FAKhD,CAAC;2FAGjB,CAAD;;;;AA0BL,qBAAa,iBAAkB,SAAQ,sBAA8C,YAAW,SAAS;IACjG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,GAAG,EAAE,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC;CAK9E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/op-sqlite",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"description": "PowerSync - sync Postgres or MongoDB with SQLite in your React Native app for offline-first and real-time data",
|
|
5
5
|
"source": "./src/index.ts",
|
|
6
6
|
"main": "./lib/commonjs/index.js",
|
|
@@ -59,13 +59,12 @@
|
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
61
|
"@op-engineering/op-sqlite": "^13.0.0 || ^14.0.0 || ^15.0.0",
|
|
62
|
-
"@powersync/common": "^1.
|
|
62
|
+
"@powersync/common": "^1.50.0",
|
|
63
63
|
"react": "*",
|
|
64
64
|
"react-native": "*"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"
|
|
68
|
-
"@powersync/common": "1.48.0"
|
|
67
|
+
"@powersync/common": "1.50.0"
|
|
69
68
|
},
|
|
70
69
|
"devDependencies": {
|
|
71
70
|
"@op-engineering/op-sqlite": "^15.2.2",
|
|
@@ -3,8 +3,11 @@ import {
|
|
|
3
3
|
BaseObserver,
|
|
4
4
|
BatchedUpdateNotification,
|
|
5
5
|
DBAdapterListener,
|
|
6
|
+
DBGetUtilsDefaultMixin,
|
|
7
|
+
LockContext,
|
|
6
8
|
QueryResult,
|
|
7
9
|
RowUpdateType,
|
|
10
|
+
SqlExecutor,
|
|
8
11
|
UpdateNotification
|
|
9
12
|
} from '@powersync/common';
|
|
10
13
|
|
|
@@ -19,7 +22,7 @@ export type OPSQLiteUpdateNotification = {
|
|
|
19
22
|
rowId: number;
|
|
20
23
|
};
|
|
21
24
|
|
|
22
|
-
|
|
25
|
+
class OPSQLiteExecutor extends BaseObserver<DBAdapterListener> implements Omit<SqlExecutor, 'executeBatch'> {
|
|
23
26
|
protected DB: DB;
|
|
24
27
|
private updateBuffer: UpdateNotification[];
|
|
25
28
|
|
|
@@ -101,7 +104,7 @@ export class OPSQLiteConnection extends BaseObserver<DBAdapterListener> {
|
|
|
101
104
|
return await this.DB.executeRaw(query, params);
|
|
102
105
|
}
|
|
103
106
|
|
|
104
|
-
async
|
|
107
|
+
async executeNativeBatch(query: string, params: any[][] = []): Promise<QueryResult> {
|
|
105
108
|
const tuple: SQLBatchTuple[] = [[query, params[0]]];
|
|
106
109
|
params.slice(1).forEach((p) => tuple.push([query, p]));
|
|
107
110
|
|
|
@@ -110,25 +113,9 @@ export class OPSQLiteConnection extends BaseObserver<DBAdapterListener> {
|
|
|
110
113
|
rowsAffected: result.rowsAffected ?? 0
|
|
111
114
|
};
|
|
112
115
|
}
|
|
116
|
+
}
|
|
113
117
|
|
|
114
|
-
|
|
115
|
-
const result = await this.DB.execute(sql, parameters);
|
|
116
|
-
return (result.rows ?? []) as T[];
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
async getOptional<T>(sql: string, parameters?: any[]): Promise<T | null> {
|
|
120
|
-
const result = await this.DB.execute(sql, parameters);
|
|
121
|
-
return (result.rows?.[0] as T) ?? null;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
async get<T>(sql: string, parameters?: any[]): Promise<T> {
|
|
125
|
-
const result = await this.getOptional(sql, parameters);
|
|
126
|
-
if (!result) {
|
|
127
|
-
throw new Error('Result set is empty');
|
|
128
|
-
}
|
|
129
|
-
return result as T;
|
|
130
|
-
}
|
|
131
|
-
|
|
118
|
+
export class OPSQLiteConnection extends DBGetUtilsDefaultMixin(OPSQLiteExecutor) implements LockContext {
|
|
132
119
|
async refreshSchema() {
|
|
133
120
|
await this.get("PRAGMA table_info('sqlite_master')");
|
|
134
121
|
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { getDylibPath, open, type DB } from '@op-engineering/op-sqlite';
|
|
2
2
|
import {
|
|
3
3
|
BaseObserver,
|
|
4
|
+
ConnectionPool,
|
|
4
5
|
DBAdapter,
|
|
6
|
+
DBAdapterDefaultMixin,
|
|
5
7
|
DBAdapterListener,
|
|
6
8
|
DBLockOptions,
|
|
7
9
|
QueryResult,
|
|
8
10
|
Transaction,
|
|
9
|
-
|
|
11
|
+
Mutex,
|
|
12
|
+
timeoutSignal
|
|
10
13
|
} from '@powersync/common';
|
|
11
|
-
import { Mutex } from 'async-mutex';
|
|
12
14
|
import { Platform } from 'react-native';
|
|
13
15
|
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
14
16
|
import { SqliteOptions } from './SqliteOptions';
|
|
@@ -24,7 +26,7 @@ export type OPSQLiteAdapterOptions = {
|
|
|
24
26
|
|
|
25
27
|
const READ_CONNECTIONS = 5;
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
|
|
28
30
|
name: string;
|
|
29
31
|
protected writeMutex: Mutex;
|
|
30
32
|
|
|
@@ -200,107 +202,34 @@ export class OPSQLiteDBAdapter extends BaseObserver<DBAdapterListener> implement
|
|
|
200
202
|
async writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
201
203
|
await this.initialized;
|
|
202
204
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
205
|
+
const outerSignal = this.abortController.signal;
|
|
206
|
+
let signal: AbortSignal;
|
|
207
|
+
let cleanUpInnerSignal: (() => void) | undefined;
|
|
208
|
+
|
|
209
|
+
if (options?.timeoutMs && !outerSignal.aborted) {
|
|
210
|
+
// This is essentially an AbortSignal.any() polyfill.
|
|
211
|
+
const innerController = new AbortController();
|
|
212
|
+
cleanUpInnerSignal = () => {
|
|
213
|
+
innerController.abort();
|
|
214
|
+
outerSignal.removeEventListener('abort', cleanUpInnerSignal!);
|
|
215
|
+
timeout.removeEventListener('abort', cleanUpInnerSignal!);
|
|
207
216
|
};
|
|
208
|
-
this.abortController.signal.addEventListener('abort', abortListener);
|
|
209
|
-
|
|
210
|
-
try {
|
|
211
|
-
await mutexRunExclusive(
|
|
212
|
-
this.writeMutex,
|
|
213
|
-
async () => {
|
|
214
|
-
// Check if operation was aborted before executing
|
|
215
|
-
if (this.abortController.signal.aborted) {
|
|
216
|
-
reject(new Error('Database connection was closed'));
|
|
217
|
-
}
|
|
218
|
-
resolve(await fn(this.writeConnection!));
|
|
219
|
-
},
|
|
220
|
-
options
|
|
221
|
-
);
|
|
222
|
-
// flush updates once a write lock has been released
|
|
223
|
-
this.writeConnection!.flushUpdates();
|
|
224
|
-
} catch (ex) {
|
|
225
|
-
reject(ex);
|
|
226
|
-
} finally {
|
|
227
|
-
this.abortController.signal.removeEventListener('abort', abortListener);
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
readTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
233
|
-
return this.readLock((ctx) => this.internalTransaction(ctx, fn));
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
writeTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
237
|
-
return this.writeLock((ctx) => this.internalTransaction(ctx, fn));
|
|
238
|
-
}
|
|
239
217
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
getOptional<T>(sql: string, parameters?: any[]): Promise<T | null> {
|
|
245
|
-
return this.readLock((ctx) => ctx.getOptional(sql, parameters));
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
get<T>(sql: string, parameters?: any[]): Promise<T> {
|
|
249
|
-
return this.readLock((ctx) => ctx.get(sql, parameters));
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
execute(query: string, params?: any[]) {
|
|
253
|
-
return this.writeLock((ctx) => ctx.execute(query, params));
|
|
254
|
-
}
|
|
218
|
+
outerSignal.addEventListener('abort', cleanUpInnerSignal);
|
|
219
|
+
const timeout = timeoutSignal(options.timeoutMs);
|
|
220
|
+
timeout.addEventListener('abort', cleanUpInnerSignal);
|
|
255
221
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
async executeBatch(query: string, params: any[][] = []): Promise<QueryResult> {
|
|
261
|
-
return this.writeLock((ctx) => ctx.executeBatch(query, params));
|
|
262
|
-
}
|
|
222
|
+
signal = innerController.signal;
|
|
223
|
+
} else {
|
|
224
|
+
signal = outerSignal;
|
|
225
|
+
}
|
|
263
226
|
|
|
264
|
-
protected async internalTransaction<T>(
|
|
265
|
-
connection: OPSQLiteConnection,
|
|
266
|
-
fn: (tx: Transaction) => Promise<T>
|
|
267
|
-
): Promise<T> {
|
|
268
|
-
let finalized = false;
|
|
269
|
-
const commit = async (): Promise<QueryResult> => {
|
|
270
|
-
if (finalized) {
|
|
271
|
-
return { rowsAffected: 0 };
|
|
272
|
-
}
|
|
273
|
-
finalized = true;
|
|
274
|
-
return connection.execute('COMMIT');
|
|
275
|
-
};
|
|
276
|
-
const rollback = async (): Promise<QueryResult> => {
|
|
277
|
-
if (finalized) {
|
|
278
|
-
return { rowsAffected: 0 };
|
|
279
|
-
}
|
|
280
|
-
finalized = true;
|
|
281
|
-
return connection.execute('ROLLBACK');
|
|
282
|
-
};
|
|
283
227
|
try {
|
|
284
|
-
await
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
getAll: (query, params) => connection.getAll(query, params),
|
|
290
|
-
getOptional: (query, params) => connection.getOptional(query, params),
|
|
291
|
-
commit,
|
|
292
|
-
rollback
|
|
293
|
-
});
|
|
294
|
-
await commit();
|
|
295
|
-
return result;
|
|
296
|
-
} catch (ex) {
|
|
297
|
-
try {
|
|
298
|
-
await rollback();
|
|
299
|
-
} catch (ex2) {
|
|
300
|
-
// In rare cases, a rollback may fail.
|
|
301
|
-
// Safe to ignore.
|
|
302
|
-
}
|
|
303
|
-
throw ex;
|
|
228
|
+
return await this.writeMutex.runExclusive(() => fn(this.writeConnection!), signal);
|
|
229
|
+
} finally {
|
|
230
|
+
// flush updates once a write lock has been released
|
|
231
|
+
this.writeConnection!.flushUpdates();
|
|
232
|
+
cleanUpInnerSignal?.();
|
|
304
233
|
}
|
|
305
234
|
}
|
|
306
235
|
|
|
@@ -315,3 +244,11 @@ export class OPSQLiteDBAdapter extends BaseObserver<DBAdapterListener> implement
|
|
|
315
244
|
}
|
|
316
245
|
}
|
|
317
246
|
}
|
|
247
|
+
|
|
248
|
+
export class OPSQLiteDBAdapter extends DBAdapterDefaultMixin(OPSQLiteConnectionPool) implements DBAdapter {
|
|
249
|
+
async executeBatch(query: string, params: any[][] = []): Promise<QueryResult> {
|
|
250
|
+
return await this.writeLock(async (tx) => {
|
|
251
|
+
return await (tx as OPSQLiteConnection).executeNativeBatch(query, params);
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|