@powersync/op-sqlite 0.0.0-dev-20241014170110 → 0.0.0-dev-20250121082529
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 +62 -1
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/powersync/opsqlite/PowerSyncOpSqlitePackage.kt +4 -8
- package/ios/PowerSyncOpSqlite.mm +0 -5
- package/lib/commonjs/db/OPSQLiteConnection.js +47 -21
- package/lib/commonjs/db/OPSQLiteConnection.js.map +1 -1
- package/lib/commonjs/db/OPSqliteAdapter.js +87 -52
- package/lib/commonjs/db/OPSqliteAdapter.js.map +1 -1
- package/lib/commonjs/db/SqliteOptions.js +3 -1
- package/lib/commonjs/db/SqliteOptions.js.map +1 -1
- package/lib/commonjs/index.js +0 -16
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/db/OPSQLiteConnection.js +47 -21
- package/lib/module/db/OPSQLiteConnection.js.map +1 -1
- package/lib/module/db/OPSqliteAdapter.js +89 -54
- package/lib/module/db/OPSqliteAdapter.js.map +1 -1
- package/lib/module/db/SqliteOptions.js +3 -1
- package/lib/module/db/SqliteOptions.js.map +1 -1
- package/lib/module/index.js +0 -15
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/commonjs/src/db/OPSQLiteConnection.d.ts +11 -1
- package/lib/typescript/commonjs/src/db/OPSQLiteConnection.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts +11 -3
- package/lib/typescript/commonjs/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/db/SqliteOptions.d.ts +13 -0
- package/lib/typescript/commonjs/src/db/SqliteOptions.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +0 -1
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/tsconfig.build.tsbuildinfo +1 -1
- package/lib/typescript/module/src/db/OPSQLiteConnection.d.ts +11 -1
- package/lib/typescript/module/src/db/OPSQLiteConnection.d.ts.map +1 -1
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts +11 -3
- package/lib/typescript/module/src/db/OPSqliteAdapter.d.ts.map +1 -1
- package/lib/typescript/module/src/db/SqliteOptions.d.ts +13 -0
- package/lib/typescript/module/src/db/SqliteOptions.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +0 -1
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/powersync-op-sqlite.podspec +2 -2
- package/src/db/OPSQLiteConnection.ts +73 -24
- package/src/db/OPSqliteAdapter.ts +109 -69
- package/src/db/SqliteOptions.ts +19 -2
- package/src/index.ts +4 -30
- package/android/src/main/java/com/powersync/opsqlite/PowerSyncOpSqliteModule.kt +0 -25
- package/android/src/newarch/PowerSyncOpSqliteSpec.kt +0 -7
- package/android/src/oldarch/PowerSyncOpSqliteSpec.kt +0 -11
- package/lib/commonjs/NativePowerSyncOpSqlite.js +0 -9
- package/lib/commonjs/NativePowerSyncOpSqlite.js.map +0 -1
- package/lib/module/NativePowerSyncOpSqlite.js +0 -5
- package/lib/module/NativePowerSyncOpSqlite.js.map +0 -1
- package/lib/typescript/commonjs/src/NativePowerSyncOpSqlite.d.ts +0 -7
- package/lib/typescript/commonjs/src/NativePowerSyncOpSqlite.d.ts.map +0 -1
- package/lib/typescript/module/src/NativePowerSyncOpSqlite.d.ts +0 -7
- package/lib/typescript/module/src/NativePowerSyncOpSqlite.d.ts.map +0 -1
- package/src/NativePowerSyncOpSqlite.ts +0 -8
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,67 @@ 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
|
+
|
|
71
|
+
### Loading SQLite extensions
|
|
72
|
+
|
|
73
|
+
To load additional SQLite extensions include the `extensions` option in `sqliteOptions` which expects an array of objects with a `path` and an `entryPoint`:
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
sqliteOptions: {
|
|
77
|
+
extensions: [
|
|
78
|
+
{ path: libPath, entryPoint: 'sqlite3_powersync_init' }
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
More info can be found in the [OP-SQLite docs](https://op-engineering.github.io/op-sqlite/docs/api/#loading-extensions).
|
|
84
|
+
|
|
85
|
+
Example usage:
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import { getDylibPath } from '@op-engineering/op-sqlite';
|
|
89
|
+
|
|
90
|
+
let libPath: string
|
|
91
|
+
if (Platform.OS === 'ios') {
|
|
92
|
+
libPath = getDylibPath('co.powersync.sqlitecore', 'powersync-sqlite-core')
|
|
93
|
+
} else {
|
|
94
|
+
libPath = 'libpowersync';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const factory = new OPSqliteOpenFactory({
|
|
98
|
+
dbFilename: 'sqlite.db',
|
|
99
|
+
sqliteOptions: {
|
|
100
|
+
extensions: [
|
|
101
|
+
{ path: libPath, entryPoint: 'sqlite3_powersync_init' }
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
46
107
|
## Native Projects
|
|
47
108
|
|
|
48
109
|
This package uses native libraries. Create native Android and iOS projects (if not created already) by running:
|
package/android/build.gradle
CHANGED
|
@@ -107,7 +107,7 @@ repositories {
|
|
|
107
107
|
def kotlin_version = getExtOrDefault("kotlinVersion")
|
|
108
108
|
|
|
109
109
|
dependencies {
|
|
110
|
-
implementation 'co.powersync:powersync-sqlite-core:0.3.
|
|
110
|
+
implementation 'co.powersync:powersync-sqlite-core:0.3.8'
|
|
111
111
|
// For < 0.71, this will be from the local maven repo
|
|
112
112
|
// For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
|
|
113
113
|
//noinspection GradleDynamicVersion
|
|
@@ -9,20 +9,16 @@ import java.util.HashMap
|
|
|
9
9
|
|
|
10
10
|
class PowerSyncOpSqlitePackage : TurboReactPackage() {
|
|
11
11
|
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
12
|
-
return
|
|
13
|
-
PowerSyncOpSqliteModule(reactContext)
|
|
14
|
-
} else {
|
|
15
|
-
null
|
|
16
|
-
}
|
|
12
|
+
return null
|
|
17
13
|
}
|
|
18
14
|
|
|
19
15
|
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
|
|
20
16
|
return ReactModuleInfoProvider {
|
|
21
17
|
val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
|
|
22
18
|
val isTurboModule: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
|
|
23
|
-
moduleInfos[
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
moduleInfos["PowerSyncOpSqlite"] = ReactModuleInfo(
|
|
20
|
+
"PowerSyncOpSqlite",
|
|
21
|
+
"PowerSyncOpSqlite",
|
|
26
22
|
false, // canOverrideExistingModule
|
|
27
23
|
false, // needsEagerInit
|
|
28
24
|
true, // hasConstants
|
package/ios/PowerSyncOpSqlite.mm
CHANGED
|
@@ -10,30 +10,53 @@ class OPSQLiteConnection extends _common.BaseObserver {
|
|
|
10
10
|
super();
|
|
11
11
|
this.options = options;
|
|
12
12
|
this.DB = options.baseDB;
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
this.updateBuffer = [];
|
|
14
|
+
this.DB.rollbackHook(() => {
|
|
15
|
+
this.updateBuffer = [];
|
|
16
|
+
});
|
|
15
17
|
this.DB.updateHook(update => {
|
|
16
|
-
this.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
18
|
+
this.addTableUpdate(update);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
addTableUpdate(update) {
|
|
22
|
+
let opType;
|
|
23
|
+
switch (update.operation) {
|
|
24
|
+
case 'INSERT':
|
|
25
|
+
opType = _common.RowUpdateType.SQLITE_INSERT;
|
|
26
|
+
break;
|
|
27
|
+
case 'DELETE':
|
|
28
|
+
opType = _common.RowUpdateType.SQLITE_DELETE;
|
|
29
|
+
break;
|
|
30
|
+
case 'UPDATE':
|
|
31
|
+
opType = _common.RowUpdateType.SQLITE_UPDATE;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
this.updateBuffer.push({
|
|
35
|
+
table: update.table,
|
|
36
|
+
opType,
|
|
37
|
+
rowId: update.rowId
|
|
35
38
|
});
|
|
36
39
|
}
|
|
40
|
+
flushUpdates() {
|
|
41
|
+
if (!this.updateBuffer.length) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const groupedUpdates = this.updateBuffer.reduce((grouping, update) => {
|
|
45
|
+
const {
|
|
46
|
+
table
|
|
47
|
+
} = update;
|
|
48
|
+
const updateGroup = grouping[table] || (grouping[table] = []);
|
|
49
|
+
updateGroup.push(update);
|
|
50
|
+
return grouping;
|
|
51
|
+
}, {});
|
|
52
|
+
const batchedUpdate = {
|
|
53
|
+
groupedUpdates,
|
|
54
|
+
rawUpdates: this.updateBuffer,
|
|
55
|
+
tables: Object.keys(groupedUpdates)
|
|
56
|
+
};
|
|
57
|
+
this.updateBuffer = [];
|
|
58
|
+
this.iterateListeners(l => l.tablesUpdated?.(batchedUpdate));
|
|
59
|
+
}
|
|
37
60
|
close() {
|
|
38
61
|
return this.DB.close();
|
|
39
62
|
}
|
|
@@ -72,6 +95,9 @@ class OPSQLiteConnection extends _common.BaseObserver {
|
|
|
72
95
|
}
|
|
73
96
|
return result;
|
|
74
97
|
}
|
|
98
|
+
async refreshSchema() {
|
|
99
|
+
await this.get("PRAGMA table_info('sqlite_master')");
|
|
100
|
+
}
|
|
75
101
|
}
|
|
76
102
|
exports.OPSQLiteConnection = OPSQLiteConnection;
|
|
77
103
|
//# sourceMappingURL=OPSQLiteConnection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_common","require","OPSQLiteConnection","BaseObserver","constructor","options","DB","baseDB","
|
|
1
|
+
{"version":3,"names":["_common","require","OPSQLiteConnection","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","executeBatch","tuple","slice","forEach","p","result","getAll","sql","parameters","getOptional","get","Error","refreshSchema","exports"],"sourceRoot":"../../../src","sources":["db/OPSQLiteConnection.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -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,33 +55,28 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
59
55
|
}
|
|
60
56
|
}
|
|
61
57
|
}
|
|
62
|
-
this.loadExtension(DB);
|
|
63
|
-
await DB.execute('SELECT powersync_init()');
|
|
64
|
-
this.readConnections = [];
|
|
65
|
-
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
66
|
-
// Workaround to create read-only connections
|
|
67
|
-
let dbName = './'.repeat(i + 1) + dbFilename;
|
|
68
|
-
const conn = await this.openConnection(location, dbName);
|
|
69
|
-
await conn.execute('PRAGMA query_only = true');
|
|
70
|
-
this.readConnections.push(conn);
|
|
71
|
-
}
|
|
72
|
-
this.writeConnection = new _OPSQLiteConnection.OPSQLiteConnection({
|
|
73
|
-
baseDB: DB
|
|
74
|
-
});
|
|
75
58
|
|
|
76
59
|
// Changes should only occur in the write connection
|
|
77
60
|
this.writeConnection.registerListener({
|
|
78
61
|
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
79
62
|
});
|
|
63
|
+
this.readConnections = [];
|
|
64
|
+
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
65
|
+
const conn = await this.openConnection(dbFilename);
|
|
66
|
+
await conn.execute('PRAGMA query_only = true');
|
|
67
|
+
this.readConnections.push({
|
|
68
|
+
busy: false,
|
|
69
|
+
connection: conn
|
|
70
|
+
});
|
|
71
|
+
}
|
|
80
72
|
}
|
|
81
|
-
async openConnection(
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
location: dbLocation
|
|
85
|
-
});
|
|
73
|
+
async openConnection(filenameOverride) {
|
|
74
|
+
const dbFilename = filenameOverride ?? this.options.name;
|
|
75
|
+
const DB = this.openDatabase(dbFilename, this.options.sqliteOptions.encryptionKey);
|
|
86
76
|
|
|
87
|
-
//Load
|
|
88
|
-
this.
|
|
77
|
+
//Load extensions for all connections
|
|
78
|
+
this.loadAdditionalExtensions(DB);
|
|
79
|
+
this.loadPowerSyncExtension(DB);
|
|
89
80
|
await DB.execute('SELECT powersync_init()');
|
|
90
81
|
return new _OPSQLiteConnection.OPSQLiteConnection({
|
|
91
82
|
baseDB: DB
|
|
@@ -98,10 +89,33 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
98
89
|
return dbLocation ?? _opSqlite.ANDROID_DATABASE_PATH;
|
|
99
90
|
}
|
|
100
91
|
}
|
|
101
|
-
|
|
92
|
+
openDatabase(dbFilename, encryptionKey) {
|
|
93
|
+
//This is needed because an undefined/null dbLocation will cause the open function to fail
|
|
94
|
+
const location = this.getDbLocation(this.options.dbLocation);
|
|
95
|
+
//Simarlily if the encryption key is undefined/null when using SQLCipher it will cause the open function to fail
|
|
96
|
+
if (encryptionKey) {
|
|
97
|
+
return (0, _opSqlite.open)({
|
|
98
|
+
name: dbFilename,
|
|
99
|
+
location: location,
|
|
100
|
+
encryptionKey: encryptionKey
|
|
101
|
+
});
|
|
102
|
+
} else {
|
|
103
|
+
return (0, _opSqlite.open)({
|
|
104
|
+
name: dbFilename,
|
|
105
|
+
location: location
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
loadAdditionalExtensions(DB) {
|
|
110
|
+
if (this.options.sqliteOptions.extensions.length > 0) {
|
|
111
|
+
for (const extension of this.options.sqliteOptions.extensions) {
|
|
112
|
+
DB.loadExtension(extension.path, extension.entryPoint);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async loadPowerSyncExtension(DB) {
|
|
102
117
|
if (_reactNative.Platform.OS === 'ios') {
|
|
103
|
-
const
|
|
104
|
-
const libPath = `${bundlePath}/Frameworks/powersync-sqlite-core.framework/powersync-sqlite-core`;
|
|
118
|
+
const libPath = (0, _opSqlite.getDylibPath)('co.powersync.sqlitecore', 'powersync-sqlite-core');
|
|
105
119
|
DB.loadExtension(libPath, 'sqlite3_powersync_init');
|
|
106
120
|
} else {
|
|
107
121
|
DB.loadExtension('libpowersync', 'sqlite3_powersync_init');
|
|
@@ -110,33 +124,44 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
110
124
|
close() {
|
|
111
125
|
this.initialized.then(() => {
|
|
112
126
|
this.writeConnection.close();
|
|
113
|
-
this.readConnections.forEach(c => c.close());
|
|
127
|
+
this.readConnections.forEach(c => c.connection.close());
|
|
114
128
|
});
|
|
115
129
|
}
|
|
116
130
|
async readLock(fn, options) {
|
|
117
131
|
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
132
|
return new Promise(async (resolve, reject) => {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
133
|
+
const execute = async () => {
|
|
134
|
+
// Find an available connection that is not busy
|
|
135
|
+
const availableConnection = this.readConnections.find(conn => !conn.busy);
|
|
136
|
+
|
|
137
|
+
// If we have an available connection, use it
|
|
138
|
+
if (availableConnection) {
|
|
139
|
+
availableConnection.busy = true;
|
|
140
|
+
try {
|
|
141
|
+
resolve(await fn(availableConnection.connection));
|
|
142
|
+
} catch (error) {
|
|
143
|
+
reject(error);
|
|
144
|
+
} finally {
|
|
145
|
+
availableConnection.busy = false;
|
|
146
|
+
// After query execution, process any queued tasks
|
|
147
|
+
this.processQueue();
|
|
148
|
+
}
|
|
149
|
+
} else {
|
|
150
|
+
// If no available connections, add to the queue
|
|
151
|
+
this.readQueue.push(execute);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
execute();
|
|
138
155
|
});
|
|
139
156
|
}
|
|
157
|
+
async processQueue() {
|
|
158
|
+
if (this.readQueue.length > 0) {
|
|
159
|
+
const next = this.readQueue.shift();
|
|
160
|
+
if (next) {
|
|
161
|
+
next();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
140
165
|
async writeLock(fn, options) {
|
|
141
166
|
await this.initialized;
|
|
142
167
|
return new Promise(async (resolve, reject) => {
|
|
@@ -145,6 +170,9 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
145
170
|
resolve(await fn(this.writeConnection));
|
|
146
171
|
}, {
|
|
147
172
|
timeout: options?.timeoutMs
|
|
173
|
+
}).then(() => {
|
|
174
|
+
// flush updates once a write lock has been released
|
|
175
|
+
this.writeConnection.flushUpdates();
|
|
148
176
|
});
|
|
149
177
|
} catch (ex) {
|
|
150
178
|
reject(ex);
|
|
@@ -209,6 +237,13 @@ class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
|
209
237
|
throw ex;
|
|
210
238
|
}
|
|
211
239
|
}
|
|
240
|
+
async refreshSchema() {
|
|
241
|
+
await this.initialized;
|
|
242
|
+
await this.writeConnection.refreshSchema();
|
|
243
|
+
for (let readConnection of this.readConnections) {
|
|
244
|
+
await readConnection.connection.refreshSchema();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
212
247
|
}
|
|
213
248
|
exports.OPSQLiteDBAdapter = OPSQLiteDBAdapter;
|
|
214
249
|
//# sourceMappingURL=OPSqliteAdapter.js.map
|
|
@@ -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","conn","push","busy","connection","filenameOverride","DB","openDatabase","loadAdditionalExtensions","loadPowerSyncExtension","OPSQLiteConnection","baseDB","getDbLocation","dbLocation","Platform","OS","IOS_LIBRARY_PATH","ANDROID_DATABASE_PATH","location","open","extensions","length","extension","loadExtension","path","entryPoint","libPath","getDylibPath","close","then","forEach","c","readLock","fn","Promise","resolve","reject","availableConnection","find","error","processQueue","next","shift","writeLock","acquire","WRITE","timeout","timeoutMs","flushUpdates","ex","readTransaction","ctx","internalTransaction","writeTransaction","getAll","sql","parameters","getOptional","get","query","params","executeBatch","finalized","commit","rowsAffected","rollback","result","refreshSchema","readConnection","exports"],"sourceRoot":"../../../src","sources":["db/OPSqliteAdapter.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -26,6 +26,8 @@ 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,
|
|
31
|
+
extensions: []
|
|
30
32
|
};
|
|
31
33
|
//# 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","extensions"],"sourceRoot":"../../../src","sources":["db/SqliteOptions.ts"],"mappings":";;;;;;AA0CA;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,IAAI;EACnBC,UAAU,EAAE;AACd,CAAC","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -15,21 +15,5 @@ Object.defineProperty(exports, "OPSqliteOpenFactory", {
|
|
|
15
15
|
return _OPSqliteDBOpenFactory.OPSqliteOpenFactory;
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
|
-
exports.getBundlePath = getBundlePath;
|
|
19
|
-
var _reactNative = require("react-native");
|
|
20
18
|
var _OPSqliteDBOpenFactory = require("./db/OPSqliteDBOpenFactory.js");
|
|
21
|
-
const LINKING_ERROR = `The package '@powersync/op-sqlite' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
|
|
22
|
-
ios: "- You have run 'pod install'\n",
|
|
23
|
-
default: ''
|
|
24
|
-
}) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
|
|
25
|
-
const isTurboModuleEnabled = global.__turboModuleProxy != null;
|
|
26
|
-
const PowerSyncOpSqliteModule = isTurboModuleEnabled ? require('./NativePowerSyncOpSqlite').default : _reactNative.NativeModules.PowerSyncOpSqlite;
|
|
27
|
-
const PowerSyncOpSqlite = PowerSyncOpSqliteModule ? PowerSyncOpSqliteModule : new Proxy({}, {
|
|
28
|
-
get() {
|
|
29
|
-
throw new Error(LINKING_ERROR);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
function getBundlePath() {
|
|
33
|
-
return PowerSyncOpSqlite.getBundlePath();
|
|
34
|
-
}
|
|
35
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_OPSqliteDBOpenFactory","require"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,sBAAA,GAAAC,OAAA","ignoreList":[]}
|
|
@@ -6,30 +6,53 @@ export class OPSQLiteConnection extends BaseObserver {
|
|
|
6
6
|
super();
|
|
7
7
|
this.options = options;
|
|
8
8
|
this.DB = options.baseDB;
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
this.updateBuffer = [];
|
|
10
|
+
this.DB.rollbackHook(() => {
|
|
11
|
+
this.updateBuffer = [];
|
|
12
|
+
});
|
|
11
13
|
this.DB.updateHook(update => {
|
|
12
|
-
this.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
14
|
+
this.addTableUpdate(update);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
addTableUpdate(update) {
|
|
18
|
+
let opType;
|
|
19
|
+
switch (update.operation) {
|
|
20
|
+
case 'INSERT':
|
|
21
|
+
opType = RowUpdateType.SQLITE_INSERT;
|
|
22
|
+
break;
|
|
23
|
+
case 'DELETE':
|
|
24
|
+
opType = RowUpdateType.SQLITE_DELETE;
|
|
25
|
+
break;
|
|
26
|
+
case 'UPDATE':
|
|
27
|
+
opType = RowUpdateType.SQLITE_UPDATE;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
this.updateBuffer.push({
|
|
31
|
+
table: update.table,
|
|
32
|
+
opType,
|
|
33
|
+
rowId: update.rowId
|
|
31
34
|
});
|
|
32
35
|
}
|
|
36
|
+
flushUpdates() {
|
|
37
|
+
if (!this.updateBuffer.length) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const groupedUpdates = this.updateBuffer.reduce((grouping, update) => {
|
|
41
|
+
const {
|
|
42
|
+
table
|
|
43
|
+
} = update;
|
|
44
|
+
const updateGroup = grouping[table] || (grouping[table] = []);
|
|
45
|
+
updateGroup.push(update);
|
|
46
|
+
return grouping;
|
|
47
|
+
}, {});
|
|
48
|
+
const batchedUpdate = {
|
|
49
|
+
groupedUpdates,
|
|
50
|
+
rawUpdates: this.updateBuffer,
|
|
51
|
+
tables: Object.keys(groupedUpdates)
|
|
52
|
+
};
|
|
53
|
+
this.updateBuffer = [];
|
|
54
|
+
this.iterateListeners(l => l.tablesUpdated?.(batchedUpdate));
|
|
55
|
+
}
|
|
33
56
|
close() {
|
|
34
57
|
return this.DB.close();
|
|
35
58
|
}
|
|
@@ -68,5 +91,8 @@ export class OPSQLiteConnection extends BaseObserver {
|
|
|
68
91
|
}
|
|
69
92
|
return result;
|
|
70
93
|
}
|
|
94
|
+
async refreshSchema() {
|
|
95
|
+
await this.get("PRAGMA table_info('sqlite_master')");
|
|
96
|
+
}
|
|
71
97
|
}
|
|
72
98
|
//# sourceMappingURL=OPSQLiteConnection.js.map
|