@powersync/op-sqlite 0.0.0-dev-20241014170110 → 0.0.0-dev-20241107150304
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -1
- package/lib/commonjs/db/OPSqliteAdapter.js +66 -46
- package/lib/commonjs/db/OPSqliteAdapter.js.map +1 -1
- package/lib/commonjs/db/SqliteOptions.js +2 -1
- package/lib/commonjs/db/SqliteOptions.js.map +1 -1
- package/lib/module/db/OPSqliteAdapter.js +66 -46
- package/lib/module/db/OPSqliteAdapter.js.map +1 -1
- package/lib/module/db/SqliteOptions.js +2 -1
- package/lib/module/db/SqliteOptions.js.map +1 -1
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts +8 -2
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/db/SqliteOptions.d.ts +5 -0
- package/lib/typescript/commonjs/src/db/SqliteOptions.d.ts.map +1 -1
- package/lib/typescript/commonjs/tsconfig.build.tsbuildinfo +1 -1
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts +8 -2
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/lib/typescript/module/src/db/SqliteOptions.d.ts +5 -0
- package/lib/typescript/module/src/db/SqliteOptions.d.ts.map +1 -1
- package/lib/typescript/module/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/powersync-op-sqlite.podspec +1 -1
- package/src/db/OPSqliteAdapter.ts +67 -52
- package/src/db/SqliteOptions.ts +9 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
This package (`packages/powersync-op-sqlite`) enables using [OP-SQLite](https://github.com/op-engineering/op-sqlite) with PowerSync alongside the [React Native SDK](https://docs.powersync.com/client-sdk-references/react-native-and-expo).
|
|
5
|
+
This package (`packages/powersync-op-sqlite`) enables using [OP-SQLite](https://github.com/op-engineering/op-sqlite) with PowerSync alongside the [React Native SDK](https://docs.powersync.com/client-sdk-references/react-native-and-expo).
|
|
6
6
|
|
|
7
7
|
If you are not yet familiar with PowerSync, please see the [PowerSync React Native SDK README](https://github.com/powersync-ja/powersync-js/tree/main/packages/react-native) for more information.
|
|
8
8
|
|
|
@@ -43,6 +43,31 @@ const factory = new OPSqliteOpenFactory({
|
|
|
43
43
|
this.powersync = new PowerSyncDatabase({ database: factory, schema: AppSchema });
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
+
### Encryption with SQLCipher
|
|
47
|
+
|
|
48
|
+
To enable SQLCipher you need to add the following configuration option to your application's `package.json`
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
// your normal package.json
|
|
53
|
+
// ...
|
|
54
|
+
"op-sqlite": {
|
|
55
|
+
"sqlcipher": true
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Additionally you will need to add an [encryption key](https://www.zetetic.net/sqlcipher/sqlcipher-api/#key) to the OPSQLite factory constructor
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
const factory = new OPSqliteOpenFactory({
|
|
64
|
+
dbFilename: 'sqlite.db',
|
|
65
|
+
sqliteOptions: {
|
|
66
|
+
encryptionKey: 'your-encryption-key'
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
46
71
|
## Native Projects
|
|
47
72
|
|
|
48
73
|
This package uses native libraries. Create native Android and iOS projects (if not created already) by running:
|
|
@@ -20,6 +20,7 @@ var LockType = /*#__PURE__*/function (LockType) {
|
|
|
20
20
|
}(LockType || {});
|
|
21
21
|
const READ_CONNECTIONS = 5;
|
|
22
22
|
class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
23
|
+
readQueue = [];
|
|
23
24
|
constructor(options) {
|
|
24
25
|
super();
|
|
25
26
|
this.options = options;
|
|
@@ -34,21 +35,16 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
34
35
|
lockTimeoutMs,
|
|
35
36
|
journalMode,
|
|
36
37
|
journalSizeLimit,
|
|
37
|
-
synchronous
|
|
38
|
+
synchronous,
|
|
39
|
+
encryptionKey
|
|
38
40
|
} = this.options.sqliteOptions;
|
|
39
|
-
// const { dbFilename, dbLocation } = this.options;
|
|
40
41
|
const dbFilename = this.options.name;
|
|
41
|
-
|
|
42
|
-
const location = this.getDbLocation(this.options.dbLocation);
|
|
43
|
-
const DB = (0, _opSqlite.open)({
|
|
44
|
-
name: dbFilename,
|
|
45
|
-
location: location
|
|
46
|
-
});
|
|
42
|
+
this.writeConnection = await this.openConnection(dbFilename);
|
|
47
43
|
const statements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
|
|
48
44
|
for (const statement of statements) {
|
|
49
45
|
for (let tries = 0; tries < 30; tries++) {
|
|
50
46
|
try {
|
|
51
|
-
await
|
|
47
|
+
await this.writeConnection.execute(statement);
|
|
52
48
|
break;
|
|
53
49
|
} catch (e) {
|
|
54
50
|
if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
|
|
@@ -59,30 +55,26 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
59
55
|
}
|
|
60
56
|
}
|
|
61
57
|
}
|
|
62
|
-
|
|
63
|
-
|
|
58
|
+
|
|
59
|
+
// Changes should only occur in the write connection
|
|
60
|
+
this.writeConnection.registerListener({
|
|
61
|
+
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
62
|
+
});
|
|
64
63
|
this.readConnections = [];
|
|
65
64
|
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
66
65
|
// Workaround to create read-only connections
|
|
67
66
|
let dbName = './'.repeat(i + 1) + dbFilename;
|
|
68
|
-
const conn = await this.openConnection(
|
|
67
|
+
const conn = await this.openConnection(dbName);
|
|
69
68
|
await conn.execute('PRAGMA query_only = true');
|
|
70
|
-
this.readConnections.push(
|
|
69
|
+
this.readConnections.push({
|
|
70
|
+
busy: false,
|
|
71
|
+
connection: conn
|
|
72
|
+
});
|
|
71
73
|
}
|
|
72
|
-
this.writeConnection = new _OPSQLiteConnection.OPSQLiteConnection({
|
|
73
|
-
baseDB: DB
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// Changes should only occur in the write connection
|
|
77
|
-
this.writeConnection.registerListener({
|
|
78
|
-
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
79
|
-
});
|
|
80
74
|
}
|
|
81
|
-
async openConnection(
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
location: dbLocation
|
|
85
|
-
});
|
|
75
|
+
async openConnection(filenameOverride) {
|
|
76
|
+
const dbFilename = filenameOverride ?? this.options.name;
|
|
77
|
+
const DB = this.openDatabase(dbFilename, this.options.sqliteOptions.encryptionKey);
|
|
86
78
|
|
|
87
79
|
//Load extension for all connections
|
|
88
80
|
this.loadExtension(DB);
|
|
@@ -98,6 +90,23 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
98
90
|
return dbLocation ?? _opSqlite.ANDROID_DATABASE_PATH;
|
|
99
91
|
}
|
|
100
92
|
}
|
|
93
|
+
openDatabase(dbFilename, encryptionKey) {
|
|
94
|
+
//This is needed because an undefined/null dbLocation will cause the open function to fail
|
|
95
|
+
const location = this.getDbLocation(this.options.dbLocation);
|
|
96
|
+
//Simarlily if the encryption key is undefined/null when using SQLCipher it will cause the open function to fail
|
|
97
|
+
if (encryptionKey) {
|
|
98
|
+
return (0, _opSqlite.open)({
|
|
99
|
+
name: dbFilename,
|
|
100
|
+
location: location,
|
|
101
|
+
encryptionKey: encryptionKey
|
|
102
|
+
});
|
|
103
|
+
} else {
|
|
104
|
+
return (0, _opSqlite.open)({
|
|
105
|
+
name: dbFilename,
|
|
106
|
+
location: location
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
101
110
|
loadExtension(DB) {
|
|
102
111
|
if (_reactNative.Platform.OS === 'ios') {
|
|
103
112
|
const bundlePath = _reactNative.NativeModules.PowerSyncOpSqlite.getBundlePath();
|
|
@@ -110,33 +119,44 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
110
119
|
close() {
|
|
111
120
|
this.initialized.then(() => {
|
|
112
121
|
this.writeConnection.close();
|
|
113
|
-
this.readConnections.forEach(c => c.close());
|
|
122
|
+
this.readConnections.forEach(c => c.connection.close());
|
|
114
123
|
});
|
|
115
124
|
}
|
|
116
125
|
async readLock(fn, options) {
|
|
117
126
|
await this.initialized;
|
|
118
|
-
// TODO: Use async queues to handle multiple read connections
|
|
119
|
-
const sortedConnections = this.readConnections.map((connection, index) => ({
|
|
120
|
-
lockKey: `${LockType.READ}-${index}`,
|
|
121
|
-
connection
|
|
122
|
-
})).sort((a, b) => {
|
|
123
|
-
const aBusy = this.locks.isBusy(a.lockKey);
|
|
124
|
-
const bBusy = this.locks.isBusy(b.lockKey);
|
|
125
|
-
// Sort by ones which are not busy
|
|
126
|
-
return aBusy > bBusy ? 1 : 0;
|
|
127
|
-
});
|
|
128
127
|
return new Promise(async (resolve, reject) => {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
128
|
+
const execute = async () => {
|
|
129
|
+
// Find an available connection that is not busy
|
|
130
|
+
const availableConnection = this.readConnections.find(conn => !conn.busy);
|
|
131
|
+
|
|
132
|
+
// If we have an available connection, use it
|
|
133
|
+
if (availableConnection) {
|
|
134
|
+
availableConnection.busy = true;
|
|
135
|
+
try {
|
|
136
|
+
resolve(await fn(availableConnection.connection));
|
|
137
|
+
} catch (error) {
|
|
138
|
+
reject(error);
|
|
139
|
+
} finally {
|
|
140
|
+
availableConnection.busy = false;
|
|
141
|
+
// After query execution, process any queued tasks
|
|
142
|
+
this.processQueue();
|
|
143
|
+
}
|
|
144
|
+
} else {
|
|
145
|
+
// If no available connections, add to the queue
|
|
146
|
+
this.readQueue.push(execute);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
execute();
|
|
138
150
|
});
|
|
139
151
|
}
|
|
152
|
+
async processQueue() {
|
|
153
|
+
if (this.readQueue.length > 0) {
|
|
154
|
+
const next = this.readQueue.shift();
|
|
155
|
+
if (next) {
|
|
156
|
+
next();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
140
160
|
async writeLock(fn, options) {
|
|
141
161
|
await this.initialized;
|
|
142
162
|
return new Promise(async (resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_common","require","_opSqlite","_asyncLock","_interopRequireDefault","_OPSQLiteConnection","_reactNative","e","__esModule","default","LockType","READ_CONNECTIONS","OPSQLiteDBAdapter","BaseObserver","constructor","options","name","locks","Lock","readConnections","writeConnection","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","sqliteOptions","dbFilename","
|
|
1
|
+
{"version":3,"names":["_common","require","_opSqlite","_asyncLock","_interopRequireDefault","_OPSQLiteConnection","_reactNative","e","__esModule","default","LockType","READ_CONNECTIONS","OPSQLiteDBAdapter","BaseObserver","readQueue","constructor","options","name","locks","Lock","readConnections","writeConnection","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","encryptionKey","sqliteOptions","dbFilename","openConnection","statements","statement","tries","execute","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","i","dbName","repeat","conn","push","busy","connection","filenameOverride","DB","openDatabase","loadExtension","OPSQLiteConnection","baseDB","getDbLocation","dbLocation","Platform","OS","IOS_LIBRARY_PATH","ANDROID_DATABASE_PATH","location","open","bundlePath","NativeModules","PowerSyncOpSqlite","getBundlePath","libPath","close","then","forEach","c","readLock","fn","Promise","resolve","reject","availableConnection","find","error","processQueue","length","next","shift","writeLock","acquire","WRITE","timeout","timeoutMs","ex","readTransaction","ctx","internalTransaction","writeTransaction","getAll","sql","parameters","getOptional","get","query","params","executeBatch","finalized","commit","rowsAffected","rollback","result","exports"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -26,6 +26,7 @@ const DEFAULT_SQLITE_OPTIONS = exports.DEFAULT_SQLITE_OPTIONS = {
|
|
|
26
26
|
journalMode: SqliteJournalMode.wal,
|
|
27
27
|
synchronous: SqliteSynchronous.normal,
|
|
28
28
|
journalSizeLimit: 6 * 1024 * 1024,
|
|
29
|
-
lockTimeoutMs: 30000
|
|
29
|
+
lockTimeoutMs: 30000,
|
|
30
|
+
encryptionKey: null
|
|
30
31
|
};
|
|
31
32
|
//# sourceMappingURL=SqliteOptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SqliteJournalMode","SqliteSynchronous","DEFAULT_SQLITE_OPTIONS","exports","journalMode","wal","synchronous","normal","journalSizeLimit","lockTimeoutMs"],"sourceRoot":"../../../src","sources":["db/SqliteOptions.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"names":["SqliteJournalMode","SqliteSynchronous","DEFAULT_SQLITE_OPTIONS","exports","journalMode","wal","synchronous","normal","journalSizeLimit","lockTimeoutMs","encryptionKey"],"sourceRoot":"../../../src","sources":["db/SqliteOptions.ts"],"mappings":";;;;;;AAiCA;AACA;AACA;AAAA,IACKA,iBAAiB,0BAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA,EAAjBA,iBAAiB,SAWtB;AAAA,IACKC,iBAAiB,0BAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA,EAAjBA,iBAAiB;AAMf,MAAMC,sBAA+C,GAAAC,OAAA,CAAAD,sBAAA,GAAG;EAC7DE,WAAW,EAAEJ,iBAAiB,CAACK,GAAG;EAClCC,WAAW,EAAEL,iBAAiB,CAACM,MAAM;EACrCC,gBAAgB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;EACjCC,aAAa,EAAE,KAAK;EACpBC,aAAa,EAAE;AACjB,CAAC","ignoreList":[]}
|
|
@@ -16,6 +16,7 @@ var LockType = /*#__PURE__*/function (LockType) {
|
|
|
16
16
|
}(LockType || {});
|
|
17
17
|
const READ_CONNECTIONS = 5;
|
|
18
18
|
export class OPSQLiteDBAdapter extends BaseObserver {
|
|
19
|
+
readQueue = [];
|
|
19
20
|
constructor(options) {
|
|
20
21
|
super();
|
|
21
22
|
this.options = options;
|
|
@@ -30,21 +31,16 @@ export class OPSQLiteDBAdapter extends BaseObserver {
|
|
|
30
31
|
lockTimeoutMs,
|
|
31
32
|
journalMode,
|
|
32
33
|
journalSizeLimit,
|
|
33
|
-
synchronous
|
|
34
|
+
synchronous,
|
|
35
|
+
encryptionKey
|
|
34
36
|
} = this.options.sqliteOptions;
|
|
35
|
-
// const { dbFilename, dbLocation } = this.options;
|
|
36
37
|
const dbFilename = this.options.name;
|
|
37
|
-
|
|
38
|
-
const location = this.getDbLocation(this.options.dbLocation);
|
|
39
|
-
const DB = open({
|
|
40
|
-
name: dbFilename,
|
|
41
|
-
location: location
|
|
42
|
-
});
|
|
38
|
+
this.writeConnection = await this.openConnection(dbFilename);
|
|
43
39
|
const statements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
|
|
44
40
|
for (const statement of statements) {
|
|
45
41
|
for (let tries = 0; tries < 30; tries++) {
|
|
46
42
|
try {
|
|
47
|
-
await
|
|
43
|
+
await this.writeConnection.execute(statement);
|
|
48
44
|
break;
|
|
49
45
|
} catch (e) {
|
|
50
46
|
if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
|
|
@@ -55,30 +51,26 @@ export class OPSQLiteDBAdapter extends BaseObserver {
|
|
|
55
51
|
}
|
|
56
52
|
}
|
|
57
53
|
}
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
|
|
55
|
+
// Changes should only occur in the write connection
|
|
56
|
+
this.writeConnection.registerListener({
|
|
57
|
+
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
58
|
+
});
|
|
60
59
|
this.readConnections = [];
|
|
61
60
|
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
62
61
|
// Workaround to create read-only connections
|
|
63
62
|
let dbName = './'.repeat(i + 1) + dbFilename;
|
|
64
|
-
const conn = await this.openConnection(
|
|
63
|
+
const conn = await this.openConnection(dbName);
|
|
65
64
|
await conn.execute('PRAGMA query_only = true');
|
|
66
|
-
this.readConnections.push(
|
|
65
|
+
this.readConnections.push({
|
|
66
|
+
busy: false,
|
|
67
|
+
connection: conn
|
|
68
|
+
});
|
|
67
69
|
}
|
|
68
|
-
this.writeConnection = new OPSQLiteConnection({
|
|
69
|
-
baseDB: DB
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// Changes should only occur in the write connection
|
|
73
|
-
this.writeConnection.registerListener({
|
|
74
|
-
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
75
|
-
});
|
|
76
70
|
}
|
|
77
|
-
async openConnection(
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
location: dbLocation
|
|
81
|
-
});
|
|
71
|
+
async openConnection(filenameOverride) {
|
|
72
|
+
const dbFilename = filenameOverride ?? this.options.name;
|
|
73
|
+
const DB = this.openDatabase(dbFilename, this.options.sqliteOptions.encryptionKey);
|
|
82
74
|
|
|
83
75
|
//Load extension for all connections
|
|
84
76
|
this.loadExtension(DB);
|
|
@@ -94,6 +86,23 @@ export class OPSQLiteDBAdapter extends BaseObserver {
|
|
|
94
86
|
return dbLocation ?? ANDROID_DATABASE_PATH;
|
|
95
87
|
}
|
|
96
88
|
}
|
|
89
|
+
openDatabase(dbFilename, encryptionKey) {
|
|
90
|
+
//This is needed because an undefined/null dbLocation will cause the open function to fail
|
|
91
|
+
const location = this.getDbLocation(this.options.dbLocation);
|
|
92
|
+
//Simarlily if the encryption key is undefined/null when using SQLCipher it will cause the open function to fail
|
|
93
|
+
if (encryptionKey) {
|
|
94
|
+
return open({
|
|
95
|
+
name: dbFilename,
|
|
96
|
+
location: location,
|
|
97
|
+
encryptionKey: encryptionKey
|
|
98
|
+
});
|
|
99
|
+
} else {
|
|
100
|
+
return open({
|
|
101
|
+
name: dbFilename,
|
|
102
|
+
location: location
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
97
106
|
loadExtension(DB) {
|
|
98
107
|
if (Platform.OS === 'ios') {
|
|
99
108
|
const bundlePath = NativeModules.PowerSyncOpSqlite.getBundlePath();
|
|
@@ -106,33 +115,44 @@ export class OPSQLiteDBAdapter extends BaseObserver {
|
|
|
106
115
|
close() {
|
|
107
116
|
this.initialized.then(() => {
|
|
108
117
|
this.writeConnection.close();
|
|
109
|
-
this.readConnections.forEach(c => c.close());
|
|
118
|
+
this.readConnections.forEach(c => c.connection.close());
|
|
110
119
|
});
|
|
111
120
|
}
|
|
112
121
|
async readLock(fn, options) {
|
|
113
122
|
await this.initialized;
|
|
114
|
-
// TODO: Use async queues to handle multiple read connections
|
|
115
|
-
const sortedConnections = this.readConnections.map((connection, index) => ({
|
|
116
|
-
lockKey: `${LockType.READ}-${index}`,
|
|
117
|
-
connection
|
|
118
|
-
})).sort((a, b) => {
|
|
119
|
-
const aBusy = this.locks.isBusy(a.lockKey);
|
|
120
|
-
const bBusy = this.locks.isBusy(b.lockKey);
|
|
121
|
-
// Sort by ones which are not busy
|
|
122
|
-
return aBusy > bBusy ? 1 : 0;
|
|
123
|
-
});
|
|
124
123
|
return new Promise(async (resolve, reject) => {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
124
|
+
const execute = async () => {
|
|
125
|
+
// Find an available connection that is not busy
|
|
126
|
+
const availableConnection = this.readConnections.find(conn => !conn.busy);
|
|
127
|
+
|
|
128
|
+
// If we have an available connection, use it
|
|
129
|
+
if (availableConnection) {
|
|
130
|
+
availableConnection.busy = true;
|
|
131
|
+
try {
|
|
132
|
+
resolve(await fn(availableConnection.connection));
|
|
133
|
+
} catch (error) {
|
|
134
|
+
reject(error);
|
|
135
|
+
} finally {
|
|
136
|
+
availableConnection.busy = false;
|
|
137
|
+
// After query execution, process any queued tasks
|
|
138
|
+
this.processQueue();
|
|
139
|
+
}
|
|
140
|
+
} else {
|
|
141
|
+
// If no available connections, add to the queue
|
|
142
|
+
this.readQueue.push(execute);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
execute();
|
|
134
146
|
});
|
|
135
147
|
}
|
|
148
|
+
async processQueue() {
|
|
149
|
+
if (this.readQueue.length > 0) {
|
|
150
|
+
const next = this.readQueue.shift();
|
|
151
|
+
if (next) {
|
|
152
|
+
next();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
136
156
|
async writeLock(fn, options) {
|
|
137
157
|
await this.initialized;
|
|
138
158
|
return new Promise(async (resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BaseObserver","ANDROID_DATABASE_PATH","IOS_LIBRARY_PATH","open","Lock","OPSQLiteConnection","NativeModules","Platform","LockType","READ_CONNECTIONS","OPSQLiteDBAdapter","constructor","options","name","locks","readConnections","writeConnection","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","
|
|
1
|
+
{"version":3,"names":["BaseObserver","ANDROID_DATABASE_PATH","IOS_LIBRARY_PATH","open","Lock","OPSQLiteConnection","NativeModules","Platform","LockType","READ_CONNECTIONS","OPSQLiteDBAdapter","readQueue","constructor","options","name","locks","readConnections","writeConnection","initialized","init","lockTimeoutMs","journalMode","journalSizeLimit","synchronous","encryptionKey","sqliteOptions","dbFilename","openConnection","statements","statement","tries","execute","e","Error","message","includes","registerListener","tablesUpdated","notification","iterateListeners","cb","i","dbName","repeat","conn","push","busy","connection","filenameOverride","DB","openDatabase","loadExtension","baseDB","getDbLocation","dbLocation","OS","location","bundlePath","PowerSyncOpSqlite","getBundlePath","libPath","close","then","forEach","c","readLock","fn","Promise","resolve","reject","availableConnection","find","error","processQueue","length","next","shift","writeLock","acquire","WRITE","timeout","timeoutMs","ex","readTransaction","ctx","internalTransaction","writeTransaction","getAll","sql","parameters","getOptional","get","query","params","executeBatch","finalized","commit","rowsAffected","rollback","result"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -22,6 +22,7 @@ export const DEFAULT_SQLITE_OPTIONS = {
|
|
|
22
22
|
journalMode: SqliteJournalMode.wal,
|
|
23
23
|
synchronous: SqliteSynchronous.normal,
|
|
24
24
|
journalSizeLimit: 6 * 1024 * 1024,
|
|
25
|
-
lockTimeoutMs: 30000
|
|
25
|
+
lockTimeoutMs: 30000,
|
|
26
|
+
encryptionKey: null
|
|
26
27
|
};
|
|
27
28
|
//# sourceMappingURL=SqliteOptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SqliteJournalMode","SqliteSynchronous","DEFAULT_SQLITE_OPTIONS","journalMode","wal","synchronous","normal","journalSizeLimit","lockTimeoutMs"],"sourceRoot":"../../../src","sources":["db/SqliteOptions.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["SqliteJournalMode","SqliteSynchronous","DEFAULT_SQLITE_OPTIONS","journalMode","wal","synchronous","normal","journalSizeLimit","lockTimeoutMs","encryptionKey"],"sourceRoot":"../../../src","sources":["db/SqliteOptions.ts"],"mappings":";;AAiCA;AACA;AACA;AAAA,IACKA,iBAAiB,0BAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA,EAAjBA,iBAAiB,SAWtB;AAAA,IACKC,iBAAiB,0BAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAjBA,iBAAiB;EAAA,OAAjBA,iBAAiB;AAAA,EAAjBA,iBAAiB;AAMtB,OAAO,MAAMC,sBAA+C,GAAG;EAC7DC,WAAW,EAAEH,iBAAiB,CAACI,GAAG;EAClCC,WAAW,EAAEJ,iBAAiB,CAACK,MAAM;EACrCC,gBAAgB,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;EACjCC,aAAa,EAAE,KAAK;EACpBC,aAAa,EAAE;AACjB,CAAC","ignoreList":[]}
|
|
@@ -15,15 +15,21 @@ export declare class OPSQLiteDBAdapter extends BaseObserver<DBAdapterListener> i
|
|
|
15
15
|
name: string;
|
|
16
16
|
protected locks: Lock;
|
|
17
17
|
protected initialized: Promise<void>;
|
|
18
|
-
protected readConnections:
|
|
18
|
+
protected readConnections: Array<{
|
|
19
|
+
busy: boolean;
|
|
20
|
+
connection: OPSQLiteConnection;
|
|
21
|
+
}> | null;
|
|
19
22
|
protected writeConnection: OPSQLiteConnection | null;
|
|
23
|
+
private readQueue;
|
|
20
24
|
constructor(options: OPSQLiteAdapterOptions);
|
|
21
25
|
protected init(): Promise<void>;
|
|
22
|
-
protected openConnection(
|
|
26
|
+
protected openConnection(filenameOverride?: string): Promise<OPSQLiteConnection>;
|
|
23
27
|
private getDbLocation;
|
|
28
|
+
private openDatabase;
|
|
24
29
|
private loadExtension;
|
|
25
30
|
close(): void;
|
|
26
31
|
readLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
32
|
+
private processQueue;
|
|
27
33
|
writeLock<T>(fn: (tx: OPSQLiteConnection) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
28
34
|
readTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
29
35
|
writeTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,WAAW,EAEX,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,IAAI,MAAM,YAAY,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,
|
|
1
|
+
{"version":3,"file":"OPSqliteAdapter.d.ts","sourceRoot":"","sources":["../../../../../src/db/OPSqliteAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,11 @@ export interface SqliteOptions {
|
|
|
20
20
|
* Set to null or zero to fail immediately when the database is locked.
|
|
21
21
|
*/
|
|
22
22
|
lockTimeoutMs?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Encryption key for the database.
|
|
25
|
+
* If set, the database will be encrypted using SQLCipher.
|
|
26
|
+
*/
|
|
27
|
+
encryptionKey?: string;
|
|
23
28
|
}
|
|
24
29
|
declare enum SqliteJournalMode {
|
|
25
30
|
wal = "WAL",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqliteOptions.d.ts","sourceRoot":"","sources":["../../../../../src/db/SqliteOptions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEhC;;;OAGG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEhC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,aAAK,iBAAiB;IAGpB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,GAAG,QAAQ;CACZ;AAGD,aAAK,iBAAiB;IACpB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,GAAG,QAAQ;CACZ;AAED,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"SqliteOptions.d.ts","sourceRoot":"","sources":["../../../../../src/db/SqliteOptions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEhC;;;OAGG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAEhC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,aAAK,iBAAiB;IAGpB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,GAAG,QAAQ;CACZ;AAGD,aAAK,iBAAiB;IACpB,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,GAAG,QAAQ;CACZ;AAED,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,aAAa,CAM1D,CAAC"}
|