@powersync/op-sqlite 0.0.0-dev-20241014162857
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/LICENSE +201 -0
- package/README.md +54 -0
- package/android/build.gradle +124 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/powersync/opsqlite/PowerSyncOpSqliteModule.kt +25 -0
- package/android/src/main/java/com/powersync/opsqlite/PowerSyncOpSqlitePackage.kt +35 -0
- package/android/src/newarch/PowerSyncOpSqliteSpec.kt +7 -0
- package/android/src/oldarch/PowerSyncOpSqliteSpec.kt +11 -0
- package/ios/PowerSyncOpSqlite.h +5 -0
- package/ios/PowerSyncOpSqlite.mm +11 -0
- package/lib/commonjs/NativePowerSyncOpSqlite.js +9 -0
- package/lib/commonjs/NativePowerSyncOpSqlite.js.map +1 -0
- package/lib/commonjs/db/OPSQLiteConnection.js +77 -0
- package/lib/commonjs/db/OPSQLiteConnection.js.map +1 -0
- package/lib/commonjs/db/OPSqliteAdapter.js +214 -0
- package/lib/commonjs/db/OPSqliteAdapter.js.map +1 -0
- package/lib/commonjs/db/OPSqliteDBOpenFactory.js +26 -0
- package/lib/commonjs/db/OPSqliteDBOpenFactory.js.map +1 -0
- package/lib/commonjs/db/SqliteOptions.js +31 -0
- package/lib/commonjs/db/SqliteOptions.js.map +1 -0
- package/lib/commonjs/index.js +35 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/module/NativePowerSyncOpSqlite.js +5 -0
- package/lib/module/NativePowerSyncOpSqlite.js.map +1 -0
- package/lib/module/db/OPSQLiteConnection.js +72 -0
- package/lib/module/db/OPSQLiteConnection.js.map +1 -0
- package/lib/module/db/OPSqliteAdapter.js +209 -0
- package/lib/module/db/OPSqliteAdapter.js.map +1 -0
- package/lib/module/db/OPSqliteDBOpenFactory.js +21 -0
- package/lib/module/db/OPSqliteDBOpenFactory.js.map +1 -0
- package/lib/module/db/SqliteOptions.js +27 -0
- package/lib/module/db/SqliteOptions.js.map +1 -0
- package/lib/module/index.js +19 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/typescript/src/NativePowerSyncOpSqlite.d.ts +7 -0
- package/lib/typescript/src/NativePowerSyncOpSqlite.d.ts.map +1 -0
- package/lib/typescript/src/db/OPSQLiteConnection.d.ts +17 -0
- package/lib/typescript/src/db/OPSQLiteConnection.d.ts.map +1 -0
- package/lib/typescript/src/db/OPSqliteAdapter.d.ts +37 -0
- package/lib/typescript/src/db/OPSqliteAdapter.d.ts.map +1 -0
- package/lib/typescript/src/db/OPSqliteDBOpenFactory.d.ts +12 -0
- package/lib/typescript/src/db/OPSqliteDBOpenFactory.d.ts.map +1 -0
- package/lib/typescript/src/db/SqliteOptions.d.ts +39 -0
- package/lib/typescript/src/db/SqliteOptions.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +3 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +112 -0
- package/powersync-op-sqlite.podspec +26 -0
- package/src/NativePowerSyncOpSqlite.ts +8 -0
- package/src/db/OPSQLiteConnection.ts +82 -0
- package/src/db/OPSqliteAdapter.ts +259 -0
- package/src/db/OPSqliteDBOpenFactory.ts +25 -0
- package/src/db/SqliteOptions.ts +54 -0
- package/src/index.ts +30 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.OPSQLiteDBAdapter = void 0;
|
|
7
|
+
var _common = require("@powersync/common");
|
|
8
|
+
var _opSqlite = require("@op-engineering/op-sqlite");
|
|
9
|
+
var _asyncLock = _interopRequireDefault(require("async-lock"));
|
|
10
|
+
var _OPSQLiteConnection = require("./OPSQLiteConnection");
|
|
11
|
+
var _reactNative = require("react-native");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
/**
|
|
14
|
+
* Adapter for React Native Quick SQLite
|
|
15
|
+
*/
|
|
16
|
+
var LockType = /*#__PURE__*/function (LockType) {
|
|
17
|
+
LockType["READ"] = "read";
|
|
18
|
+
LockType["WRITE"] = "write";
|
|
19
|
+
return LockType;
|
|
20
|
+
}(LockType || {});
|
|
21
|
+
const READ_CONNECTIONS = 5;
|
|
22
|
+
class OPSQLiteDBAdapter extends _common.BaseObserver {
|
|
23
|
+
constructor(options) {
|
|
24
|
+
super();
|
|
25
|
+
this.options = options;
|
|
26
|
+
this.name = this.options.name;
|
|
27
|
+
this.locks = new _asyncLock.default();
|
|
28
|
+
this.readConnections = null;
|
|
29
|
+
this.writeConnection = null;
|
|
30
|
+
this.initialized = this.init();
|
|
31
|
+
}
|
|
32
|
+
async init() {
|
|
33
|
+
const {
|
|
34
|
+
lockTimeoutMs,
|
|
35
|
+
journalMode,
|
|
36
|
+
journalSizeLimit,
|
|
37
|
+
synchronous
|
|
38
|
+
} = this.options.sqliteOptions;
|
|
39
|
+
// const { dbFilename, dbLocation } = this.options;
|
|
40
|
+
const dbFilename = this.options.name;
|
|
41
|
+
//This is needed because an undefined dbLocation will cause the open function to fail
|
|
42
|
+
const location = this.getDbLocation(this.options.dbLocation);
|
|
43
|
+
const DB = (0, _opSqlite.open)({
|
|
44
|
+
name: dbFilename,
|
|
45
|
+
location: location
|
|
46
|
+
});
|
|
47
|
+
const statements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
|
|
48
|
+
for (const statement of statements) {
|
|
49
|
+
for (let tries = 0; tries < 30; tries++) {
|
|
50
|
+
try {
|
|
51
|
+
await DB.execute(statement);
|
|
52
|
+
break;
|
|
53
|
+
} catch (e) {
|
|
54
|
+
if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
|
|
55
|
+
continue;
|
|
56
|
+
} else {
|
|
57
|
+
throw e;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
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
|
+
|
|
76
|
+
// Changes should only occur in the write connection
|
|
77
|
+
this.writeConnection.registerListener({
|
|
78
|
+
tablesUpdated: notification => this.iterateListeners(cb => cb.tablesUpdated?.(notification))
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async openConnection(dbLocation, filenameOverride) {
|
|
82
|
+
const DB = (0, _opSqlite.open)({
|
|
83
|
+
name: filenameOverride ?? this.options.name,
|
|
84
|
+
location: dbLocation
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
//Load extension for all connections
|
|
88
|
+
this.loadExtension(DB);
|
|
89
|
+
await DB.execute('SELECT powersync_init()');
|
|
90
|
+
return new _OPSQLiteConnection.OPSQLiteConnection({
|
|
91
|
+
baseDB: DB
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
getDbLocation(dbLocation) {
|
|
95
|
+
if (_reactNative.Platform.OS === 'ios') {
|
|
96
|
+
return dbLocation ?? _opSqlite.IOS_LIBRARY_PATH;
|
|
97
|
+
} else {
|
|
98
|
+
return dbLocation ?? _opSqlite.ANDROID_DATABASE_PATH;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
loadExtension(DB) {
|
|
102
|
+
if (_reactNative.Platform.OS === 'ios') {
|
|
103
|
+
const bundlePath = _reactNative.NativeModules.PowerSyncOpSqlite.getBundlePath();
|
|
104
|
+
const libPath = `${bundlePath}/Frameworks/powersync-sqlite-core.framework/powersync-sqlite-core`;
|
|
105
|
+
DB.loadExtension(libPath, 'sqlite3_powersync_init');
|
|
106
|
+
} else {
|
|
107
|
+
DB.loadExtension('libpowersync', 'sqlite3_powersync_init');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
close() {
|
|
111
|
+
this.initialized.then(() => {
|
|
112
|
+
this.writeConnection.close();
|
|
113
|
+
this.readConnections.forEach(c => c.close());
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
async readLock(fn, options) {
|
|
117
|
+
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
|
+
return new Promise(async (resolve, reject) => {
|
|
129
|
+
try {
|
|
130
|
+
await this.locks.acquire(sortedConnections[0].lockKey, async () => {
|
|
131
|
+
resolve(await fn(sortedConnections[0].connection));
|
|
132
|
+
}, {
|
|
133
|
+
timeout: options?.timeoutMs
|
|
134
|
+
});
|
|
135
|
+
} catch (ex) {
|
|
136
|
+
reject(ex);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
async writeLock(fn, options) {
|
|
141
|
+
await this.initialized;
|
|
142
|
+
return new Promise(async (resolve, reject) => {
|
|
143
|
+
try {
|
|
144
|
+
await this.locks.acquire(LockType.WRITE, async () => {
|
|
145
|
+
resolve(await fn(this.writeConnection));
|
|
146
|
+
}, {
|
|
147
|
+
timeout: options?.timeoutMs
|
|
148
|
+
});
|
|
149
|
+
} catch (ex) {
|
|
150
|
+
reject(ex);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
readTransaction(fn, options) {
|
|
155
|
+
return this.readLock(ctx => this.internalTransaction(ctx, fn));
|
|
156
|
+
}
|
|
157
|
+
writeTransaction(fn, options) {
|
|
158
|
+
return this.writeLock(ctx => this.internalTransaction(ctx, fn));
|
|
159
|
+
}
|
|
160
|
+
getAll(sql, parameters) {
|
|
161
|
+
return this.readLock(ctx => ctx.getAll(sql, parameters));
|
|
162
|
+
}
|
|
163
|
+
getOptional(sql, parameters) {
|
|
164
|
+
return this.readLock(ctx => ctx.getOptional(sql, parameters));
|
|
165
|
+
}
|
|
166
|
+
get(sql, parameters) {
|
|
167
|
+
return this.readLock(ctx => ctx.get(sql, parameters));
|
|
168
|
+
}
|
|
169
|
+
execute(query, params) {
|
|
170
|
+
return this.writeLock(ctx => ctx.execute(query, params));
|
|
171
|
+
}
|
|
172
|
+
async executeBatch(query, params = []) {
|
|
173
|
+
return this.writeLock(ctx => ctx.executeBatch(query, params));
|
|
174
|
+
}
|
|
175
|
+
async internalTransaction(connection, fn) {
|
|
176
|
+
let finalized = false;
|
|
177
|
+
const commit = async () => {
|
|
178
|
+
if (finalized) {
|
|
179
|
+
return {
|
|
180
|
+
rowsAffected: 0
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
finalized = true;
|
|
184
|
+
return connection.execute('COMMIT');
|
|
185
|
+
};
|
|
186
|
+
const rollback = async () => {
|
|
187
|
+
if (finalized) {
|
|
188
|
+
return {
|
|
189
|
+
rowsAffected: 0
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
finalized = true;
|
|
193
|
+
return connection.execute('ROLLBACK');
|
|
194
|
+
};
|
|
195
|
+
try {
|
|
196
|
+
await connection.execute('BEGIN');
|
|
197
|
+
const result = await fn({
|
|
198
|
+
execute: (query, params) => connection.execute(query, params),
|
|
199
|
+
get: (query, params) => connection.get(query, params),
|
|
200
|
+
getAll: (query, params) => connection.getAll(query, params),
|
|
201
|
+
getOptional: (query, params) => connection.getOptional(query, params),
|
|
202
|
+
commit,
|
|
203
|
+
rollback
|
|
204
|
+
});
|
|
205
|
+
await commit();
|
|
206
|
+
return result;
|
|
207
|
+
} catch (ex) {
|
|
208
|
+
await rollback();
|
|
209
|
+
throw ex;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
exports.OPSQLiteDBAdapter = OPSQLiteDBAdapter;
|
|
214
|
+
//# sourceMappingURL=OPSqliteAdapter.js.map
|
|
@@ -0,0 +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","location","getDbLocation","dbLocation","DB","open","statements","statement","tries","execute","Error","message","includes","loadExtension","i","dbName","repeat","conn","openConnection","push","OPSQLiteConnection","baseDB","registerListener","tablesUpdated","notification","iterateListeners","cb","filenameOverride","Platform","OS","IOS_LIBRARY_PATH","ANDROID_DATABASE_PATH","bundlePath","NativeModules","PowerSyncOpSqlite","getBundlePath","libPath","close","then","forEach","c","readLock","fn","sortedConnections","map","connection","index","lockKey","READ","sort","a","b","aBusy","isBusy","bBusy","Promise","resolve","reject","acquire","timeout","timeoutMs","ex","writeLock","WRITE","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":";;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AASA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,mBAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAL,OAAA;AAAuD,SAAAG,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAGvD;AACA;AACA;AAFA,IASKG,QAAQ,0BAARA,QAAQ;EAARA,QAAQ;EAARA,QAAQ;EAAA,OAARA,QAAQ;AAAA,EAARA,QAAQ;AAKb,MAAMC,gBAAgB,GAAG,CAAC;AAEnB,MAAMC,iBAAiB,SAASC,oBAAY,CAAyC;EAU1FC,WAAWA,CAAWC,OAA+B,EAAE;IACrD,KAAK,CAAC,CAAC;IAAC,KADYA,OAA+B,GAA/BA,OAA+B;IAEnD,IAAI,CAACC,IAAI,GAAG,IAAI,CAACD,OAAO,CAACC,IAAI;IAE7B,IAAI,CAACC,KAAK,GAAG,IAAIC,kBAAI,CAAC,CAAC;IACvB,IAAI,CAACC,eAAe,GAAG,IAAI;IAC3B,IAAI,CAACC,eAAe,GAAG,IAAI;IAC3B,IAAI,CAACC,WAAW,GAAG,IAAI,CAACC,IAAI,CAAC,CAAC;EAChC;EAEA,MAAgBA,IAAIA,CAAA,EAAG;IACrB,MAAM;MAAEC,aAAa;MAAEC,WAAW;MAAEC,gBAAgB;MAAEC;IAAY,CAAC,GAAG,IAAI,CAACX,OAAO,CAACY,aAAa;IAChG;IACA,MAAMC,UAAU,GAAG,IAAI,CAACb,OAAO,CAACC,IAAI;IACpC;IACA,MAAMa,QAAQ,GAAG,IAAI,CAACC,aAAa,CAAC,IAAI,CAACf,OAAO,CAACgB,UAAU,CAAC;IAC5D,MAAMC,EAAM,GAAG,IAAAC,cAAI,EAAC;MAClBjB,IAAI,EAAEY,UAAU;MAChBC,QAAQ,EAAEA;IACZ,CAAC,CAAC;IAEF,MAAMK,UAAoB,GAAG,CAC3B,yBAAyBX,aAAa,EAAE,EACxC,yBAAyBC,WAAW,EAAE,EACtC,+BAA+BC,gBAAgB,EAAE,EACjD,wBAAwBC,WAAW,EAAE,CACtC;IAED,KAAK,MAAMS,SAAS,IAAID,UAAU,EAAE;MAClC,KAAK,IAAIE,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG,EAAE,EAAEA,KAAK,EAAE,EAAE;QACvC,IAAI;UACF,MAAMJ,EAAE,CAACK,OAAO,CAACF,SAAS,CAAC;UAC3B;QACF,CAAC,CAAC,OAAO5B,CAAM,EAAE;UACf,IAAIA,CAAC,YAAY+B,KAAK,IAAI/B,CAAC,CAACgC,OAAO,CAACC,QAAQ,CAAC,oBAAoB,CAAC,IAAIJ,KAAK,GAAG,EAAE,EAAE;YAChF;UACF,CAAC,MAAM;YACL,MAAM7B,CAAC;UACT;QACF;MACF;IACF;IAEA,IAAI,CAACkC,aAAa,CAACT,EAAE,CAAC;IAEtB,MAAMA,EAAE,CAACK,OAAO,CAAC,yBAAyB,CAAC;IAE3C,IAAI,CAAClB,eAAe,GAAG,EAAE;IACzB,KAAK,IAAIuB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG/B,gBAAgB,EAAE+B,CAAC,EAAE,EAAE;MACzC;MACA,IAAIC,MAAM,GAAG,IAAI,CAACC,MAAM,CAACF,CAAC,GAAG,CAAC,CAAC,GAAGd,UAAU;MAC5C,MAAMiB,IAAI,GAAG,MAAM,IAAI,CAACC,cAAc,CAACjB,QAAQ,EAAEc,MAAM,CAAC;MACxD,MAAME,IAAI,CAACR,OAAO,CAAC,0BAA0B,CAAC;MAC9C,IAAI,CAAClB,eAAe,CAAC4B,IAAI,CAACF,IAAI,CAAC;IACjC;IAEA,IAAI,CAACzB,eAAe,GAAG,IAAI4B,sCAAkB,CAAC;MAC5CC,MAAM,EAAEjB;IACV,CAAC,CAAC;;IAEF;IACA,IAAI,CAACZ,eAAe,CAAE8B,gBAAgB,CAAC;MACrCC,aAAa,EAAGC,YAAY,IAAK,IAAI,CAACC,gBAAgB,CAAEC,EAAE,IAAKA,EAAE,CAACH,aAAa,GAAGC,YAAY,CAAC;IACjG,CAAC,CAAC;EACJ;EAEA,MAAgBN,cAAcA,CAACf,UAAkB,EAAEwB,gBAAyB,EAA+B;IACzG,MAAMvB,EAAM,GAAG,IAAAC,cAAI,EAAC;MAClBjB,IAAI,EAAEuC,gBAAgB,IAAI,IAAI,CAACxC,OAAO,CAACC,IAAI;MAC3Ca,QAAQ,EAAEE;IACZ,CAAC,CAAC;;IAEF;IACA,IAAI,CAACU,aAAa,CAACT,EAAE,CAAC;IAEtB,MAAMA,EAAE,CAACK,OAAO,CAAC,yBAAyB,CAAC;IAE3C,OAAO,IAAIW,sCAAkB,CAAC;MAC5BC,MAAM,EAAEjB;IACV,CAAC,CAAC;EACJ;EAEQF,aAAaA,CAACC,UAAmB,EAAU;IACjD,IAAIyB,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;MACzB,OAAO1B,UAAU,IAAI2B,0BAAgB;IACvC,CAAC,MAAM;MACL,OAAO3B,UAAU,IAAI4B,+BAAqB;IAC5C;EACF;EAEQlB,aAAaA,CAACT,EAAM,EAAE;IAC5B,IAAIwB,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;MACzB,MAAMG,UAAkB,GAAGC,0BAAa,CAACC,iBAAiB,CAACC,aAAa,CAAC,CAAC;MAC1E,MAAMC,OAAO,GAAG,GAAGJ,UAAU,mEAAmE;MAChG5B,EAAE,CAACS,aAAa,CAACuB,OAAO,EAAE,wBAAwB,CAAC;IACrD,CAAC,MAAM;MACLhC,EAAE,CAACS,aAAa,CAAC,cAAc,EAAE,wBAAwB,CAAC;IAC5D;EACF;EAEAwB,KAAKA,CAAA,EAAG;IACN,IAAI,CAAC5C,WAAW,CAAC6C,IAAI,CAAC,MAAM;MAC1B,IAAI,CAAC9C,eAAe,CAAE6C,KAAK,CAAC,CAAC;MAC7B,IAAI,CAAC9C,eAAe,CAAEgD,OAAO,CAAEC,CAAC,IAAKA,CAAC,CAACH,KAAK,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC;EACJ;EAEA,MAAMI,QAAQA,CAAIC,EAA0C,EAAEvD,OAAuB,EAAc;IACjG,MAAM,IAAI,CAACM,WAAW;IACtB;IACA,MAAMkD,iBAAiB,GAAG,IAAI,CAACpD,eAAe,CAAEqD,GAAG,CAAC,CAACC,UAAU,EAAEC,KAAK,MAAM;MAC1EC,OAAO,EAAE,GAAGjE,QAAQ,CAACkE,IAAI,IAAIF,KAAK,EAAE;MACpCD;IACF,CAAC,CAAC,CAAC,CAACI,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;MACjB,MAAMC,KAAK,GAAG,IAAI,CAAC/D,KAAK,CAACgE,MAAM,CAACH,CAAC,CAACH,OAAO,CAAC;MAC1C,MAAMO,KAAK,GAAG,IAAI,CAACjE,KAAK,CAACgE,MAAM,CAACF,CAAC,CAACJ,OAAO,CAAC;MAC1C;MACA,OAAOK,KAAK,GAAGE,KAAK,GAAG,CAAC,GAAG,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,IAAIC,OAAO,CAAC,OAAOC,OAAO,EAAEC,MAAM,KAAK;MAC5C,IAAI;QACF,MAAM,IAAI,CAACpE,KAAK,CAACqE,OAAO,CACtBf,iBAAiB,CAAC,CAAC,CAAC,CAACI,OAAO,EAC5B,YAAY;UACVS,OAAO,CAAC,MAAMd,EAAE,CAACC,iBAAiB,CAAC,CAAC,CAAC,CAACE,UAAU,CAAC,CAAC;QACpD,CAAC,EACD;UAAEc,OAAO,EAAExE,OAAO,EAAEyE;QAAU,CAChC,CAAC;MACH,CAAC,CAAC,OAAOC,EAAE,EAAE;QACXJ,MAAM,CAACI,EAAE,CAAC;MACZ;IACF,CAAC,CAAC;EACJ;EAEA,MAAMC,SAASA,CAAIpB,EAA0C,EAAEvD,OAAuB,EAAc;IAClG,MAAM,IAAI,CAACM,WAAW;IAEtB,OAAO,IAAI8D,OAAO,CAAC,OAAOC,OAAO,EAAEC,MAAM,KAAK;MAC5C,IAAI;QACF,MAAM,IAAI,CAACpE,KAAK,CAACqE,OAAO,CACtB5E,QAAQ,CAACiF,KAAK,EACd,YAAY;UACVP,OAAO,CAAC,MAAMd,EAAE,CAAC,IAAI,CAAClD,eAAgB,CAAC,CAAC;QAC1C,CAAC,EACD;UAAEmE,OAAO,EAAExE,OAAO,EAAEyE;QAAU,CAChC,CAAC;MACH,CAAC,CAAC,OAAOC,EAAE,EAAE;QACXJ,MAAM,CAACI,EAAE,CAAC;MACZ;IACF,CAAC,CAAC;EACJ;EAEAG,eAAeA,CAAItB,EAAmC,EAAEvD,OAAuB,EAAc;IAC3F,OAAO,IAAI,CAACsD,QAAQ,CAAEwB,GAAG,IAAK,IAAI,CAACC,mBAAmB,CAACD,GAAG,EAAEvB,EAAE,CAAC,CAAC;EAClE;EAEAyB,gBAAgBA,CAAIzB,EAAmC,EAAEvD,OAAuB,EAAc;IAC5F,OAAO,IAAI,CAAC2E,SAAS,CAAEG,GAAG,IAAK,IAAI,CAACC,mBAAmB,CAACD,GAAG,EAAEvB,EAAE,CAAC,CAAC;EACnE;EAEA0B,MAAMA,CAAIC,GAAW,EAAEC,UAAkB,EAAgB;IACvD,OAAO,IAAI,CAAC7B,QAAQ,CAAEwB,GAAG,IAAKA,GAAG,CAACG,MAAM,CAACC,GAAG,EAAEC,UAAU,CAAC,CAAC;EAC5D;EAEAC,WAAWA,CAAIF,GAAW,EAAEC,UAAkB,EAAqB;IACjE,OAAO,IAAI,CAAC7B,QAAQ,CAAEwB,GAAG,IAAKA,GAAG,CAACM,WAAW,CAACF,GAAG,EAAEC,UAAU,CAAC,CAAC;EACjE;EAEAE,GAAGA,CAAIH,GAAW,EAAEC,UAAkB,EAAc;IAClD,OAAO,IAAI,CAAC7B,QAAQ,CAAEwB,GAAG,IAAKA,GAAG,CAACO,GAAG,CAACH,GAAG,EAAEC,UAAU,CAAC,CAAC;EACzD;EAEA7D,OAAOA,CAACgE,KAAa,EAAEC,MAAc,EAAE;IACrC,OAAO,IAAI,CAACZ,SAAS,CAAEG,GAAG,IAAKA,GAAG,CAACxD,OAAO,CAACgE,KAAK,EAAEC,MAAM,CAAC,CAAC;EAC5D;EAEA,MAAMC,YAAYA,CAACF,KAAa,EAAEC,MAAe,GAAG,EAAE,EAAwB;IAC5E,OAAO,IAAI,CAACZ,SAAS,CAAEG,GAAG,IAAKA,GAAG,CAACU,YAAY,CAACF,KAAK,EAAEC,MAAM,CAAC,CAAC;EACjE;EAEA,MAAgBR,mBAAmBA,CACjCrB,UAA8B,EAC9BH,EAAmC,EACvB;IACZ,IAAIkC,SAAS,GAAG,KAAK;IACrB,MAAMC,MAAM,GAAG,MAAAA,CAAA,KAAkC;MAC/C,IAAID,SAAS,EAAE;QACb,OAAO;UAAEE,YAAY,EAAE;QAAE,CAAC;MAC5B;MACAF,SAAS,GAAG,IAAI;MAChB,OAAO/B,UAAU,CAACpC,OAAO,CAAC,QAAQ,CAAC;IACrC,CAAC;IACD,MAAMsE,QAAQ,GAAG,MAAAA,CAAA,KAAkC;MACjD,IAAIH,SAAS,EAAE;QACb,OAAO;UAAEE,YAAY,EAAE;QAAE,CAAC;MAC5B;MACAF,SAAS,GAAG,IAAI;MAChB,OAAO/B,UAAU,CAACpC,OAAO,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI;MACF,MAAMoC,UAAU,CAACpC,OAAO,CAAC,OAAO,CAAC;MACjC,MAAMuE,MAAM,GAAG,MAAMtC,EAAE,CAAC;QACtBjC,OAAO,EAAEA,CAACgE,KAAK,EAAEC,MAAM,KAAK7B,UAAU,CAACpC,OAAO,CAACgE,KAAK,EAAEC,MAAM,CAAC;QAC7DF,GAAG,EAAEA,CAACC,KAAK,EAAEC,MAAM,KAAK7B,UAAU,CAAC2B,GAAG,CAACC,KAAK,EAAEC,MAAM,CAAC;QACrDN,MAAM,EAAEA,CAACK,KAAK,EAAEC,MAAM,KAAK7B,UAAU,CAACuB,MAAM,CAACK,KAAK,EAAEC,MAAM,CAAC;QAC3DH,WAAW,EAAEA,CAACE,KAAK,EAAEC,MAAM,KAAK7B,UAAU,CAAC0B,WAAW,CAACE,KAAK,EAAEC,MAAM,CAAC;QACrEG,MAAM;QACNE;MACF,CAAC,CAAC;MACF,MAAMF,MAAM,CAAC,CAAC;MACd,OAAOG,MAAM;IACf,CAAC,CAAC,OAAOnB,EAAE,EAAE;MACX,MAAMkB,QAAQ,CAAC,CAAC;MAChB,MAAMlB,EAAE;IACV;EACF;AACF;AAACoB,OAAA,CAAAjG,iBAAA,GAAAA,iBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.OPSqliteOpenFactory = void 0;
|
|
7
|
+
var _OPSqliteAdapter = require("./OPSqliteAdapter");
|
|
8
|
+
var _SqliteOptions = require("./SqliteOptions");
|
|
9
|
+
class OPSqliteOpenFactory {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.options = options;
|
|
12
|
+
this.sqliteOptions = {
|
|
13
|
+
..._SqliteOptions.DEFAULT_SQLITE_OPTIONS,
|
|
14
|
+
...this.options.sqliteOptions
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
openDB() {
|
|
18
|
+
return new _OPSqliteAdapter.OPSQLiteDBAdapter({
|
|
19
|
+
name: this.options.dbFilename,
|
|
20
|
+
dbLocation: this.options.dbLocation,
|
|
21
|
+
sqliteOptions: this.sqliteOptions
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.OPSqliteOpenFactory = OPSqliteOpenFactory;
|
|
26
|
+
//# sourceMappingURL=OPSqliteDBOpenFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_OPSqliteAdapter","require","_SqliteOptions","OPSqliteOpenFactory","constructor","options","sqliteOptions","DEFAULT_SQLITE_OPTIONS","openDB","OPSQLiteDBAdapter","name","dbFilename","dbLocation","exports"],"sourceRoot":"../../../src","sources":["db/OPSqliteDBOpenFactory.ts"],"mappings":";;;;;;AACA,IAAAA,gBAAA,GAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AAKO,MAAME,mBAAmB,CAA2B;EAGzDC,WAAWA,CAAWC,OAAmC,EAAE;IAAA,KAArCA,OAAmC,GAAnCA,OAAmC;IACvD,IAAI,CAACC,aAAa,GAAG;MACnB,GAAGC,qCAAsB;MACzB,GAAG,IAAI,CAACF,OAAO,CAACC;IAClB,CAAC;EACH;EAEAE,MAAMA,CAAA,EAAc;IAClB,OAAO,IAAIC,kCAAiB,CAAC;MAC3BC,IAAI,EAAE,IAAI,CAACL,OAAO,CAACM,UAAU;MAC7BC,UAAU,EAAE,IAAI,CAACP,OAAO,CAACO,UAAU;MACnCN,aAAa,EAAE,IAAI,CAACA;IACtB,CAAC,CAAC;EACJ;AACF;AAACO,OAAA,CAAAV,mBAAA,GAAAA,mBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.DEFAULT_SQLITE_OPTIONS = void 0;
|
|
7
|
+
// SQLite journal mode. Set on the primary connection.
|
|
8
|
+
// This library is written with WAL mode in mind - other modes may cause
|
|
9
|
+
// unexpected locking behavior.
|
|
10
|
+
var SqliteJournalMode = /*#__PURE__*/function (SqliteJournalMode) {
|
|
11
|
+
SqliteJournalMode["wal"] = "WAL";
|
|
12
|
+
SqliteJournalMode["delete"] = "DELETE";
|
|
13
|
+
SqliteJournalMode["truncate"] = "TRUNCATE";
|
|
14
|
+
SqliteJournalMode["persist"] = "PERSIST";
|
|
15
|
+
SqliteJournalMode["memory"] = "MEMORY";
|
|
16
|
+
SqliteJournalMode["off"] = "OFF";
|
|
17
|
+
return SqliteJournalMode;
|
|
18
|
+
}(SqliteJournalMode || {}); // SQLite file commit mode.
|
|
19
|
+
var SqliteSynchronous = /*#__PURE__*/function (SqliteSynchronous) {
|
|
20
|
+
SqliteSynchronous["normal"] = "NORMAL";
|
|
21
|
+
SqliteSynchronous["full"] = "FULL";
|
|
22
|
+
SqliteSynchronous["off"] = "OFF";
|
|
23
|
+
return SqliteSynchronous;
|
|
24
|
+
}(SqliteSynchronous || {});
|
|
25
|
+
const DEFAULT_SQLITE_OPTIONS = exports.DEFAULT_SQLITE_OPTIONS = {
|
|
26
|
+
journalMode: SqliteJournalMode.wal,
|
|
27
|
+
synchronous: SqliteSynchronous.normal,
|
|
28
|
+
journalSizeLimit: 6 * 1024 * 1024,
|
|
29
|
+
lockTimeoutMs: 30000
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=SqliteOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["SqliteJournalMode","SqliteSynchronous","DEFAULT_SQLITE_OPTIONS","exports","journalMode","wal","synchronous","normal","journalSizeLimit","lockTimeoutMs"],"sourceRoot":"../../../src","sources":["db/SqliteOptions.ts"],"mappings":";;;;;;AA2BA;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;AACjB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "OPSQLiteOpenFactoryOptions", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _OPSqliteDBOpenFactory.OPSQLiteOpenFactoryOptions;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "OPSqliteOpenFactory", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _OPSqliteDBOpenFactory.OPSqliteOpenFactory;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
exports.getBundlePath = getBundlePath;
|
|
19
|
+
var _reactNative = require("react-native");
|
|
20
|
+
var _OPSqliteDBOpenFactory = require("./db/OPSqliteDBOpenFactory");
|
|
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
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNative","require","_OPSqliteDBOpenFactory","LINKING_ERROR","Platform","select","ios","default","isTurboModuleEnabled","global","__turboModuleProxy","PowerSyncOpSqliteModule","NativeModules","PowerSyncOpSqlite","Proxy","get","Error","getBundlePath"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AA6BA,IAAAC,sBAAA,GAAAD,OAAA;AA3BA,MAAME,aAAa,GACjB,+EAA+E,GAC/EC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,oBAAoB,GAAGC,MAAM,CAACC,kBAAkB,IAAI,IAAI;AAE9D,MAAMC,uBAAuB,GAAGH,oBAAoB,GAChDP,OAAO,CAAC,2BAA2B,CAAC,CAACM,OAAO,GAC5CK,0BAAa,CAACC,iBAAiB;AAEnC,MAAMA,iBAAiB,GAAGF,uBAAuB,GAC7CA,uBAAuB,GACvB,IAAIG,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACb,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEE,SAASc,aAAaA,CAAA,EAAW;EACtC,OAAOJ,iBAAiB,CAACI,aAAa,CAAC,CAAC;AAC1C","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativePowerSyncOpSqlite.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAMlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,mBAAmB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { BaseObserver, RowUpdateType } from '@powersync/common';
|
|
4
|
+
export class OPSQLiteConnection extends BaseObserver {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
super();
|
|
7
|
+
this.options = options;
|
|
8
|
+
this.DB = options.baseDB;
|
|
9
|
+
|
|
10
|
+
// link table update commands
|
|
11
|
+
this.DB.updateHook(update => {
|
|
12
|
+
this.iterateListeners(cb => {
|
|
13
|
+
let opType;
|
|
14
|
+
switch (update.operation) {
|
|
15
|
+
case 'INSERT':
|
|
16
|
+
opType = RowUpdateType.SQLITE_INSERT;
|
|
17
|
+
break;
|
|
18
|
+
case 'DELETE':
|
|
19
|
+
opType = RowUpdateType.SQLITE_DELETE;
|
|
20
|
+
break;
|
|
21
|
+
case 'UPDATE':
|
|
22
|
+
opType = RowUpdateType.SQLITE_UPDATE;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
cb.tablesUpdated?.({
|
|
26
|
+
table: update.table,
|
|
27
|
+
opType,
|
|
28
|
+
rowId: update.rowId
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
close() {
|
|
34
|
+
return this.DB.close();
|
|
35
|
+
}
|
|
36
|
+
async execute(query, params) {
|
|
37
|
+
const res = await this.DB.execute(query, params);
|
|
38
|
+
return {
|
|
39
|
+
insertId: res.insertId,
|
|
40
|
+
rowsAffected: res.rowsAffected,
|
|
41
|
+
rows: {
|
|
42
|
+
_array: res.rows ?? [],
|
|
43
|
+
length: res.rows?.length ?? 0,
|
|
44
|
+
item: index => res.rows?.[index]
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async executeBatch(query, params = []) {
|
|
49
|
+
const tuple = [[query, params[0]]];
|
|
50
|
+
params.slice(1).forEach(p => tuple.push([query, p]));
|
|
51
|
+
const result = await this.DB.executeBatch(tuple);
|
|
52
|
+
return {
|
|
53
|
+
rowsAffected: result.rowsAffected ?? 0
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async getAll(sql, parameters) {
|
|
57
|
+
const result = await this.DB.execute(sql, parameters);
|
|
58
|
+
return result.rows ?? [];
|
|
59
|
+
}
|
|
60
|
+
async getOptional(sql, parameters) {
|
|
61
|
+
const result = await this.DB.execute(sql, parameters);
|
|
62
|
+
return result.rows?.[0] ?? null;
|
|
63
|
+
}
|
|
64
|
+
async get(sql, parameters) {
|
|
65
|
+
const result = await this.getOptional(sql, parameters);
|
|
66
|
+
if (!result) {
|
|
67
|
+
throw new Error('Result set is empty');
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=OPSQLiteConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BaseObserver","RowUpdateType","OPSQLiteConnection","constructor","options","DB","baseDB","updateHook","update","iterateListeners","cb","opType","operation","SQLITE_INSERT","SQLITE_DELETE","SQLITE_UPDATE","tablesUpdated","table","rowId","close","execute","query","params","res","insertId","rowsAffected","rows","_array","length","item","index","executeBatch","tuple","slice","forEach","p","push","result","getAll","sql","parameters","getOptional","get","Error"],"sourceRoot":"../../../src","sources":["db/OPSQLiteConnection.ts"],"mappings":";;AACA,SAASA,YAAY,EAAkCC,aAAa,QAAQ,mBAAmB;AAM/F,OAAO,MAAMC,kBAAkB,SAASF,YAAY,CAAoB;EAEtEG,WAAWA,CAAWC,OAAkC,EAAE;IACxD,KAAK,CAAC,CAAC;IAAC,KADYA,OAAkC,GAAlCA,OAAkC;IAEtD,IAAI,CAACC,EAAE,GAAGD,OAAO,CAACE,MAAM;;IAExB;IACA,IAAI,CAACD,EAAE,CAACE,UAAU,CAAEC,MAAM,IAAK;MAC7B,IAAI,CAACC,gBAAgB,CAAEC,EAAE,IAAK;QAC5B,IAAIC,MAAqB;QACzB,QAAQH,MAAM,CAACI,SAAS;UACtB,KAAK,QAAQ;YACXD,MAAM,GAAGV,aAAa,CAACY,aAAa;YACpC;UACF,KAAK,QAAQ;YACXF,MAAM,GAAGV,aAAa,CAACa,aAAa;YACpC;UACF,KAAK,QAAQ;YACXH,MAAM,GAAGV,aAAa,CAACc,aAAa;YACpC;QACJ;QACAL,EAAE,CAACM,aAAa,GAAG;UACjBC,KAAK,EAAET,MAAM,CAACS,KAAK;UACnBN,MAAM;UACNO,KAAK,EAAEV,MAAM,CAACU;QAChB,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ,CAAC,CAAC;EACJ;EAEAC,KAAKA,CAAA,EAAG;IACN,OAAO,IAAI,CAACd,EAAE,CAACc,KAAK,CAAC,CAAC;EACxB;EAEA,MAAMC,OAAOA,CAACC,KAAa,EAAEC,MAAc,EAAwB;IACjE,MAAMC,GAAG,GAAG,MAAM,IAAI,CAAClB,EAAE,CAACe,OAAO,CAACC,KAAK,EAAEC,MAAM,CAAC;IAChD,OAAO;MACLE,QAAQ,EAAED,GAAG,CAACC,QAAQ;MACtBC,YAAY,EAAEF,GAAG,CAACE,YAAY;MAC9BC,IAAI,EAAE;QACJC,MAAM,EAAEJ,GAAG,CAACG,IAAI,IAAI,EAAE;QACtBE,MAAM,EAAEL,GAAG,CAACG,IAAI,EAAEE,MAAM,IAAI,CAAC;QAC7BC,IAAI,EAAGC,KAAa,IAAKP,GAAG,CAACG,IAAI,GAAGI,KAAK;MAC3C;IACF,CAAC;EACH;EAEA,MAAMC,YAAYA,CAACV,KAAa,EAAEC,MAAe,GAAG,EAAE,EAAwB;IAC5E,MAAMU,KAAsB,GAAG,CAAC,CAACX,KAAK,EAAEC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnDA,MAAM,CAACW,KAAK,CAAC,CAAC,CAAC,CAACC,OAAO,CAAEC,CAAC,IAAKH,KAAK,CAACI,IAAI,CAAC,CAACf,KAAK,EAAEc,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAME,MAAM,GAAG,MAAM,IAAI,CAAChC,EAAE,CAAC0B,YAAY,CAACC,KAAK,CAAC;IAChD,OAAO;MACLP,YAAY,EAAEY,MAAM,CAACZ,YAAY,IAAI;IACvC,CAAC;EACH;EAEA,MAAMa,MAAMA,CAAIC,GAAW,EAAEC,UAAkB,EAAgB;IAC7D,MAAMH,MAAM,GAAG,MAAM,IAAI,CAAChC,EAAE,CAACe,OAAO,CAACmB,GAAG,EAAEC,UAAU,CAAC;IACrD,OAAOH,MAAM,CAACX,IAAI,IAAI,EAAE;EAC1B;EAEA,MAAMe,WAAWA,CAAIF,GAAW,EAAEC,UAAkB,EAAqB;IACvE,MAAMH,MAAM,GAAG,MAAM,IAAI,CAAChC,EAAE,CAACe,OAAO,CAACmB,GAAG,EAAEC,UAAU,CAAC;IACrD,OAAOH,MAAM,CAACX,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI;EACjC;EAEA,MAAMgB,GAAGA,CAAIH,GAAW,EAAEC,UAAkB,EAAc;IACxD,MAAMH,MAAM,GAAG,MAAM,IAAI,CAACI,WAAW,CAACF,GAAG,EAAEC,UAAU,CAAC;IACtD,IAAI,CAACH,MAAM,EAAE;MACX,MAAM,IAAIM,KAAK,CAAC,qBAAqB,CAAC;IACxC;IACA,OAAON,MAAM;EACf;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { BaseObserver } from '@powersync/common';
|
|
4
|
+
import { ANDROID_DATABASE_PATH, IOS_LIBRARY_PATH, open } from '@op-engineering/op-sqlite';
|
|
5
|
+
import Lock from 'async-lock';
|
|
6
|
+
import { OPSQLiteConnection } from './OPSQLiteConnection';
|
|
7
|
+
import { NativeModules, Platform } from 'react-native';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Adapter for React Native Quick SQLite
|
|
11
|
+
*/
|
|
12
|
+
var LockType = /*#__PURE__*/function (LockType) {
|
|
13
|
+
LockType["READ"] = "read";
|
|
14
|
+
LockType["WRITE"] = "write";
|
|
15
|
+
return LockType;
|
|
16
|
+
}(LockType || {});
|
|
17
|
+
const READ_CONNECTIONS = 5;
|
|
18
|
+
export class OPSQLiteDBAdapter extends BaseObserver {
|
|
19
|
+
constructor(options) {
|
|
20
|
+
super();
|
|
21
|
+
this.options = options;
|
|
22
|
+
this.name = this.options.name;
|
|
23
|
+
this.locks = new Lock();
|
|
24
|
+
this.readConnections = null;
|
|
25
|
+
this.writeConnection = null;
|
|
26
|
+
this.initialized = this.init();
|
|
27
|
+
}
|
|
28
|
+
async init() {
|
|
29
|
+
const {
|
|
30
|
+
lockTimeoutMs,
|
|
31
|
+
journalMode,
|
|
32
|
+
journalSizeLimit,
|
|
33
|
+
synchronous
|
|
34
|
+
} = this.options.sqliteOptions;
|
|
35
|
+
// const { dbFilename, dbLocation } = this.options;
|
|
36
|
+
const dbFilename = this.options.name;
|
|
37
|
+
//This is needed because an undefined dbLocation will cause the open function to fail
|
|
38
|
+
const location = this.getDbLocation(this.options.dbLocation);
|
|
39
|
+
const DB = open({
|
|
40
|
+
name: dbFilename,
|
|
41
|
+
location: location
|
|
42
|
+
});
|
|
43
|
+
const statements = [`PRAGMA busy_timeout = ${lockTimeoutMs}`, `PRAGMA journal_mode = ${journalMode}`, `PRAGMA journal_size_limit = ${journalSizeLimit}`, `PRAGMA synchronous = ${synchronous}`];
|
|
44
|
+
for (const statement of statements) {
|
|
45
|
+
for (let tries = 0; tries < 30; tries++) {
|
|
46
|
+
try {
|
|
47
|
+
await DB.execute(statement);
|
|
48
|
+
break;
|
|
49
|
+
} catch (e) {
|
|
50
|
+
if (e instanceof Error && e.message.includes('database is locked') && tries < 29) {
|
|
51
|
+
continue;
|
|
52
|
+
} else {
|
|
53
|
+
throw e;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
this.loadExtension(DB);
|
|
59
|
+
await DB.execute('SELECT powersync_init()');
|
|
60
|
+
this.readConnections = [];
|
|
61
|
+
for (let i = 0; i < READ_CONNECTIONS; i++) {
|
|
62
|
+
// Workaround to create read-only connections
|
|
63
|
+
let dbName = './'.repeat(i + 1) + dbFilename;
|
|
64
|
+
const conn = await this.openConnection(location, dbName);
|
|
65
|
+
await conn.execute('PRAGMA query_only = true');
|
|
66
|
+
this.readConnections.push(conn);
|
|
67
|
+
}
|
|
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
|
+
}
|
|
77
|
+
async openConnection(dbLocation, filenameOverride) {
|
|
78
|
+
const DB = open({
|
|
79
|
+
name: filenameOverride ?? this.options.name,
|
|
80
|
+
location: dbLocation
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
//Load extension for all connections
|
|
84
|
+
this.loadExtension(DB);
|
|
85
|
+
await DB.execute('SELECT powersync_init()');
|
|
86
|
+
return new OPSQLiteConnection({
|
|
87
|
+
baseDB: DB
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
getDbLocation(dbLocation) {
|
|
91
|
+
if (Platform.OS === 'ios') {
|
|
92
|
+
return dbLocation ?? IOS_LIBRARY_PATH;
|
|
93
|
+
} else {
|
|
94
|
+
return dbLocation ?? ANDROID_DATABASE_PATH;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
loadExtension(DB) {
|
|
98
|
+
if (Platform.OS === 'ios') {
|
|
99
|
+
const bundlePath = NativeModules.PowerSyncOpSqlite.getBundlePath();
|
|
100
|
+
const libPath = `${bundlePath}/Frameworks/powersync-sqlite-core.framework/powersync-sqlite-core`;
|
|
101
|
+
DB.loadExtension(libPath, 'sqlite3_powersync_init');
|
|
102
|
+
} else {
|
|
103
|
+
DB.loadExtension('libpowersync', 'sqlite3_powersync_init');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
close() {
|
|
107
|
+
this.initialized.then(() => {
|
|
108
|
+
this.writeConnection.close();
|
|
109
|
+
this.readConnections.forEach(c => c.close());
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
async readLock(fn, options) {
|
|
113
|
+
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
|
+
return new Promise(async (resolve, reject) => {
|
|
125
|
+
try {
|
|
126
|
+
await this.locks.acquire(sortedConnections[0].lockKey, async () => {
|
|
127
|
+
resolve(await fn(sortedConnections[0].connection));
|
|
128
|
+
}, {
|
|
129
|
+
timeout: options?.timeoutMs
|
|
130
|
+
});
|
|
131
|
+
} catch (ex) {
|
|
132
|
+
reject(ex);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async writeLock(fn, options) {
|
|
137
|
+
await this.initialized;
|
|
138
|
+
return new Promise(async (resolve, reject) => {
|
|
139
|
+
try {
|
|
140
|
+
await this.locks.acquire(LockType.WRITE, async () => {
|
|
141
|
+
resolve(await fn(this.writeConnection));
|
|
142
|
+
}, {
|
|
143
|
+
timeout: options?.timeoutMs
|
|
144
|
+
});
|
|
145
|
+
} catch (ex) {
|
|
146
|
+
reject(ex);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
readTransaction(fn, options) {
|
|
151
|
+
return this.readLock(ctx => this.internalTransaction(ctx, fn));
|
|
152
|
+
}
|
|
153
|
+
writeTransaction(fn, options) {
|
|
154
|
+
return this.writeLock(ctx => this.internalTransaction(ctx, fn));
|
|
155
|
+
}
|
|
156
|
+
getAll(sql, parameters) {
|
|
157
|
+
return this.readLock(ctx => ctx.getAll(sql, parameters));
|
|
158
|
+
}
|
|
159
|
+
getOptional(sql, parameters) {
|
|
160
|
+
return this.readLock(ctx => ctx.getOptional(sql, parameters));
|
|
161
|
+
}
|
|
162
|
+
get(sql, parameters) {
|
|
163
|
+
return this.readLock(ctx => ctx.get(sql, parameters));
|
|
164
|
+
}
|
|
165
|
+
execute(query, params) {
|
|
166
|
+
return this.writeLock(ctx => ctx.execute(query, params));
|
|
167
|
+
}
|
|
168
|
+
async executeBatch(query, params = []) {
|
|
169
|
+
return this.writeLock(ctx => ctx.executeBatch(query, params));
|
|
170
|
+
}
|
|
171
|
+
async internalTransaction(connection, fn) {
|
|
172
|
+
let finalized = false;
|
|
173
|
+
const commit = async () => {
|
|
174
|
+
if (finalized) {
|
|
175
|
+
return {
|
|
176
|
+
rowsAffected: 0
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
finalized = true;
|
|
180
|
+
return connection.execute('COMMIT');
|
|
181
|
+
};
|
|
182
|
+
const rollback = async () => {
|
|
183
|
+
if (finalized) {
|
|
184
|
+
return {
|
|
185
|
+
rowsAffected: 0
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
finalized = true;
|
|
189
|
+
return connection.execute('ROLLBACK');
|
|
190
|
+
};
|
|
191
|
+
try {
|
|
192
|
+
await connection.execute('BEGIN');
|
|
193
|
+
const result = await fn({
|
|
194
|
+
execute: (query, params) => connection.execute(query, params),
|
|
195
|
+
get: (query, params) => connection.get(query, params),
|
|
196
|
+
getAll: (query, params) => connection.getAll(query, params),
|
|
197
|
+
getOptional: (query, params) => connection.getOptional(query, params),
|
|
198
|
+
commit,
|
|
199
|
+
rollback
|
|
200
|
+
});
|
|
201
|
+
await commit();
|
|
202
|
+
return result;
|
|
203
|
+
} catch (ex) {
|
|
204
|
+
await rollback();
|
|
205
|
+
throw ex;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=OPSqliteAdapter.js.map
|
|
@@ -0,0 +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","sqliteOptions","dbFilename","location","getDbLocation","dbLocation","DB","statements","statement","tries","execute","e","Error","message","includes","loadExtension","i","dbName","repeat","conn","openConnection","push","baseDB","registerListener","tablesUpdated","notification","iterateListeners","cb","filenameOverride","OS","bundlePath","PowerSyncOpSqlite","getBundlePath","libPath","close","then","forEach","c","readLock","fn","sortedConnections","map","connection","index","lockKey","READ","sort","a","b","aBusy","isBusy","bBusy","Promise","resolve","reject","acquire","timeout","timeoutMs","ex","writeLock","WRITE","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":[]}
|