@powersync/react-native 0.0.0-dev-20260525085311 → 0.0.0-dev-20260630141119

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.
Files changed (64) hide show
  1. package/README.md +72 -6
  2. package/android/build.gradle +90 -0
  3. package/android/gradle.properties +4 -0
  4. package/android/src/main/AndroidManifest.xml +3 -0
  5. package/android/src/main/AndroidManifestNew.xml +2 -0
  6. package/android/src/main/java/com/powersync/opsqlite/PowerSyncOpSqlitePackage.kt +46 -0
  7. package/ios/PowerSyncOpSqlite.h +5 -0
  8. package/ios/PowerSyncOpSqlite.mm +6 -0
  9. package/lib/db/PowerSyncDatabase.d.ts +9 -10
  10. package/lib/db/PowerSyncDatabase.js +33 -25
  11. package/lib/db/PowerSyncDatabase.js.map +1 -1
  12. package/lib/db/adapters/op-sqlite/OPSQLiteConnection.d.ts +25 -0
  13. package/lib/db/adapters/op-sqlite/OPSQLiteConnection.js +63 -0
  14. package/lib/db/adapters/op-sqlite/OPSQLiteConnection.js.map +1 -0
  15. package/lib/db/adapters/op-sqlite/OPSqliteAdapter.d.ts +32 -0
  16. package/lib/db/adapters/op-sqlite/OPSqliteAdapter.js +203 -0
  17. package/lib/db/adapters/op-sqlite/OPSqliteAdapter.js.map +1 -0
  18. package/lib/db/adapters/op-sqlite/OPSqliteDBOpenFactory.d.ts +11 -0
  19. package/lib/db/adapters/op-sqlite/OPSqliteDBOpenFactory.js +21 -0
  20. package/lib/db/adapters/op-sqlite/OPSqliteDBOpenFactory.js.map +1 -0
  21. package/lib/db/adapters/op-sqlite/SqliteOptions.d.ts +68 -0
  22. package/lib/db/adapters/op-sqlite/SqliteOptions.js +37 -0
  23. package/lib/db/adapters/op-sqlite/SqliteOptions.js.map +1 -0
  24. package/lib/index.d.ts +1 -3
  25. package/lib/index.js +0 -3
  26. package/lib/index.js.map +1 -1
  27. package/lib/sync/bucket/ReactNativeBucketStorageAdapter.d.ts +1 -1
  28. package/lib/sync/bucket/ReactNativeBucketStorageAdapter.js +1 -1
  29. package/lib/sync/bucket/ReactNativeBucketStorageAdapter.js.map +1 -1
  30. package/lib/sync/stream/ReactNativeRemote.d.ts +11 -11
  31. package/lib/sync/stream/ReactNativeRemote.js +42 -66
  32. package/lib/sync/stream/ReactNativeRemote.js.map +1 -1
  33. package/lib/sync/stream/ReactNativeStreamingSyncImplementation.d.ts +2 -1
  34. package/lib/sync/stream/ReactNativeStreamingSyncImplementation.js +2 -1
  35. package/lib/sync/stream/ReactNativeStreamingSyncImplementation.js.map +1 -1
  36. package/lib/sync/stream/fetch.d.ts +13 -0
  37. package/lib/sync/stream/fetch.js +31 -0
  38. package/lib/sync/stream/fetch.js.map +1 -0
  39. package/package.json +20 -33
  40. package/powersync-react-native.podspec +32 -0
  41. package/src/db/PowerSyncDatabase.ts +58 -31
  42. package/src/db/adapters/op-sqlite/OPSQLiteConnection.ts +95 -0
  43. package/src/db/adapters/op-sqlite/OPSqliteAdapter.ts +245 -0
  44. package/src/db/adapters/op-sqlite/OPSqliteDBOpenFactory.ts +25 -0
  45. package/src/db/adapters/op-sqlite/SqliteOptions.ts +93 -0
  46. package/src/index.ts +1 -3
  47. package/src/sync/bucket/ReactNativeBucketStorageAdapter.ts +1 -1
  48. package/src/sync/stream/ReactNativeRemote.ts +49 -86
  49. package/src/sync/stream/ReactNativeStreamingSyncImplementation.ts +4 -4
  50. package/src/sync/stream/fetch.ts +45 -0
  51. package/dist/index.js +0 -8741
  52. package/dist/index.js.map +0 -1
  53. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.d.ts +0 -55
  54. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.js +0 -66
  55. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.js.map +0 -1
  56. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.d.ts +0 -19
  57. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.js +0 -34
  58. package/lib/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.js.map +0 -1
  59. package/lib/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.d.ts +0 -9
  60. package/lib/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.js +0 -45
  61. package/lib/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.js.map +0 -1
  62. package/src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts +0 -85
  63. package/src/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.ts +0 -44
  64. package/src/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.ts +0 -43
@@ -1,55 +0,0 @@
1
- import { BaseObserver, DBAdapter, DBAdapterListener, LockContext as PowerSyncLockContext, DBLockOptions, ConnectionPool, LockContext, Transaction } from '@powersync/common';
2
- import type { QuickSQLiteConnection, LockContext as RNQSLockContext } from '@journeyapps/react-native-quick-sqlite';
3
- import { QueryResult, SqlExecutor } from '@powersync/common/dist/index.cjs';
4
- declare class RNQSConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
5
- protected baseDB: QuickSQLiteConnection;
6
- name: string;
7
- constructor(baseDB: QuickSQLiteConnection, name: string);
8
- close(): void;
9
- readLock<T>(fn: (tx: PowerSyncLockContext) => Promise<T>, options?: DBLockOptions): Promise<T>;
10
- writeLock<T>(fn: (tx: PowerSyncLockContext) => Promise<T>, options?: DBLockOptions): Promise<T>;
11
- generateContext<T extends RNQSLockContext>(ctx: T): QuickSqliteContext;
12
- refreshSchema(): Promise<void>;
13
- }
14
- declare class QuickSqliteExecutor implements Omit<SqlExecutor, 'executeBatch'> {
15
- readonly context: RNQSLockContext;
16
- constructor(context: RNQSLockContext);
17
- execute(query: string, params?: any[]): Promise<import("@journeyapps/react-native-quick-sqlite").QueryResult>;
18
- /**
19
- * 'executeRaw' is not implemented in RNQS, this falls back to 'execute'.
20
- */
21
- executeRaw(query: string, params?: any[]): Promise<any[][]>;
22
- }
23
- declare const QuickSqliteContext_base: (new (...args: any[]) => {
24
- getAll<T>(sql: string, parameters?: any[]): Promise<T[]>;
25
- getOptional<T>(sql: string, parameters?: any[]): Promise<T | null>;
26
- get<T>(sql: string, parameters?: any[]): Promise<T>;
27
- executeBatch(query: string, params?: any[][]): Promise<import("@powersync/common").QueryResult>;
28
- execute: (query: string, params?: any[] | undefined) => Promise<import("@powersync/common").QueryResult>;
29
- executeRaw: (query: string, params?: any[] | undefined) => Promise<any[][]>;
30
- }) & typeof QuickSqliteExecutor;
31
- declare class QuickSqliteContext extends QuickSqliteContext_base implements LockContext {
32
- }
33
- declare const RNQSDBAdapter_base: (new (...args: any[]) => {
34
- readTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T>;
35
- writeTransaction<T>(fn: (tx: Transaction) => Promise<T>, options?: DBLockOptions): Promise<T>;
36
- getAll<T>(sql: string, parameters?: any[]): Promise<T[]>;
37
- getOptional<T>(sql: string, parameters?: any[]): Promise<T | null>;
38
- get<T>(sql: string, parameters?: any[]): Promise<T>;
39
- execute(query: string, params?: any[]): Promise<import("@powersync/common").QueryResult>;
40
- executeRaw(query: string, params?: any[]): Promise<any[][]>;
41
- executeBatch(query: string, params?: any[][]): Promise<import("@powersync/common").QueryResult>;
42
- name: string;
43
- close: () => void | Promise<void>;
44
- readLock: <T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions) => Promise<T>;
45
- writeLock: <T>(fn: (tx: LockContext) => Promise<T>, options?: DBLockOptions) => Promise<T>;
46
- refreshSchema: () => Promise<void>;
47
- registerListener(listener: Partial<DBAdapterListener>): () => void;
48
- }) & typeof RNQSConnectionPool;
49
- /**
50
- * Adapter for React Native Quick SQLite
51
- */
52
- export declare class RNQSDBAdapter extends RNQSDBAdapter_base implements DBAdapter {
53
- executeBatch(query: string, params?: any[][]): Promise<QueryResult>;
54
- }
55
- export {};
@@ -1,66 +0,0 @@
1
- import { BaseObserver, DBGetUtilsDefaultMixin, DBAdapterDefaultMixin } from '@powersync/common';
2
- class RNQSConnectionPool extends BaseObserver {
3
- baseDB;
4
- name;
5
- constructor(baseDB, name) {
6
- super();
7
- this.baseDB = baseDB;
8
- this.name = name;
9
- // link table update commands
10
- baseDB.registerTablesChangedHook((update) => {
11
- this.iterateListeners((cb) => cb.tablesUpdated?.(update));
12
- });
13
- }
14
- close() {
15
- return this.baseDB.close();
16
- }
17
- readLock(fn, options) {
18
- return this.baseDB.readLock((dbTx) => fn(this.generateContext(dbTx)), options);
19
- }
20
- writeLock(fn, options) {
21
- return this.baseDB.writeLock((dbTx) => fn(this.generateContext(dbTx)), options);
22
- }
23
- generateContext(ctx) {
24
- return new QuickSqliteContext(ctx);
25
- }
26
- async refreshSchema() {
27
- await this.baseDB.refreshSchema();
28
- }
29
- }
30
- class QuickSqliteExecutor {
31
- context;
32
- constructor(context) {
33
- this.context = context;
34
- }
35
- execute(query, params) {
36
- return this.context.execute(query, params);
37
- }
38
- /**
39
- * 'executeRaw' is not implemented in RNQS, this falls back to 'execute'.
40
- */
41
- async executeRaw(query, params) {
42
- const result = await this.context.execute(query, params);
43
- const rows = result.rows?._array ?? [];
44
- return rows.map((row) => Object.values(row));
45
- }
46
- }
47
- class QuickSqliteContext extends DBGetUtilsDefaultMixin(QuickSqliteExecutor) {
48
- }
49
- /**
50
- * Adapter for React Native Quick SQLite
51
- */
52
- export class RNQSDBAdapter extends DBAdapterDefaultMixin(RNQSConnectionPool) {
53
- // We don't want the default implementation here, RNQS does not support executeBatch for lock contexts so that would
54
- // be less efficient.
55
- async executeBatch(query, params = []) {
56
- const commands = [];
57
- for (let i = 0; i < params.length; i++) {
58
- commands.push([query, params[i]]);
59
- }
60
- const result = await this.baseDB.executeBatch(commands);
61
- return {
62
- rowsAffected: result.rowsAffected ? result.rowsAffected : 0
63
- };
64
- }
65
- }
66
- //# sourceMappingURL=RNQSDBAdapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RNQSDBAdapter.js","sourceRoot":"","sources":["../../../../src/db/adapters/react-native-quick-sqlite/RNQSDBAdapter.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- import { AbstractPowerSyncDatabase, AbstractPowerSyncDatabaseOpenFactory, DBAdapter, PowerSyncDatabaseOptions, PowerSyncOpenFactoryOptions, SQLOpenFactory } from '@powersync/common';
2
- /**
3
- * @deprecated {@link PowerSyncDatabase} can now be constructed directly
4
- * @example
5
- * ```typescript
6
- * const powersync = new PowerSyncDatabase({
7
- * database: {
8
- * dbFileName: 'powersync.db'
9
- * }
10
- * });
11
- * ```
12
- */
13
- export declare class RNQSPowerSyncDatabaseOpenFactory extends AbstractPowerSyncDatabaseOpenFactory {
14
- protected instanceGenerated: boolean;
15
- protected sqlOpenFactory: SQLOpenFactory;
16
- constructor(options: PowerSyncOpenFactoryOptions);
17
- protected openDB(): DBAdapter;
18
- generateInstance(options: PowerSyncDatabaseOptions): AbstractPowerSyncDatabase;
19
- }
@@ -1,34 +0,0 @@
1
- import { AbstractPowerSyncDatabaseOpenFactory } from '@powersync/common';
2
- import { PowerSyncDatabase } from '../../../db/PowerSyncDatabase';
3
- import { ReactNativeQuickSqliteOpenFactory } from './ReactNativeQuickSQLiteOpenFactory';
4
- /**
5
- * @deprecated {@link PowerSyncDatabase} can now be constructed directly
6
- * @example
7
- * ```typescript
8
- * const powersync = new PowerSyncDatabase({
9
- * database: {
10
- * dbFileName: 'powersync.db'
11
- * }
12
- * });
13
- * ```
14
- */
15
- export class RNQSPowerSyncDatabaseOpenFactory extends AbstractPowerSyncDatabaseOpenFactory {
16
- instanceGenerated;
17
- sqlOpenFactory;
18
- constructor(options) {
19
- super(options);
20
- this.instanceGenerated = false;
21
- this.sqlOpenFactory = new ReactNativeQuickSqliteOpenFactory(options);
22
- }
23
- openDB() {
24
- return this.sqlOpenFactory.openDB();
25
- }
26
- generateInstance(options) {
27
- if (this.instanceGenerated) {
28
- this.options.logger?.warn('Generating multiple PowerSync instances can sometimes cause unexpected results.');
29
- }
30
- this.instanceGenerated = true;
31
- return new PowerSyncDatabase(options);
32
- }
33
- }
34
- //# sourceMappingURL=RNQSDBOpenFactory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RNQSDBOpenFactory.js","sourceRoot":"","sources":["../../../../src/db/adapters/react-native-quick-sqlite/RNQSDBOpenFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oCAAoC,EAKrC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,iCAAiC,EAAE,MAAM,qCAAqC,CAAC;AAExF;;;;;;;;;;GAUG;AACH,MAAM,OAAO,gCAAiC,SAAQ,oCAAoC;IAC9E,iBAAiB,CAAU;IAC3B,cAAc,CAAiB;IAEzC,YAAY,OAAoC;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,IAAI,iCAAiC,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC;IAES,MAAM;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,gBAAgB,CAAC,OAAiC;QAChD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,iFAAiF,CAAC,CAAC;QAC/G,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -1,9 +0,0 @@
1
- import { DBAdapter, SQLOpenFactory, SQLOpenOptions } from '@powersync/common';
2
- /**
3
- * Opens a SQLite connection using React Native Quick SQLite
4
- */
5
- export declare class ReactNativeQuickSqliteOpenFactory implements SQLOpenFactory {
6
- protected options: SQLOpenOptions;
7
- constructor(options: SQLOpenOptions);
8
- openDB(): DBAdapter;
9
- }
@@ -1,45 +0,0 @@
1
- import { RNQSDBAdapter } from './RNQSDBAdapter';
2
- /**
3
- * Opens a SQLite connection using React Native Quick SQLite
4
- */
5
- export class ReactNativeQuickSqliteOpenFactory {
6
- options;
7
- constructor(options) {
8
- this.options = options;
9
- }
10
- openDB() {
11
- /**
12
- * React Native Quick SQLite opens files relative to the `Documents`dir on iOS and the `Files`
13
- * dir on Android. Locations need to be relative to those dirs using with dot ("../") notation
14
- * to navigate up the directory tree.
15
- * This simple adapter assumes any platform specific relative directory is already catered for
16
- * in the options (if provided)
17
- * https://github.com/margelo/react-native-quick-sqlite/blob/main/README.md#loading-existing-dbs
18
- */
19
- try {
20
- var rnqs = require('@journeyapps/react-native-quick-sqlite');
21
- }
22
- catch (e) {
23
- throw new Error(`Could not resolve @journeyapps/react-native-quick-sqlite.
24
- To open databases with React Native Quick SQLite please install @journeyapps/react-native-quick-sqlite.`);
25
- }
26
- const { dbFilename } = this.options;
27
- const openOptions = { location: this.options.dbLocation };
28
- let DB;
29
- try {
30
- // Hot reloads can sometimes clear global JS state, but not close DB on native side
31
- DB = rnqs.open(dbFilename, openOptions);
32
- }
33
- catch (ex) {
34
- if (ex.message.includes('already open')) {
35
- rnqs.QuickSQLite.close(dbFilename);
36
- DB = rnqs.open(dbFilename, openOptions);
37
- }
38
- else {
39
- throw ex;
40
- }
41
- }
42
- return new RNQSDBAdapter(DB, this.options.dbFilename);
43
- }
44
- }
45
- //# sourceMappingURL=ReactNativeQuickSQLiteOpenFactory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReactNativeQuickSQLiteOpenFactory.js","sourceRoot":"","sources":["../../../../src/db/adapters/react-native-quick-sqlite/ReactNativeQuickSQLiteOpenFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,iCAAiC;IACtB;IAAtB,YAAsB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAEjD,MAAM;QACJ;;;;;;;WAOG;QAEH,IAAI,CAAC;YACH,IAAI,IAAI,GAAG,OAAO,CAAC,wCAAwC,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC;wGACkF,CAAC,CAAC;QACtG,CAAC;QACD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpC,MAAM,WAAW,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1D,IAAI,EAAE,CAAC;QACP,IAAI,CAAC;YACH,mFAAmF;YACnF,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACnC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;CACF"}
@@ -1,85 +0,0 @@
1
- import {
2
- BaseObserver,
3
- DBAdapter,
4
- DBAdapterListener,
5
- LockContext as PowerSyncLockContext,
6
- DBLockOptions,
7
- ConnectionPool,
8
- DBGetUtilsDefaultMixin,
9
- LockContext,
10
- DBAdapterDefaultMixin,
11
- Transaction
12
- } from '@powersync/common';
13
- import type { QuickSQLiteConnection, LockContext as RNQSLockContext } from '@journeyapps/react-native-quick-sqlite';
14
- import { QueryResult, SqlExecutor } from '@powersync/common/dist/index.cjs';
15
-
16
- class RNQSConnectionPool extends BaseObserver<DBAdapterListener> implements ConnectionPool {
17
- constructor(
18
- protected baseDB: QuickSQLiteConnection,
19
- public name: string
20
- ) {
21
- super();
22
- // link table update commands
23
- baseDB.registerTablesChangedHook((update) => {
24
- this.iterateListeners((cb) => cb.tablesUpdated?.(update));
25
- });
26
- }
27
-
28
- close() {
29
- return this.baseDB.close();
30
- }
31
-
32
- readLock<T>(fn: (tx: PowerSyncLockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {
33
- return this.baseDB.readLock((dbTx) => fn(this.generateContext(dbTx)), options);
34
- }
35
-
36
- writeLock<T>(fn: (tx: PowerSyncLockContext) => Promise<T>, options?: DBLockOptions): Promise<T> {
37
- return this.baseDB.writeLock((dbTx) => fn(this.generateContext(dbTx)), options);
38
- }
39
-
40
- generateContext<T extends RNQSLockContext>(ctx: T) {
41
- return new QuickSqliteContext(ctx);
42
- }
43
-
44
- async refreshSchema() {
45
- await this.baseDB.refreshSchema();
46
- }
47
- }
48
-
49
- class QuickSqliteExecutor implements Omit<SqlExecutor, 'executeBatch'> {
50
- constructor(readonly context: RNQSLockContext) {}
51
-
52
- execute(query: string, params?: any[]) {
53
- return this.context.execute(query, params);
54
- }
55
- /**
56
- * 'executeRaw' is not implemented in RNQS, this falls back to 'execute'.
57
- */
58
- async executeRaw(query: string, params?: any[]): Promise<any[][]> {
59
- const result = await this.context.execute(query, params);
60
- const rows = result.rows?._array ?? [];
61
- return rows.map((row) => Object.values(row));
62
- }
63
- }
64
-
65
- class QuickSqliteContext extends DBGetUtilsDefaultMixin(QuickSqliteExecutor) implements LockContext {}
66
-
67
- /**
68
- * Adapter for React Native Quick SQLite
69
- */
70
- export class RNQSDBAdapter extends DBAdapterDefaultMixin(RNQSConnectionPool) implements DBAdapter {
71
- // We don't want the default implementation here, RNQS does not support executeBatch for lock contexts so that would
72
- // be less efficient.
73
- async executeBatch(query: string, params: any[][] = []): Promise<QueryResult> {
74
- const commands: any[] = [];
75
-
76
- for (let i = 0; i < params.length; i++) {
77
- commands.push([query, params[i]]);
78
- }
79
-
80
- const result = await this.baseDB.executeBatch(commands);
81
- return {
82
- rowsAffected: result.rowsAffected ? result.rowsAffected : 0
83
- };
84
- }
85
- }
@@ -1,44 +0,0 @@
1
- import {
2
- AbstractPowerSyncDatabase,
3
- AbstractPowerSyncDatabaseOpenFactory,
4
- DBAdapter,
5
- PowerSyncDatabaseOptions,
6
- PowerSyncOpenFactoryOptions,
7
- SQLOpenFactory
8
- } from '@powersync/common';
9
- import { PowerSyncDatabase } from '../../../db/PowerSyncDatabase';
10
- import { ReactNativeQuickSqliteOpenFactory } from './ReactNativeQuickSQLiteOpenFactory';
11
-
12
- /**
13
- * @deprecated {@link PowerSyncDatabase} can now be constructed directly
14
- * @example
15
- * ```typescript
16
- * const powersync = new PowerSyncDatabase({
17
- * database: {
18
- * dbFileName: 'powersync.db'
19
- * }
20
- * });
21
- * ```
22
- */
23
- export class RNQSPowerSyncDatabaseOpenFactory extends AbstractPowerSyncDatabaseOpenFactory {
24
- protected instanceGenerated: boolean;
25
- protected sqlOpenFactory: SQLOpenFactory;
26
-
27
- constructor(options: PowerSyncOpenFactoryOptions) {
28
- super(options);
29
- this.instanceGenerated = false;
30
- this.sqlOpenFactory = new ReactNativeQuickSqliteOpenFactory(options);
31
- }
32
-
33
- protected openDB(): DBAdapter {
34
- return this.sqlOpenFactory.openDB();
35
- }
36
-
37
- generateInstance(options: PowerSyncDatabaseOptions): AbstractPowerSyncDatabase {
38
- if (this.instanceGenerated) {
39
- this.options.logger?.warn('Generating multiple PowerSync instances can sometimes cause unexpected results.');
40
- }
41
- this.instanceGenerated = true;
42
- return new PowerSyncDatabase(options);
43
- }
44
- }
@@ -1,43 +0,0 @@
1
- import { DBAdapter, SQLOpenFactory, SQLOpenOptions } from '@powersync/common';
2
- import { RNQSDBAdapter } from './RNQSDBAdapter';
3
-
4
- /**
5
- * Opens a SQLite connection using React Native Quick SQLite
6
- */
7
- export class ReactNativeQuickSqliteOpenFactory implements SQLOpenFactory {
8
- constructor(protected options: SQLOpenOptions) {}
9
-
10
- openDB(): DBAdapter {
11
- /**
12
- * React Native Quick SQLite opens files relative to the `Documents`dir on iOS and the `Files`
13
- * dir on Android. Locations need to be relative to those dirs using with dot ("../") notation
14
- * to navigate up the directory tree.
15
- * This simple adapter assumes any platform specific relative directory is already catered for
16
- * in the options (if provided)
17
- * https://github.com/margelo/react-native-quick-sqlite/blob/main/README.md#loading-existing-dbs
18
- */
19
-
20
- try {
21
- var rnqs = require('@journeyapps/react-native-quick-sqlite');
22
- } catch (e) {
23
- throw new Error(`Could not resolve @journeyapps/react-native-quick-sqlite.
24
- To open databases with React Native Quick SQLite please install @journeyapps/react-native-quick-sqlite.`);
25
- }
26
- const { dbFilename } = this.options;
27
- const openOptions = { location: this.options.dbLocation };
28
- let DB;
29
- try {
30
- // Hot reloads can sometimes clear global JS state, but not close DB on native side
31
- DB = rnqs.open(dbFilename, openOptions);
32
- } catch (ex) {
33
- if (ex.message.includes('already open')) {
34
- rnqs.QuickSQLite.close(dbFilename);
35
- DB = rnqs.open(dbFilename, openOptions);
36
- } else {
37
- throw ex;
38
- }
39
- }
40
-
41
- return new RNQSDBAdapter(DB, this.options.dbFilename);
42
- }
43
- }