@powersync/op-sqlite 0.9.4 → 0.9.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/lib/commonjs/db/OPSqliteAdapter.js +66 -56
- package/lib/commonjs/db/OPSqliteAdapter.js.map +1 -1
- package/lib/module/db/OPSqliteAdapter.js +67 -57
- package/lib/module/db/OPSqliteAdapter.js.map +1 -1
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts +4 -9
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts +4 -9
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/db/OPSqliteAdapter.ts +51 -63
|
@@ -14,12 +14,10 @@ var _OPSQLiteConnection = require("./OPSQLiteConnection.js");
|
|
|
14
14
|
|
|
15
15
|
const READ_CONNECTIONS = 5;
|
|
16
16
|
class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
17
|
-
readQueue = [];
|
|
18
17
|
constructor(options) {
|
|
19
18
|
super();
|
|
20
19
|
this.options = options;
|
|
21
20
|
this.name = this.options.name;
|
|
22
|
-
this.writeMutex = new _common.Mutex();
|
|
23
21
|
this.readConnections = null;
|
|
24
22
|
this.writeConnection = null;
|
|
25
23
|
this.abortController = new AbortController();
|
|
@@ -35,14 +33,14 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
|
35
33
|
temporaryStorage
|
|
36
34
|
} = this.options.sqliteOptions;
|
|
37
35
|
const dbFilename = this.options.name;
|
|
38
|
-
|
|
36
|
+
const underlyingWriteConnection = await this.openConnection(dbFilename);
|
|
39
37
|
const baseStatements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA cache_size = -${cacheSizeKb}`, `PRAGMA temp_store = ${temporaryStorage}`];
|
|
40
38
|
const writeConnectionStatements = [...baseStatements, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
|
|
41
39
|
const readConnectionStatements = [...baseStatements, 'PRAGMA query_only = true'];
|
|
42
40
|
for (const statement of writeConnectionStatements) {
|
|
43
41
|
for (let tries = 0; tries < 30; tries++) {
|
|
44
42
|
try {
|
|
45
|
-
await
|
|
43
|
+
await underlyingWriteConnection.execute(statement);
|
|
46
44
|
break;
|
|
47
45
|
} catch (e) {
|
|
48
46
|
if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
|
|
@@ -55,20 +53,19 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
// Changes should only occur in the write connection
|
|
58
|
-
|
|
56
|
+
underlyingWriteConnection.registerListener({
|
|
59
57
|
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
60
58
|
});
|
|
61
|
-
|
|
59
|
+
const underlyingReadConnections = [];
|
|
62
60
|
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
63
61
|
const conn = await this.openConnection(dbFilename);
|
|
64
62
|
for (let statement of readConnectionStatements) {
|
|
65
63
|
await conn.execute(statement);
|
|
66
64
|
}
|
|
67
|
-
|
|
68
|
-
busy: false,
|
|
69
|
-
connection: conn
|
|
70
|
-
});
|
|
65
|
+
underlyingReadConnections.push(conn);
|
|
71
66
|
}
|
|
67
|
+
this.writeConnection = new _common.Semaphore([underlyingWriteConnection]);
|
|
68
|
+
this.readConnections = new _common.Semaphore(underlyingReadConnections);
|
|
72
69
|
}
|
|
73
70
|
async openConnection(filenameOverride) {
|
|
74
71
|
const dbFilename = filenameOverride ?? this.options.name;
|
|
@@ -115,47 +112,23 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
|
115
112
|
await this.initialized;
|
|
116
113
|
// Abort any pending operations
|
|
117
114
|
this.abortController.abort();
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
try {
|
|
133
|
-
resolve(await fn(availableConnection.connection));
|
|
134
|
-
} catch (error) {
|
|
135
|
-
reject(error);
|
|
136
|
-
} finally {
|
|
137
|
-
availableConnection.busy = false;
|
|
138
|
-
// After query execution, process any queued tasks
|
|
139
|
-
this.processQueue();
|
|
140
|
-
}
|
|
141
|
-
} else {
|
|
142
|
-
// If no available connections, add to the queue
|
|
143
|
-
this.readQueue.push(execute);
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
execute();
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
async processQueue() {
|
|
150
|
-
if (this.readQueue.length > 0) {
|
|
151
|
-
const next = this.readQueue.shift();
|
|
152
|
-
if (next) {
|
|
153
|
-
next();
|
|
154
|
-
}
|
|
115
|
+
const {
|
|
116
|
+
item: writeConnection,
|
|
117
|
+
release: returnWrite
|
|
118
|
+
} = await this.writeConnection.requestOne();
|
|
119
|
+
const {
|
|
120
|
+
items: readers,
|
|
121
|
+
release: returnReaders
|
|
122
|
+
} = await this.readConnections.requestAll();
|
|
123
|
+
try {
|
|
124
|
+
writeConnection.close();
|
|
125
|
+
readers.forEach(c => c.close());
|
|
126
|
+
} finally {
|
|
127
|
+
returnWrite();
|
|
128
|
+
returnReaders();
|
|
155
129
|
}
|
|
156
130
|
}
|
|
157
|
-
|
|
158
|
-
await this.initialized;
|
|
131
|
+
generateNestedAbortSignal(options) {
|
|
159
132
|
const outerSignal = this.abortController.signal;
|
|
160
133
|
let signal;
|
|
161
134
|
let cleanUpInnerSignal;
|
|
@@ -174,21 +147,58 @@ class OPSQLiteConnectionPool extends _common.BaseObserver {
|
|
|
174
147
|
} else {
|
|
175
148
|
signal = outerSignal;
|
|
176
149
|
}
|
|
150
|
+
return {
|
|
151
|
+
signal,
|
|
152
|
+
cleanUpInnerSignal
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
async readLock(fn, options) {
|
|
156
|
+
await this.initialized;
|
|
157
|
+
const {
|
|
158
|
+
signal,
|
|
159
|
+
cleanUpInnerSignal
|
|
160
|
+
} = this.generateNestedAbortSignal(options);
|
|
161
|
+
const {
|
|
162
|
+
item,
|
|
163
|
+
release
|
|
164
|
+
} = await this.readConnections.requestOne(signal);
|
|
165
|
+
try {
|
|
166
|
+
return await fn(item);
|
|
167
|
+
} finally {
|
|
168
|
+
release();
|
|
169
|
+
cleanUpInnerSignal?.();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async writeLock(fn, options) {
|
|
173
|
+
await this.initialized;
|
|
174
|
+
const {
|
|
175
|
+
signal,
|
|
176
|
+
cleanUpInnerSignal
|
|
177
|
+
} = this.generateNestedAbortSignal(options);
|
|
178
|
+
const {
|
|
179
|
+
item,
|
|
180
|
+
release
|
|
181
|
+
} = await this.writeConnection.requestOne(signal);
|
|
177
182
|
try {
|
|
178
|
-
return await
|
|
183
|
+
return await fn(item).finally(() => item.flushUpdates());
|
|
179
184
|
} finally {
|
|
180
|
-
|
|
181
|
-
this.writeConnection.flushUpdates();
|
|
185
|
+
release();
|
|
182
186
|
cleanUpInnerSignal?.();
|
|
183
187
|
}
|
|
184
188
|
}
|
|
185
189
|
async refreshSchema() {
|
|
186
190
|
await this.initialized;
|
|
187
|
-
await this.
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
+
await this.writeLock(l => l.refreshSchema());
|
|
192
|
+
const {
|
|
193
|
+
items,
|
|
194
|
+
release
|
|
195
|
+
} = await this.readConnections.requestAll();
|
|
196
|
+
try {
|
|
197
|
+
for (let readConnection of items) {
|
|
198
|
+
await readConnection.refreshSchema();
|
|
191
199
|
}
|
|
200
|
+
} finally {
|
|
201
|
+
release();
|
|
192
202
|
}
|
|
193
203
|
}
|
|
194
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_opSqlite","require","_common","_reactNative","_OPSQLiteConnection","READ_CONNECTIONS","OPSQLiteConnectionPool","BaseObserver","
|
|
1
|
+
{"version":3,"names":["_opSqlite","require","_common","_reactNative","_OPSQLiteConnection","READ_CONNECTIONS","OPSQLiteConnectionPool","BaseObserver","constructor","options","name","readConnections","writeConnection","abortController","AbortController","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","cacheSizeKb","temporaryStorage","sqliteOptions","dbFilename","underlyingWriteConnection","openConnection","baseStatements","writeConnectionStatements","readConnectionStatements","statement","tries","execute","e","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","underlyingReadConnections","i","conn","push","Semaphore","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","item","release","returnWrite","requestOne","items","readers","returnReaders","requestAll","forEach","c","generateNestedAbortSignal","outerSignal","signal","cleanUpInnerSignal","timeoutMs","aborted","innerController","removeEventListener","timeout","addEventListener","timeoutSignal","readLock","fn","writeLock","finally","flushUpdates","refreshSchema","l","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
3
|
import { getDylibPath, open } from '@op-engineering/op-sqlite';
|
|
4
|
-
import { BaseObserver, DBAdapterDefaultMixin,
|
|
4
|
+
import { BaseObserver, DBAdapterDefaultMixin, timeoutSignal, Semaphore } from '@powersync/common';
|
|
5
5
|
import { Platform } from 'react-native';
|
|
6
6
|
import { OPSQLiteConnection } from "./OPSQLiteConnection.js";
|
|
7
7
|
|
|
@@ -11,12 +11,10 @@ import { OPSQLiteConnection } from "./OPSQLiteConnection.js";
|
|
|
11
11
|
|
|
12
12
|
const READ_CONNECTIONS = 5;
|
|
13
13
|
class OPSQLiteConnectionPool extends BaseObserver {
|
|
14
|
-
readQueue = [];
|
|
15
14
|
constructor(options) {
|
|
16
15
|
super();
|
|
17
16
|
this.options = options;
|
|
18
17
|
this.name = this.options.name;
|
|
19
|
-
this.writeMutex = new Mutex();
|
|
20
18
|
this.readConnections = null;
|
|
21
19
|
this.writeConnection = null;
|
|
22
20
|
this.abortController = new AbortController();
|
|
@@ -32,14 +30,14 @@ class OPSQLiteConnectionPool extends BaseObserver {
|
|
|
32
30
|
temporaryStorage
|
|
33
31
|
} = this.options.sqliteOptions;
|
|
34
32
|
const dbFilename = this.options.name;
|
|
35
|
-
|
|
33
|
+
const underlyingWriteConnection = await this.openConnection(dbFilename);
|
|
36
34
|
const baseStatements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA cache_size = -${cacheSizeKb}`, `PRAGMA temp_store = ${temporaryStorage}`];
|
|
37
35
|
const writeConnectionStatements = [...baseStatements, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
|
|
38
36
|
const readConnectionStatements = [...baseStatements, 'PRAGMA query_only = true'];
|
|
39
37
|
for (const statement of writeConnectionStatements) {
|
|
40
38
|
for (let tries = 0; tries < 30; tries++) {
|
|
41
39
|
try {
|
|
42
|
-
await
|
|
40
|
+
await underlyingWriteConnection.execute(statement);
|
|
43
41
|
break;
|
|
44
42
|
} catch (e) {
|
|
45
43
|
if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
|
|
@@ -52,20 +50,19 @@ class OPSQLiteConnectionPool extends BaseObserver {
|
|
|
52
50
|
}
|
|
53
51
|
|
|
54
52
|
// Changes should only occur in the write connection
|
|
55
|
-
|
|
53
|
+
underlyingWriteConnection.registerListener({
|
|
56
54
|
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
57
55
|
});
|
|
58
|
-
|
|
56
|
+
const underlyingReadConnections = [];
|
|
59
57
|
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
60
58
|
const conn = await this.openConnection(dbFilename);
|
|
61
59
|
for (let statement of readConnectionStatements) {
|
|
62
60
|
await conn.execute(statement);
|
|
63
61
|
}
|
|
64
|
-
|
|
65
|
-
busy: false,
|
|
66
|
-
connection: conn
|
|
67
|
-
});
|
|
62
|
+
underlyingReadConnections.push(conn);
|
|
68
63
|
}
|
|
64
|
+
this.writeConnection = new Semaphore([underlyingWriteConnection]);
|
|
65
|
+
this.readConnections = new Semaphore(underlyingReadConnections);
|
|
69
66
|
}
|
|
70
67
|
async openConnection(filenameOverride) {
|
|
71
68
|
const dbFilename = filenameOverride ?? this.options.name;
|
|
@@ -112,47 +109,23 @@ class OPSQLiteConnectionPool extends BaseObserver {
|
|
|
112
109
|
await this.initialized;
|
|
113
110
|
// Abort any pending operations
|
|
114
111
|
this.abortController.abort();
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
try {
|
|
130
|
-
resolve(await fn(availableConnection.connection));
|
|
131
|
-
} catch (error) {
|
|
132
|
-
reject(error);
|
|
133
|
-
} finally {
|
|
134
|
-
availableConnection.busy = false;
|
|
135
|
-
// After query execution, process any queued tasks
|
|
136
|
-
this.processQueue();
|
|
137
|
-
}
|
|
138
|
-
} else {
|
|
139
|
-
// If no available connections, add to the queue
|
|
140
|
-
this.readQueue.push(execute);
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
execute();
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
async processQueue() {
|
|
147
|
-
if (this.readQueue.length > 0) {
|
|
148
|
-
const next = this.readQueue.shift();
|
|
149
|
-
if (next) {
|
|
150
|
-
next();
|
|
151
|
-
}
|
|
112
|
+
const {
|
|
113
|
+
item: writeConnection,
|
|
114
|
+
release: returnWrite
|
|
115
|
+
} = await this.writeConnection.requestOne();
|
|
116
|
+
const {
|
|
117
|
+
items: readers,
|
|
118
|
+
release: returnReaders
|
|
119
|
+
} = await this.readConnections.requestAll();
|
|
120
|
+
try {
|
|
121
|
+
writeConnection.close();
|
|
122
|
+
readers.forEach(c => c.close());
|
|
123
|
+
} finally {
|
|
124
|
+
returnWrite();
|
|
125
|
+
returnReaders();
|
|
152
126
|
}
|
|
153
127
|
}
|
|
154
|
-
|
|
155
|
-
await this.initialized;
|
|
128
|
+
generateNestedAbortSignal(options) {
|
|
156
129
|
const outerSignal = this.abortController.signal;
|
|
157
130
|
let signal;
|
|
158
131
|
let cleanUpInnerSignal;
|
|
@@ -171,21 +144,58 @@ class OPSQLiteConnectionPool extends BaseObserver {
|
|
|
171
144
|
} else {
|
|
172
145
|
signal = outerSignal;
|
|
173
146
|
}
|
|
147
|
+
return {
|
|
148
|
+
signal,
|
|
149
|
+
cleanUpInnerSignal
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async readLock(fn, options) {
|
|
153
|
+
await this.initialized;
|
|
154
|
+
const {
|
|
155
|
+
signal,
|
|
156
|
+
cleanUpInnerSignal
|
|
157
|
+
} = this.generateNestedAbortSignal(options);
|
|
158
|
+
const {
|
|
159
|
+
item,
|
|
160
|
+
release
|
|
161
|
+
} = await this.readConnections.requestOne(signal);
|
|
162
|
+
try {
|
|
163
|
+
return await fn(item);
|
|
164
|
+
} finally {
|
|
165
|
+
release();
|
|
166
|
+
cleanUpInnerSignal?.();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async writeLock(fn, options) {
|
|
170
|
+
await this.initialized;
|
|
171
|
+
const {
|
|
172
|
+
signal,
|
|
173
|
+
cleanUpInnerSignal
|
|
174
|
+
} = this.generateNestedAbortSignal(options);
|
|
175
|
+
const {
|
|
176
|
+
item,
|
|
177
|
+
release
|
|
178
|
+
} = await this.writeConnection.requestOne(signal);
|
|
174
179
|
try {
|
|
175
|
-
return await
|
|
180
|
+
return await fn(item).finally(() => item.flushUpdates());
|
|
176
181
|
} finally {
|
|
177
|
-
|
|
178
|
-
this.writeConnection.flushUpdates();
|
|
182
|
+
release();
|
|
179
183
|
cleanUpInnerSignal?.();
|
|
180
184
|
}
|
|
181
185
|
}
|
|
182
186
|
async refreshSchema() {
|
|
183
187
|
await this.initialized;
|
|
184
|
-
await this.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
+
await this.writeLock(l => l.refreshSchema());
|
|
189
|
+
const {
|
|
190
|
+
items,
|
|
191
|
+
release
|
|
192
|
+
} = await this.readConnections.requestAll();
|
|
193
|
+
try {
|
|
194
|
+
for (let readConnection of items) {
|
|
195
|
+
await readConnection.refreshSchema();
|
|
188
196
|
}
|
|
197
|
+
} finally {
|
|
198
|
+
release();
|
|
189
199
|
}
|
|
190
200
|
}
|
|
191
201
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getDylibPath","open","BaseObserver","DBAdapterDefaultMixin","
|
|
1
|
+
{"version":3,"names":["getDylibPath","open","BaseObserver","DBAdapterDefaultMixin","timeoutSignal","Semaphore","Platform","OPSQLiteConnection","READ_CONNECTIONS","OPSQLiteConnectionPool","constructor","options","name","readConnections","writeConnection","abortController","AbortController","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","cacheSizeKb","temporaryStorage","sqliteOptions","dbFilename","underlyingWriteConnection","openConnection","baseStatements","writeConnectionStatements","readConnectionStatements","statement","tries","execute","e","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","underlyingReadConnections","i","conn","push","filenameOverride","DB","openDatabase","encryptionKey","undefined","loadAdditionalExtensions","loadPowerSyncExtension","baseDB","openOptions","dbLocation","location","extensions","length","extension","loadExtension","path","entryPoint","OS","libPath","close","abort","item","release","returnWrite","requestOne","items","readers","returnReaders","requestAll","forEach","c","generateNestedAbortSignal","outerSignal","signal","cleanUpInnerSignal","timeoutMs","aborted","innerController","removeEventListener","timeout","addEventListener","readLock","fn","writeLock","finally","flushUpdates","refreshSchema","l","readConnection","OPSQLiteDBAdapter","executeBatch","query","params","tx","executeNativeBatch"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction,
|
|
1
|
+
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Semaphore } from '@powersync/common';
|
|
2
2
|
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
3
3
|
import { SqliteOptions } from './SqliteOptions';
|
|
4
4
|
/**
|
|
@@ -12,14 +12,9 @@ export type OPSQLiteAdapterOptions = {
|
|
|
12
12
|
declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
|
|
13
13
|
protected options: OPSQLiteAdapterOptions;
|
|
14
14
|
name: string;
|
|
15
|
-
protected writeMutex: Mutex;
|
|
16
15
|
protected initialized: Promise<void>;
|
|
17
|
-
protected readConnections:
|
|
18
|
-
|
|
19
|
-
connection: OPSQLiteConnection;
|
|
20
|
-
}> | null;
|
|
21
|
-
protected writeConnection: OPSQLiteConnection | null;
|
|
22
|
-
private readQueue;
|
|
16
|
+
protected readConnections: Semaphore<OPSQLiteConnection> | null;
|
|
17
|
+
protected writeConnection: Semaphore<OPSQLiteConnection> | null;
|
|
23
18
|
private abortController;
|
|
24
19
|
constructor(options: OPSQLiteAdapterOptions);
|
|
25
20
|
protected init(): Promise<void>;
|
|
@@ -28,8 +23,8 @@ declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> imp
|
|
|
28
23
|
private loadAdditionalExtensions;
|
|
29
24
|
private loadPowerSyncExtension;
|
|
30
25
|
close(): Promise<void>;
|
|
26
|
+
private generateNestedAbortSignal;
|
|
31
27
|
readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
32
|
-
private processQueue;
|
|
33
28
|
writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
34
29
|
refreshSchema(): Promise<void>;
|
|
35
30
|
}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,EAEX,SAAS,EACV,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;IAUhF,SAAS,CAAC,OAAO,EAAE,sBAAsB;IATrD,IAAI,EAAE,MAAM,CAAC;IAEb,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;IAChE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;IAEhE,OAAO,CAAC,eAAe,CAAkB;gBAEnB,OAAO,EAAE,sBAAsB;cAUrC,IAAI;cAuDJ,cAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAetF,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,wBAAwB;YAQlB,sBAAsB;IAS9B,KAAK;IAiBX,OAAO,CAAC,yBAAyB;IA0B3B,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;IAa5F,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;IAa7F,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAYrC;;mEAtC2D,CAAC;oEAG9B,CAAC;qCACb,CAAC;0CAEd,CAAH;kCAGK,CAAC;iCAIkB,CAAC;oCAAwE,CAAC;sCAG9D,CAAA;;;0FAGP,CAAC;2FAK/B,CAAF;;;;AAgBA,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,4 +1,4 @@
|
|
|
1
|
-
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction,
|
|
1
|
+
import { BaseObserver, ConnectionPool, DBAdapter, DBAdapterListener, DBLockOptions, QueryResult, Transaction, Semaphore } from '@powersync/common';
|
|
2
2
|
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
3
3
|
import { SqliteOptions } from './SqliteOptions';
|
|
4
4
|
/**
|
|
@@ -12,14 +12,9 @@ export type OPSQLiteAdapterOptions = {
|
|
|
12
12
|
declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
|
|
13
13
|
protected options: OPSQLiteAdapterOptions;
|
|
14
14
|
name: string;
|
|
15
|
-
protected writeMutex: Mutex;
|
|
16
15
|
protected initialized: Promise<void>;
|
|
17
|
-
protected readConnections:
|
|
18
|
-
|
|
19
|
-
connection: OPSQLiteConnection;
|
|
20
|
-
}> | null;
|
|
21
|
-
protected writeConnection: OPSQLiteConnection | null;
|
|
22
|
-
private readQueue;
|
|
16
|
+
protected readConnections: Semaphore<OPSQLiteConnection> | null;
|
|
17
|
+
protected writeConnection: Semaphore<OPSQLiteConnection> | null;
|
|
23
18
|
private abortController;
|
|
24
19
|
constructor(options: OPSQLiteAdapterOptions);
|
|
25
20
|
protected init(): Promise<void>;
|
|
@@ -28,8 +23,8 @@ declare class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> imp
|
|
|
28
23
|
private loadAdditionalExtensions;
|
|
29
24
|
private loadPowerSyncExtension;
|
|
30
25
|
close(): Promise<void>;
|
|
26
|
+
private generateNestedAbortSignal;
|
|
31
27
|
readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
32
|
-
private processQueue;
|
|
33
28
|
writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
34
29
|
refreshSchema(): Promise<void>;
|
|
35
30
|
}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,EAEX,SAAS,EACV,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;IAUhF,SAAS,CAAC,OAAO,EAAE,sBAAsB;IATrD,IAAI,EAAE,MAAM,CAAC;IAEb,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;IAChE,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;IAEhE,OAAO,CAAC,eAAe,CAAkB;gBAEnB,OAAO,EAAE,sBAAsB;cAUrC,IAAI;cAuDJ,cAAc,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAetF,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,wBAAwB;YAQlB,sBAAsB;IAS9B,KAAK;IAiBX,OAAO,CAAC,yBAAyB;IA0B3B,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;IAa5F,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;IAa7F,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAYrC;;mEAtC2D,CAAC;oEAG9B,CAAC;qCACb,CAAC;0CAEd,CAAH;kCAGK,CAAC;iCAIkB,CAAC;oCAAwE,CAAC;sCAG9D,CAAA;;;0FAGP,CAAC;2FAK/B,CAAF;;;;AAgBA,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.5",
|
|
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,12 +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.51.0",
|
|
63
63
|
"react": "*",
|
|
64
64
|
"react-native": "*"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@powersync/common": "1.
|
|
67
|
+
"@powersync/common": "1.51.0"
|
|
68
68
|
},
|
|
69
69
|
"devDependencies": {
|
|
70
70
|
"@op-engineering/op-sqlite": "^15.2.2",
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
DBLockOptions,
|
|
9
9
|
QueryResult,
|
|
10
10
|
Transaction,
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
timeoutSignal,
|
|
12
|
+
Semaphore
|
|
13
13
|
} from '@powersync/common';
|
|
14
14
|
import { Platform } from 'react-native';
|
|
15
15
|
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
@@ -28,22 +28,18 @@ const READ_CONNECTIONS = 5;
|
|
|
28
28
|
|
|
29
29
|
class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
|
|
30
30
|
name: string;
|
|
31
|
-
protected writeMutex: Mutex;
|
|
32
31
|
|
|
33
32
|
protected initialized: Promise<void>;
|
|
34
33
|
|
|
35
|
-
protected readConnections:
|
|
34
|
+
protected readConnections: Semaphore<OPSQLiteConnection> | null;
|
|
35
|
+
protected writeConnection: Semaphore<OPSQLiteConnection> | null;
|
|
36
36
|
|
|
37
|
-
protected writeConnection: OPSQLiteConnection | null;
|
|
38
|
-
|
|
39
|
-
private readQueue: Array<() => void> = [];
|
|
40
37
|
private abortController: AbortController;
|
|
41
38
|
|
|
42
39
|
constructor(protected options: OPSQLiteAdapterOptions) {
|
|
43
40
|
super();
|
|
44
41
|
this.name = this.options.name;
|
|
45
42
|
|
|
46
|
-
this.writeMutex = new Mutex();
|
|
47
43
|
this.readConnections = null;
|
|
48
44
|
this.writeConnection = null;
|
|
49
45
|
this.abortController = new AbortController();
|
|
@@ -55,7 +51,7 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
|
|
|
55
51
|
this.options.sqliteOptions!;
|
|
56
52
|
const dbFilename = this.options.name;
|
|
57
53
|
|
|
58
|
-
|
|
54
|
+
const underlyingWriteConnection = await this.openConnection(dbFilename);
|
|
59
55
|
|
|
60
56
|
const baseStatements = [
|
|
61
57
|
`PRAGMA busy_timeout = ${lockTimeoutMs}`,
|
|
@@ -75,7 +71,7 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
|
|
|
75
71
|
for (const statement of writeConnectionStatements) {
|
|
76
72
|
for (let tries = 0; tries < 30; tries++) {
|
|
77
73
|
try {
|
|
78
|
-
await
|
|
74
|
+
await underlyingWriteConnection.execute(statement);
|
|
79
75
|
break;
|
|
80
76
|
} catch (e: any) {
|
|
81
77
|
if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
|
|
@@ -88,18 +84,21 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
|
|
|
88
84
|
}
|
|
89
85
|
|
|
90
86
|
// Changes should only occur in the write connection
|
|
91
|
-
|
|
87
|
+
underlyingWriteConnection.registerListener({
|
|
92
88
|
tablesUpdated: (notification) => this.iterateListeners((cb) => cb.tablesUpdated?.(notification))
|
|
93
89
|
});
|
|
94
90
|
|
|
95
|
-
|
|
91
|
+
const underlyingReadConnections = [];
|
|
96
92
|
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
97
93
|
const conn = await this.openConnection(dbFilename);
|
|
98
94
|
for (let statement of readConnectionStatements) {
|
|
99
95
|
await conn.execute(statement);
|
|
100
96
|
}
|
|
101
|
-
|
|
97
|
+
underlyingReadConnections.push(conn);
|
|
102
98
|
}
|
|
99
|
+
|
|
100
|
+
this.writeConnection = new Semaphore([underlyingWriteConnection]);
|
|
101
|
+
this.readConnections = new Semaphore(underlyingReadConnections);
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
protected async openConnection(filenameOverride?: string): Promise<OPSQLiteConnection> {
|
|
@@ -155,53 +154,20 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
|
|
|
155
154
|
await this.initialized;
|
|
156
155
|
// Abort any pending operations
|
|
157
156
|
this.abortController.abort();
|
|
158
|
-
this.readQueue = [];
|
|
159
|
-
|
|
160
|
-
this.writeConnection!.close();
|
|
161
|
-
this.readConnections!.forEach((c) => c.connection.close());
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
async readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
165
|
-
await this.initialized;
|
|
166
|
-
return new Promise(async (resolve, reject) => {
|
|
167
|
-
const execute = async () => {
|
|
168
|
-
// Find an available connection that is not busy
|
|
169
|
-
const availableConnection = this.readConnections!.find((conn) => !conn.busy);
|
|
170
|
-
|
|
171
|
-
// If we have an available connection, use it
|
|
172
|
-
if (availableConnection) {
|
|
173
|
-
availableConnection.busy = true;
|
|
174
|
-
try {
|
|
175
|
-
resolve(await fn(availableConnection.connection));
|
|
176
|
-
} catch (error) {
|
|
177
|
-
reject(error);
|
|
178
|
-
} finally {
|
|
179
|
-
availableConnection.busy = false;
|
|
180
|
-
// After query execution, process any queued tasks
|
|
181
|
-
this.processQueue();
|
|
182
|
-
}
|
|
183
|
-
} else {
|
|
184
|
-
// If no available connections, add to the queue
|
|
185
|
-
this.readQueue.push(execute);
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
157
|
|
|
189
|
-
|
|
190
|
-
});
|
|
191
|
-
}
|
|
158
|
+
const { item: writeConnection, release: returnWrite } = await this.writeConnection!.requestOne();
|
|
159
|
+
const { items: readers, release: returnReaders } = await this.readConnections!.requestAll();
|
|
192
160
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
161
|
+
try {
|
|
162
|
+
writeConnection.close();
|
|
163
|
+
readers.forEach((c) => c.close());
|
|
164
|
+
} finally {
|
|
165
|
+
returnWrite();
|
|
166
|
+
returnReaders();
|
|
199
167
|
}
|
|
200
168
|
}
|
|
201
169
|
|
|
202
|
-
|
|
203
|
-
await this.initialized;
|
|
204
|
-
|
|
170
|
+
private generateNestedAbortSignal(options?: DBLockOptions) {
|
|
205
171
|
const outerSignal = this.abortController.signal;
|
|
206
172
|
let signal: AbortSignal;
|
|
207
173
|
let cleanUpInnerSignal: (() => void) | undefined;
|
|
@@ -224,23 +190,45 @@ class OPSQLiteConnectionPool extends BaseObserver<DBAdapterListener> implements
|
|
|
224
190
|
signal = outerSignal;
|
|
225
191
|
}
|
|
226
192
|
|
|
193
|
+
return { signal, cleanUpInnerSignal };
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
197
|
+
await this.initialized;
|
|
198
|
+
|
|
199
|
+
const { signal, cleanUpInnerSignal } = this.generateNestedAbortSignal(options);
|
|
200
|
+
const { item, release } = await this.readConnections!.requestOne(signal);
|
|
227
201
|
try {
|
|
228
|
-
return await
|
|
202
|
+
return await fn(item);
|
|
229
203
|
} finally {
|
|
230
|
-
|
|
231
|
-
this.writeConnection!.flushUpdates();
|
|
204
|
+
release();
|
|
232
205
|
cleanUpInnerSignal?.();
|
|
233
206
|
}
|
|
234
207
|
}
|
|
235
208
|
|
|
236
|
-
async
|
|
209
|
+
async writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T> {
|
|
237
210
|
await this.initialized;
|
|
238
|
-
await this.writeConnection!.refreshSchema();
|
|
239
211
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
212
|
+
const { signal, cleanUpInnerSignal } = this.generateNestedAbortSignal(options);
|
|
213
|
+
const { item, release } = await this.writeConnection!.requestOne(signal);
|
|
214
|
+
try {
|
|
215
|
+
return await fn(item).finally(() => item.flushUpdates());
|
|
216
|
+
} finally {
|
|
217
|
+
release();
|
|
218
|
+
cleanUpInnerSignal?.();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
async refreshSchema(): Promise<void> {
|
|
223
|
+
await this.initialized;
|
|
224
|
+
await this.writeLock((l) => l.refreshSchema());
|
|
225
|
+
const { items, release } = await this.readConnections!.requestAll();
|
|
226
|
+
try {
|
|
227
|
+
for (let readConnection of items) {
|
|
228
|
+
await readConnection.refreshSchema();
|
|
243
229
|
}
|
|
230
|
+
} finally {
|
|
231
|
+
release();
|
|
244
232
|
}
|
|
245
233
|
}
|
|
246
234
|
}
|