Skip to content

Commit 42ca457

Browse files
update api from react-native-quick-sqlite
1 parent c79a11a commit 42ca457

File tree

7 files changed

+67
-52
lines changed

7 files changed

+67
-52
lines changed

packages/powersync-sdk-common/src/client/AbstractPowerSyncDatabase.ts

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -140,19 +140,19 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
140140

141141
// TODO DB name, verify this is necessary with extension
142142
await this.database.writeTransaction(async (tx) => {
143-
await tx.execute('DELETE FROM ps_oplog WHERE 1');
144-
await tx.execute('DELETE FROM ps_crud WHERE 1');
145-
await tx.execute('DELETE FROM ps_buckets WHERE 1');
143+
await tx.executeAsync('DELETE FROM ps_oplog WHERE 1');
144+
await tx.executeAsync('DELETE FROM ps_crud WHERE 1');
145+
await tx.executeAsync('DELETE FROM ps_buckets WHERE 1');
146146

147-
const existingTableRows = await tx.execute(
147+
const existingTableRows = await tx.executeAsync(
148148
"SELECT name FROM sqlite_master WHERE type='table' AND name GLOB 'ps_data_*'"
149149
);
150150

151151
if (!existingTableRows.rows.length) {
152152
return;
153153
}
154154
for (const row of existingTableRows.rows._array) {
155-
await tx.execute(`DELETE FROM ${row.name} WHERE 1`);
155+
await tx.executeAsync(`DELETE FROM ${row.name} WHERE 1`);
156156
}
157157
});
158158
}
@@ -178,12 +178,14 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
178178
async getUploadQueueStats(includeSize?: boolean): Promise<UploadQueueStats> {
179179
return this.readTransaction(async (tx) => {
180180
if (includeSize) {
181-
const result = await tx.execute('SELECT SUM(cast(data as blob) + 20) as size, count(*) as count FROM ps_crud');
181+
const result = await tx.executeAsync(
182+
'SELECT SUM(cast(data as blob) + 20) as size, count(*) as count FROM ps_crud'
183+
);
182184

183185
const row = result.rows.item(0);
184186
return new UploadQueueStats(row?.count ?? 0, row?.size ?? 0);
185187
} else {
186-
const result = await tx.execute('SELECT count(*) as count FROM ps_crud');
188+
const result = await tx.executeAsync('SELECT count(*) as count FROM ps_crud');
187189
const row = result.rows.item(0);
188190
return new UploadQueueStats(row?.count ?? 0);
189191
}
@@ -226,11 +228,11 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
226228
const last = all[all.length - 1];
227229
return new CrudBatch(all, haveMore, async (writeCheckpoint?: string) => {
228230
await this.writeTransaction(async (tx) => {
229-
await tx.execute('DELETE FROM ps_crud WHERE id <= ?', [last.clientId]);
230-
if (writeCheckpoint != null && (await tx.execute('SELECT 1 FROM ps_crud LIMIT 1')) == null) {
231-
await tx.execute("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [writeCheckpoint]);
231+
await tx.executeAsync('DELETE FROM ps_crud WHERE id <= ?', [last.clientId]);
232+
if (writeCheckpoint != null && (await tx.executeAsync('SELECT 1 FROM ps_crud LIMIT 1')) == null) {
233+
await tx.executeAsync("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [writeCheckpoint]);
232234
} else {
233-
await tx.execute("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [
235+
await tx.executeAsync("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [
234236
this.bucketStorageAdapter.getMaxOpId()
235237
]);
236238
}
@@ -253,7 +255,7 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
253255
*/
254256
async getNextCrudTransaction(): Promise<CrudTransaction> {
255257
return await this.readTransaction(async (tx) => {
256-
const first = await tx.execute('SELECT id, tx_id, data FROM ps_crud ORDER BY id ASC LIMIT 1');
258+
const first = await tx.executeAsync('SELECT id, tx_id, data FROM ps_crud ORDER BY id ASC LIMIT 1');
257259

258260
if (!first.rows.length) {
259261
return null;
@@ -264,7 +266,9 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
264266
if (!txId) {
265267
all = [CrudEntry.fromRow(first.rows.item(0))];
266268
} else {
267-
const result = await tx.execute('SELECT id, tx_id, data FROM ps_crud WHERE tx_id = ? ORDER BY id ASC', [txId]);
269+
const result = await tx.executeAsync('SELECT id, tx_id, data FROM ps_crud WHERE tx_id = ? ORDER BY id ASC', [
270+
txId
271+
]);
268272
all = result.rows._array.map((row) => CrudEntry.fromRow(row));
269273
}
270274

@@ -274,14 +278,14 @@ export abstract class AbstractPowerSyncDatabase extends BaseObserver<PowerSyncDB
274278
all,
275279
async (writeCheckpoint?: string) => {
276280
await this.writeTransaction(async (tx) => {
277-
await tx.execute('DELETE FROM ps_crud WHERE id <= ?', [last.clientId]);
281+
await tx.executeAsync('DELETE FROM ps_crud WHERE id <= ?', [last.clientId]);
278282
if (writeCheckpoint) {
279-
const check = await tx.execute('SELECT 1 FROM ps_crud LIMIT 1');
283+
const check = await tx.executeAsync('SELECT 1 FROM ps_crud LIMIT 1');
280284
if (!check.rows?.length) {
281-
await tx.execute("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [writeCheckpoint]);
285+
await tx.executeAsync("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [writeCheckpoint]);
282286
}
283287
} else {
284-
await tx.execute("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [
288+
await tx.executeAsync("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [
285289
this.bucketStorageAdapter.getMaxOpId()
286290
]);
287291
}

packages/powersync-sdk-common/src/client/sync/bucket/SqliteBucketStorage.ts

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export class SqliteBucketStorage implements BucketStorageAdapter {
6161
await this.writeTransaction(async (tx) => {
6262
let count = 0;
6363
for (let b of batch.buckets) {
64-
const result = await tx.execute('INSERT INTO powersync_operations(op, data) VALUES(?, ?)', [
64+
const result = await tx.executeAsync('INSERT INTO powersync_operations(op, data) VALUES(?, ?)', [
6565
'save',
6666
JSON.stringify({ buckets: [b.toJSON()] })
6767
]);
@@ -92,14 +92,14 @@ export class SqliteBucketStorage implements BucketStorageAdapter {
9292
this.logger.debug('Deleting bucket', bucket);
9393
// This
9494
await this.writeTransaction(async (tx) => {
95-
await tx.execute(
95+
await tx.executeAsync(
9696
`UPDATE ps_oplog SET op=${OpTypeEnum.REMOVE}, data=NULL WHERE op=${OpTypeEnum.PUT} AND superseded=0 AND bucket=?`,
9797
[bucket]
9898
);
9999
// Rename bucket
100-
await tx.execute('UPDATE ps_oplog SET bucket=? WHERE bucket=?', [newName, bucket]);
101-
await tx.execute('DELETE FROM ps_buckets WHERE name = ?', [bucket]);
102-
await tx.execute(
100+
await tx.executeAsync('UPDATE ps_oplog SET bucket=? WHERE bucket=?', [newName, bucket]);
101+
await tx.executeAsync('DELETE FROM ps_buckets WHERE name = ?', [bucket]);
102+
await tx.executeAsync(
103103
'INSERT INTO ps_buckets(name, pending_delete, last_op) SELECT ?, 1, IFNULL(MAX(op_id), 0) FROM ps_oplog WHERE bucket = ?',
104104
[newName, newName]
105105
);
@@ -132,13 +132,13 @@ export class SqliteBucketStorage implements BucketStorageAdapter {
132132

133133
const bucketNames = checkpoint.buckets.map((b) => b.bucket);
134134
await this.writeTransaction(async (tx) => {
135-
await tx.execute(`UPDATE ps_buckets SET last_op = ? WHERE name IN (SELECT json_each.value FROM json_each(?))`, [
136-
checkpoint.last_op_id,
137-
JSON.stringify(bucketNames)
138-
]);
135+
await tx.executeAsync(
136+
`UPDATE ps_buckets SET last_op = ? WHERE name IN (SELECT json_each.value FROM json_each(?))`,
137+
[checkpoint.last_op_id, JSON.stringify(bucketNames)]
138+
);
139139

140140
if (checkpoint.write_checkpoint) {
141-
await tx.execute("UPDATE ps_buckets SET last_op = ? WHERE name = '$local'", [checkpoint.write_checkpoint]);
141+
await tx.executeAsync("UPDATE ps_buckets SET last_op = ? WHERE name = '$local'", [checkpoint.write_checkpoint]);
142142
}
143143
});
144144

@@ -167,7 +167,7 @@ export class SqliteBucketStorage implements BucketStorageAdapter {
167167
* It's best to execute this on the same thread
168168
* https://github.com/journeyapps/powersync-sqlite-core/blob/40554dc0e71864fe74a0cb00f1e8ca4e328ff411/crates/sqlite/sqlite/sqlite3.h#L2578
169169
*/
170-
const { insertId: result } = await tx.execute('INSERT INTO powersync_operations(op, data) VALUES(?, ?)', [
170+
const { insertId: result } = await tx.executeAsync('INSERT INTO powersync_operations(op, data) VALUES(?, ?)', [
171171
'sync_local',
172172
''
173173
]);
@@ -219,10 +219,10 @@ export class SqliteBucketStorage implements BucketStorageAdapter {
219219
private async deletePendingBuckets() {
220220
if (this.pendingBucketDeletes !== false) {
221221
await this.writeTransaction(async (tx) => {
222-
await tx.execute(
222+
await tx.executeAsync(
223223
'DELETE FROM ps_oplog WHERE bucket IN (SELECT name FROM ps_buckets WHERE pending_delete = 1 AND last_applied_op = last_op AND last_op >= target_op)'
224224
);
225-
await tx.execute(
225+
await tx.executeAsync(
226226
'DELETE FROM ps_buckets WHERE pending_delete = 1 AND last_applied_op = last_op AND last_op >= target_op'
227227
);
228228
});
@@ -237,7 +237,7 @@ export class SqliteBucketStorage implements BucketStorageAdapter {
237237
}
238238

239239
await this.writeTransaction(async (tx) => {
240-
await tx.execute('INSERT INTO powersync_operations(op, data) VALUES (?, ?)', ['clear_remove_ops', '']);
240+
await tx.executeAsync('INSERT INTO powersync_operations(op, data) VALUES (?, ?)', ['clear_remove_ops', '']);
241241
});
242242
this.compactCounter = 0;
243243
}
@@ -262,14 +262,14 @@ export class SqliteBucketStorage implements BucketStorageAdapter {
262262
this.logger.debug(`[updateLocalTarget] Updating target to checkpoint ${opId}`);
263263

264264
return this.writeTransaction(async (tx) => {
265-
const anyData = await tx.execute('SELECT 1 FROM ps_crud LIMIT 1');
265+
const anyData = await tx.executeAsync('SELECT 1 FROM ps_crud LIMIT 1');
266266
if (!!anyData.rows?.length) {
267267
// if isNotEmpty
268268
this.logger.debug('updateLocalTarget', 'ps crud is not empty');
269269
return false;
270270
}
271271

272-
const rs = await tx.execute("SELECT seq FROM sqlite_sequence WHERE name = 'ps_crud'");
272+
const rs = await tx.executeAsync("SELECT seq FROM sqlite_sequence WHERE name = 'ps_crud'");
273273
if (!rs.rows?.length) {
274274
// assert isNotEmpty
275275
throw new Error('SQlite Sequence should not be empty');
@@ -283,7 +283,7 @@ export class SqliteBucketStorage implements BucketStorageAdapter {
283283
return false;
284284
}
285285

286-
const response = await tx.execute("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [opId]);
286+
const response = await tx.executeAsync("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [opId]);
287287
this.logger.debug(['[updateLocalTarget] Response from updating target_op ', JSON.stringify(response)]);
288288
return true;
289289
});
@@ -320,14 +320,14 @@ export class SqliteBucketStorage implements BucketStorageAdapter {
320320
haveMore: true,
321321
complete: async (writeCheckpoint?: string) => {
322322
return this.writeTransaction(async (tx) => {
323-
await tx.execute('DELETE FROM ps_crud WHERE id <= ?', [last.clientId]);
323+
await tx.executeAsync('DELETE FROM ps_crud WHERE id <= ?', [last.clientId]);
324324
if (writeCheckpoint) {
325-
const crudResult = await tx.execute('SELECT 1 FROM ps_crud LIMIT 1');
325+
const crudResult = await tx.executeAsync('SELECT 1 FROM ps_crud LIMIT 1');
326326
if (crudResult.rows?.length) {
327-
await tx.execute("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [writeCheckpoint]);
327+
await tx.executeAsync("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [writeCheckpoint]);
328328
}
329329
} else {
330-
await tx.execute("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [this.getMaxOpId()]);
330+
await tx.executeAsync("UPDATE ps_buckets SET target_op = ? WHERE name='$local'", [this.getMaxOpId()]);
331331
}
332332
});
333333
}

packages/powersync-sdk-common/src/db/DBAdapter.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,15 @@ export interface DBGetUtils {
3838
}
3939

4040
export interface LockContext extends DBGetUtils {
41-
execute: (query: string, params?: any[] | undefined) => Promise<QueryResult>;
41+
execute: (query: string, params?: any[] | undefined) => QueryResult;
42+
executeAsync: (query: string, params?: any[] | undefined) => Promise<QueryResult>;
4243
}
4344

4445
export interface Transaction extends LockContext {
45-
commit: () => Promise<QueryResult>;
46-
rollback: () => Promise<QueryResult>;
46+
commit: () => QueryResult;
47+
commitAsync: () => Promise<QueryResult>;
48+
rollback: () => QueryResult;
49+
rollbackAsync: () => Promise<QueryResult>;
4750
}
4851

4952
/**

packages/powersync-sdk-react-native/src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
DBGetUtils,
99
QueryResult
1010
} from '@journeyapps/powersync-sdk-common';
11-
import { ConcurrentQuickSQLiteConnection } from '@journeyapps/react-native-quick-sqlite';
11+
import { QuickSQLiteConnection } from '@journeyapps/react-native-quick-sqlite';
1212

1313
/**
1414
* Adapter for React Native Quick SQLite
@@ -18,14 +18,14 @@ export class RNQSDBAdapter extends BaseObserver<DBAdapterListener> implements DB
1818
getOptional: <T>(sql: string, parameters?: any[]) => Promise<T | null>;
1919
get: <T>(sql: string, parameters?: any[]) => Promise<T>;
2020

21-
constructor(protected baseDB: ConcurrentQuickSQLiteConnection) {
21+
constructor(protected baseDB: QuickSQLiteConnection) {
2222
super();
2323
// link table update commands
2424
baseDB.registerUpdateHook((update) => {
2525
this.iterateListeners((cb) => cb.tablesUpdated?.(update));
2626
});
2727

28-
const topLevelUtils = this.generateDBHelpers({ execute: this.baseDB.execute });
28+
const topLevelUtils = this.generateDBHelpers({ executeAsync: this.baseDB.execute });
2929
this.getAll = topLevelUtils.getAll;
3030
this.getOptional = topLevelUtils.getOptional;
3131
this.get = topLevelUtils.get;
@@ -60,7 +60,7 @@ export class RNQSDBAdapter extends BaseObserver<DBAdapterListener> implements DB
6060
* @param tx
6161
* @returns
6262
*/
63-
private generateDBHelpers<T extends { execute: (sql: string, params?: any[]) => Promise<QueryResult> }>(
63+
private generateDBHelpers<T extends { executeAsync: (sql: string, params?: any[]) => Promise<QueryResult> }>(
6464
tx: T
6565
): T & DBGetUtils {
6666
return {
@@ -69,23 +69,23 @@ export class RNQSDBAdapter extends BaseObserver<DBAdapterListener> implements DB
6969
* Execute a read-only query and return results
7070
*/
7171
async getAll<T>(sql: string, parameters?: any[]): Promise<T[]> {
72-
const res = await tx.execute(sql, parameters);
72+
const res = await tx.executeAsync(sql, parameters);
7373
return res.rows?._array ?? [];
7474
},
7575

7676
/**
7777
* Execute a read-only query and return the first result, or null if the ResultSet is empty.
7878
*/
7979
async getOptional<T>(sql: string, parameters?: any[]): Promise<T | null> {
80-
const res = await tx.execute(sql, parameters);
80+
const res = await tx.executeAsync(sql, parameters);
8181
return res.rows?.item(0) ?? null;
8282
},
8383

8484
/**
8585
* Execute a read-only query and return the first result, error if the ResultSet is empty.
8686
*/
8787
async get<T>(sql: string, parameters?: any[]): Promise<T> {
88-
const res = await tx.execute(sql, parameters);
88+
const res = await tx.executeAsync(sql, parameters);
8989
const first = res.rows?.item(0);
9090
if (!first) {
9191
throw new Error('Result set is empty');

packages/powersync-sdk-react-native/src/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { openConcurrent } from '@journeyapps/react-native-quick-sqlite';
1+
import { open } from '@journeyapps/react-native-quick-sqlite';
22

33
import {
44
AbstractPowerSyncDatabase,
@@ -19,7 +19,7 @@ export class RNQSPowerSyncDatabaseOpenFactory extends AbstractPowerSyncDatabaseO
1919
* in the options (if provided)
2020
* https://github.com/margelo/react-native-quick-sqlite/blob/main/README.md#loading-existing-dbs
2121
*/
22-
return new RNQSDBAdapter(openConcurrent(this.options.dbFilename, this.options.dbLocation));
22+
return new RNQSDBAdapter(open(this.options.dbFilename, { location: this.options.dbLocation }));
2323
}
2424

2525
generateInstance(options: PowerSyncDatabaseOptions): AbstractPowerSyncDatabase {

yarn.lock

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3349,7 +3349,7 @@ ajv-keywords@^5.1.0:
33493349
dependencies:
33503350
fast-deep-equal "^3.1.3"
33513351

3352-
ajv@^8.0.0, ajv@^8.9.0:
3352+
ajv@^8.0.0, ajv@^8.11.0, ajv@^8.9.0:
33533353
version "8.12.0"
33543354
resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1"
33553355
integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
@@ -5086,6 +5086,14 @@ expo-asset@~8.10.1:
50865086
path-browserify "^1.0.0"
50875087
url-parse "^1.5.9"
50885088

5089+
expo-build-properties@~0.8.3:
5090+
version "0.8.3"
5091+
resolved "https://registry.npmjs.org/expo-build-properties/-/expo-build-properties-0.8.3.tgz#fbfa156e9619bebda71c66af9a26ebc3490b2365"
5092+
integrity sha512-kEDDuAadHqJTkvCGK4fXYHVrePiJO1DjyW95AicmwuGwQvGJydYFbuoauf9ybAU+4UH4arhbce8gHI3ZpIj3Jw==
5093+
dependencies:
5094+
ajv "^8.11.0"
5095+
semver "^7.5.3"
5096+
50895097
expo-constants@~14.4.2:
50905098
version "14.4.2"
50915099
resolved "https://registry.npmjs.org/expo-constants/-/expo-constants-14.4.2.tgz#cac5e8b524069545739b8d8595ce96cc5be6578c"

0 commit comments

Comments
 (0)