expo-sqlite 11.3.2 → 11.5.0
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/CHANGELOG.md +9 -1
- package/android/build.gradle +2 -2
- package/android/src/main/java/expo/modules/sqlite/SQLiteModule.kt +6 -0
- package/build/SQLite.d.ts +10 -2
- package/build/SQLite.d.ts.map +1 -1
- package/build/SQLite.js +14 -1
- package/build/SQLite.js.map +1 -1
- package/ios/CRSQLiteLoader.h +5 -0
- package/ios/CRSQLiteLoader.m +12 -0
- package/ios/ExpoSQLite.podspec +10 -7
- package/ios/SQLiteModule.swift +61 -4
- package/ios/crsqlite.xcframework/Info.plist +40 -0
- package/ios/crsqlite.xcframework/ios-arm64/crsqlite.framework/Info.plist +18 -0
- package/ios/crsqlite.xcframework/ios-arm64/crsqlite.framework/crsqlite +0 -0
- package/ios/crsqlite.xcframework/ios-arm64_x86_64-simulator/crsqlite.framework/Info.plist +18 -0
- package/ios/crsqlite.xcframework/ios-arm64_x86_64-simulator/crsqlite.framework/crsqlite +0 -0
- package/package.json +2 -2
- package/src/SQLite.ts +17 -2
- package/tsconfig.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,7 +10,15 @@
|
|
|
10
10
|
|
|
11
11
|
### 💡 Others
|
|
12
12
|
|
|
13
|
-
## 11.
|
|
13
|
+
## 11.5.0 — 2023-08-02
|
|
14
|
+
|
|
15
|
+
_This version does not introduce any user-facing changes._
|
|
16
|
+
|
|
17
|
+
## 11.4.0 — 2023-07-28
|
|
18
|
+
|
|
19
|
+
### 🎉 New features
|
|
20
|
+
|
|
21
|
+
- Add synchronous method `closeSync`. ([#23757](https://github.com/expo/expo/pull/23757) by [@alanjhughes](https://github.com/alanjhughes))
|
|
14
22
|
|
|
15
23
|
### 🐛 Bug fixes
|
|
16
24
|
|
package/android/build.gradle
CHANGED
|
@@ -3,7 +3,7 @@ apply plugin: 'kotlin-android'
|
|
|
3
3
|
apply plugin: 'maven-publish'
|
|
4
4
|
|
|
5
5
|
group = 'host.exp.exponent'
|
|
6
|
-
version = '11.
|
|
6
|
+
version = '11.5.0'
|
|
7
7
|
|
|
8
8
|
buildscript {
|
|
9
9
|
def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
|
|
@@ -67,7 +67,7 @@ android {
|
|
|
67
67
|
minSdkVersion safeExtGet("minSdkVersion", 21)
|
|
68
68
|
targetSdkVersion safeExtGet("targetSdkVersion", 33)
|
|
69
69
|
versionCode 18
|
|
70
|
-
versionName "11.
|
|
70
|
+
versionName "11.5.0"
|
|
71
71
|
}
|
|
72
72
|
lintOptions {
|
|
73
73
|
abortOnError false
|
|
@@ -51,6 +51,12 @@ class SQLiteModule : Module() {
|
|
|
51
51
|
?.close()
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
Function("closeSync") { dbName: String ->
|
|
55
|
+
DATABASES
|
|
56
|
+
.remove(dbName)
|
|
57
|
+
?.close()
|
|
58
|
+
}
|
|
59
|
+
|
|
54
60
|
AsyncFunction("deleteAsync") { dbName: String ->
|
|
55
61
|
if (DATABASES.containsKey(dbName)) {
|
|
56
62
|
throw OpenDatabaseException(dbName)
|
package/build/SQLite.d.ts
CHANGED
|
@@ -16,16 +16,24 @@ export declare class SQLiteDatabase {
|
|
|
16
16
|
/**
|
|
17
17
|
* @deprecated Use `closeAsync()` instead.
|
|
18
18
|
*/
|
|
19
|
-
close: () => void
|
|
19
|
+
close: () => Promise<void>;
|
|
20
20
|
/**
|
|
21
21
|
* Close the database.
|
|
22
22
|
*/
|
|
23
|
-
closeAsync(): void
|
|
23
|
+
closeAsync(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Synchronously closes the database.
|
|
26
|
+
*/
|
|
27
|
+
closeSync(): void;
|
|
24
28
|
/**
|
|
25
29
|
* Delete the database file.
|
|
26
30
|
* > The database has to be closed prior to deletion.
|
|
27
31
|
*/
|
|
28
32
|
deleteAsync(): Promise<void>;
|
|
33
|
+
onDatabaseChange(cb: (result: {
|
|
34
|
+
tableName: string;
|
|
35
|
+
rowId: number;
|
|
36
|
+
}) => void): import("expo-modules-core").Subscription;
|
|
29
37
|
/**
|
|
30
38
|
* Creates a new transaction with Promise support.
|
|
31
39
|
* @param asyncCallback A `SQLTransactionAsyncCallback` function that can perform SQL statements in a transaction.
|
package/build/SQLite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLite.d.ts","sourceRoot":"","sources":["../src/SQLite.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EACV,KAAK,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"SQLite.d.ts","sourceRoot":"","sources":["../src/SQLite.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EACV,KAAK,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,2BAA2B,EAC5B,MAAM,gBAAgB,CAAC;AAaxB,gDAAgD;AAChD,qBAAa,cAAc;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAS;gBAEb,IAAI,EAAE,MAAM;IAIxB;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAgBzE;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,EAAE,CAAC;IAa7F;;OAEG;IACH,KAAK,QAKS,QAAQ,IAAI,CAAC,CALH;IAExB;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;OAEG;IACH,SAAS,IAAI,IAAI;IAKjB;;;OAGG;IACH,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,gBAAgB,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI;IAI3E;;;;OAIG;IACG,gBAAgB,CACpB,aAAa,EAAE,2BAA2B,EAC1C,QAAQ,GAAE,OAAe,GACxB,OAAO,CAAC,IAAI,CAAC;IAahB,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;;;;OAOG;IAEH,WAAW,CACT,QAAQ,EAAE,sBAAsB,EAChC,aAAa,CAAC,EAAE,2BAA2B,EAC3C,eAAe,CAAC,EAAE,MAAM,IAAI,GAC3B,IAAI;IAGP,eAAe,CACb,QAAQ,EAAE,sBAAsB,EAChC,aAAa,CAAC,EAAE,2BAA2B,EAC3C,eAAe,CAAC,EAAE,MAAM,IAAI,GAC3B,IAAI;CACR;AA0CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAc,EACvB,WAAW,GAAE,MAAa,EAC1B,IAAI,GAAE,MAAU,EAChB,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,IAAI,GACtC,cAAc,CAahB;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAkB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAA7C,EAAE,EAAE,cAAc,EAAmB,QAAQ,EAAE,OAAO;IAE7E,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GACzB,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;CAOvC"}
|
package/build/SQLite.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import './polyfillNextTick';
|
|
2
2
|
import customOpenDatabase from '@expo/websql/custom';
|
|
3
|
-
import { requireNativeModule } from 'expo-modules-core';
|
|
3
|
+
import { requireNativeModule, EventEmitter } from 'expo-modules-core';
|
|
4
4
|
import { Platform } from 'react-native';
|
|
5
5
|
const ExpoSQLite = requireNativeModule('ExpoSQLite');
|
|
6
|
+
const emitter = new EventEmitter(ExpoSQLite);
|
|
6
7
|
function zipObject(keys, values) {
|
|
7
8
|
const result = {};
|
|
8
9
|
for (let i = 0; i < keys.length; i++) {
|
|
@@ -52,6 +53,13 @@ export class SQLiteDatabase {
|
|
|
52
53
|
this._closed = true;
|
|
53
54
|
return ExpoSQLite.close(this._name);
|
|
54
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Synchronously closes the database.
|
|
58
|
+
*/
|
|
59
|
+
closeSync() {
|
|
60
|
+
this._closed = true;
|
|
61
|
+
return ExpoSQLite.closeSync(this._name);
|
|
62
|
+
}
|
|
55
63
|
/**
|
|
56
64
|
* Delete the database file.
|
|
57
65
|
* > The database has to be closed prior to deletion.
|
|
@@ -62,6 +70,9 @@ export class SQLiteDatabase {
|
|
|
62
70
|
}
|
|
63
71
|
return ExpoSQLite.deleteAsync(this._name);
|
|
64
72
|
}
|
|
73
|
+
onDatabaseChange(cb) {
|
|
74
|
+
return emitter.addListener('onDatabaseChange', cb);
|
|
75
|
+
}
|
|
65
76
|
/**
|
|
66
77
|
* Creates a new transaction with Promise support.
|
|
67
78
|
* @param asyncCallback A `SQLTransactionAsyncCallback` function that can perform SQL statements in a transaction.
|
|
@@ -139,6 +150,8 @@ export function openDatabase(name, version = '1.0', description = name, size = 1
|
|
|
139
150
|
db.exec = db._db.exec.bind(db._db);
|
|
140
151
|
db.execAsync = db._db.execAsync.bind(db._db);
|
|
141
152
|
db.closeAsync = db._db.closeAsync.bind(db._db);
|
|
153
|
+
db.closeSync = db._db.closeSync.bind(db._db);
|
|
154
|
+
db.onDatabaseChange = db._db.onDatabaseChange.bind(db._db);
|
|
142
155
|
db.deleteAsync = db._db.deleteAsync.bind(db._db);
|
|
143
156
|
db.transactionAsync = db._db.transactionAsync.bind(db._db);
|
|
144
157
|
return db;
|
package/build/SQLite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLite.js","sourceRoot":"","sources":["../src/SQLite.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAE5B,OAAO,kBAAkB,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAaxC,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;AAErD,SAAS,SAAS,CAAC,IAAc,EAAE,MAAa;IAC9C,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;KAC7B;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gDAAgD;AAChD,MAAM,OAAO,cAAc;IACzB,KAAK,CAAS;IACd,OAAO,GAAY,KAAK,CAAC;IAEzB,YAAY,IAAY;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAgB,EAAE,QAAiB,EAAE,QAAwB;QAChE,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QAED,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CACtE,CAAC,gBAAgB,EAAE,EAAE;YACnB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC9D,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,0FAA0F;YAC1F,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,OAAgB,EAAE,QAAiB;QACjD,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;SAClD;QAED,MAAM,gBAAgB,GAAG,MAAM,UAAU,CAAC,IAAI,CAC5C,IAAI,CAAC,KAAK,EACV,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAC5B,QAAQ,CACT,CAAC;QACF,OAAO,gBAAgB,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;IAExB;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACjB,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,CAAC,KAAK,gEAAgE,CAChG,CAAC;SACH;QAED,OAAO,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CACpB,aAA0C,EAC1C,WAAoB,KAAK;QAEzB,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI;YACF,MAAM,WAAW,GAAG,IAAI,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChE,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;YACjC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;SAC1D;QAAC,OAAO,CAAU,EAAE;YACnB,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,CAAC,CAAC;SACT;IACH,CAAC;IAED,0DAA0D;IAC1D,OAAO,CAAS;CAuBjB;AAED,SAAS,eAAe,CAAC,KAAY;IACnC,OAAO,QAAQ,CAAC,EAAE,KAAK,SAAS;QAC9B,CAAC,CAAC;YACE,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;SAClC;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,qBAAqB,CAAC,YAAY;IACzC,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC;IAC3E,iGAAiG;IACjG,wBAAwB;IACxB,IAAI,YAAY,KAAK,IAAI,EAAE;QACzB,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,YAAY,CAAC,EAAoB,CAAC;KAC7D;IAED,OAAO;QACL,QAAQ;QACR,YAAY;QACZ,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAI,IAAO;IAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,qCAAqC;QACrC,OAAO,IAAI;aACR,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC;aAClC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC;aAClC,OAAO,CAAC,SAAS,EAAE,cAAc,CAAQ,CAAC;QAC7C,oCAAoC;KACrC;SAAM;QACL,OAAO,IAAI,CAAC;KACb;AACH,CAAC;AAED,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAEnE,2BAA2B;AAC3B;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,UAAkB,KAAK,EACvB,cAAsB,IAAI,EAC1B,OAAe,CAAC,EAChB,QAAuC;IAEvC,IAAI,IAAI,KAAK,SAAS,EAAE;QACtB,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;KAChE;IACD,MAAM,EAAE,GAAG,uBAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/E,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACnC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7C,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/C,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjD,EAAE,CAAC,gBAAgB,GAAG,EAAE,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IACL;IAAqC;IAAlE,YAA6B,EAAkB,EAAmB,QAAiB;QAAtD,OAAE,GAAF,EAAE,CAAgB;QAAmB,aAAQ,GAAR,QAAQ,CAAS;IAAG,CAAC;IAEvF,KAAK,CAAC,eAAe,CACnB,YAAoB,EACpB,IAA0B;QAE1B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CACxC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,EACzC,IAAI,CAAC,QAAQ,CACd,CAAC;QACF,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;CACF","sourcesContent":["import './polyfillNextTick';\n\nimport customOpenDatabase from '@expo/websql/custom';\nimport { requireNativeModule } from 'expo-modules-core';\nimport { Platform } from 'react-native';\n\nimport type {\n Query,\n ResultSet,\n ResultSetError,\n SQLiteCallback,\n SQLTransactionAsyncCallback,\n SQLTransactionAsync,\n SQLTransactionCallback,\n SQLTransactionErrorCallback,\n} from './SQLite.types';\n\nconst ExpoSQLite = requireNativeModule('ExpoSQLite');\n\nfunction zipObject(keys: string[], values: any[]) {\n const result = {};\n for (let i = 0; i < keys.length; i++) {\n result[keys[i]] = values[i];\n }\n return result;\n}\n\n/** The database returned by `openDatabase()` */\nexport class SQLiteDatabase {\n _name: string;\n _closed: boolean = false;\n\n constructor(name: string) {\n this._name = name;\n }\n\n /**\n * Executes the SQL statement and returns a callback resolving with the result.\n */\n exec(queries: Query[], readOnly: boolean, callback: SQLiteCallback): void {\n if (this._closed) {\n throw new Error(`The SQLite database is closed`);\n }\n\n ExpoSQLite.exec(this._name, queries.map(_serializeQuery), readOnly).then(\n (nativeResultSets) => {\n callback(null, nativeResultSets.map(_deserializeResultSet));\n },\n (error) => {\n // TODO: make the native API consistently reject with an error, not a string or other type\n callback(error instanceof Error ? error : new Error(error));\n }\n );\n }\n\n /**\n * Executes the SQL statement and returns a Promise resolving with the result.\n */\n async execAsync(queries: Query[], readOnly: boolean): Promise<(ResultSetError | ResultSet)[]> {\n if (this._closed) {\n throw new Error(`The SQLite database is closed`);\n }\n\n const nativeResultSets = await ExpoSQLite.exec(\n this._name,\n queries.map(_serializeQuery),\n readOnly\n );\n return nativeResultSets.map(_deserializeResultSet);\n }\n\n /**\n * @deprecated Use `closeAsync()` instead.\n */\n close = this.closeAsync;\n\n /**\n * Close the database.\n */\n closeAsync(): void {\n this._closed = true;\n return ExpoSQLite.close(this._name);\n }\n\n /**\n * Delete the database file.\n * > The database has to be closed prior to deletion.\n */\n deleteAsync(): Promise<void> {\n if (!this._closed) {\n throw new Error(\n `Unable to delete '${this._name}' database that is currently open. Close it prior to deletion.`\n );\n }\n\n return ExpoSQLite.deleteAsync(this._name);\n }\n\n /**\n * Creates a new transaction with Promise support.\n * @param asyncCallback A `SQLTransactionAsyncCallback` function that can perform SQL statements in a transaction.\n * @param readOnly true if all the SQL statements in the callback are read only.\n */\n async transactionAsync(\n asyncCallback: SQLTransactionAsyncCallback,\n readOnly: boolean = false\n ): Promise<void> {\n await this.execAsync([{ sql: 'BEGIN;', args: [] }], false);\n try {\n const transaction = new ExpoSQLTransactionAsync(this, readOnly);\n await asyncCallback(transaction);\n await this.execAsync([{ sql: 'END;', args: [] }], false);\n } catch (e: unknown) {\n await this.execAsync([{ sql: 'ROLLBACK;', args: [] }], false);\n throw e;\n }\n }\n\n // @ts-expect-error: properties that are added from websql\n version: string;\n\n /**\n * Execute a database transaction.\n * @param callback A function representing the transaction to perform. Takes a Transaction\n * (see below) as its only parameter, on which it can add SQL statements to execute.\n * @param errorCallback Called if an error occurred processing this transaction. Takes a single\n * parameter describing the error.\n * @param successCallback Called when the transaction has completed executing on the database.\n */\n // @ts-expect-error: properties that are added from websql\n transaction(\n callback: SQLTransactionCallback,\n errorCallback?: SQLTransactionErrorCallback,\n successCallback?: () => void\n ): void;\n\n // @ts-expect-error: properties that are added from websql\n readTransaction(\n callback: SQLTransactionCallback,\n errorCallback?: SQLTransactionErrorCallback,\n successCallback?: () => void\n ): void;\n}\n\nfunction _serializeQuery(query: Query): Query | [string, any[]] {\n return Platform.OS === 'android'\n ? {\n sql: query.sql,\n args: query.args.map(_escapeBlob),\n }\n : [query.sql, query.args];\n}\n\nfunction _deserializeResultSet(nativeResult): ResultSet | ResultSetError {\n const [errorMessage, insertId, rowsAffected, columns, rows] = nativeResult;\n // TODO: send more structured error information from the native module so we can better construct\n // a SQLException object\n if (errorMessage !== null) {\n return { error: new Error(errorMessage) } as ResultSetError;\n }\n\n return {\n insertId,\n rowsAffected,\n rows: rows.map((row) => zipObject(columns, row)),\n };\n}\n\nfunction _escapeBlob<T>(data: T): T {\n if (typeof data === 'string') {\n /* eslint-disable no-control-regex */\n return data\n .replace(/\\u0002/g, '\\u0002\\u0002')\n .replace(/\\u0001/g, '\\u0001\\u0002')\n .replace(/\\u0000/g, '\\u0001\\u0001') as any;\n /* eslint-enable no-control-regex */\n } else {\n return data;\n }\n}\n\nconst _openExpoSQLiteDatabase = customOpenDatabase(SQLiteDatabase);\n\n// @needsAudit @docsMissing\n/**\n * Open a database, creating it if it doesn't exist, and return a `Database` object. On disk,\n * the database will be created under the app's [documents directory](./filesystem), i.e.\n * `${FileSystem.documentDirectory}/SQLite/${name}`.\n * > The `version`, `description` and `size` arguments are ignored, but are accepted by the function\n * for compatibility with the WebSQL specification.\n * @param name Name of the database file to open.\n * @param version\n * @param description\n * @param size\n * @param callback\n * @return\n */\nexport function openDatabase(\n name: string,\n version: string = '1.0',\n description: string = name,\n size: number = 1,\n callback?: (db: SQLiteDatabase) => void\n): SQLiteDatabase {\n if (name === undefined) {\n throw new TypeError(`The database name must not be undefined`);\n }\n const db = _openExpoSQLiteDatabase(name, version, description, size, callback);\n db.exec = db._db.exec.bind(db._db);\n db.execAsync = db._db.execAsync.bind(db._db);\n db.closeAsync = db._db.closeAsync.bind(db._db);\n db.deleteAsync = db._db.deleteAsync.bind(db._db);\n db.transactionAsync = db._db.transactionAsync.bind(db._db);\n return db;\n}\n\n/**\n * Internal data structure for the async transaction API.\n * @internal\n */\nexport class ExpoSQLTransactionAsync implements SQLTransactionAsync {\n constructor(private readonly db: SQLiteDatabase, private readonly readOnly: boolean) {}\n\n async executeSqlAsync(\n sqlStatement: string,\n args?: (number | string)[]\n ): Promise<ResultSetError | ResultSet> {\n const resultSets = await this.db.execAsync(\n [{ sql: sqlStatement, args: args ?? [] }],\n this.readOnly\n );\n return resultSets[0];\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SQLite.js","sourceRoot":"","sources":["../src/SQLite.ts"],"names":[],"mappings":"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","sourcesContent":["import './polyfillNextTick';\n\nimport customOpenDatabase from '@expo/websql/custom';\nimport { requireNativeModule, EventEmitter } from 'expo-modules-core';\nimport { Platform } from 'react-native';\n\nimport type {\n Query,\n ResultSet,\n ResultSetError,\n SQLiteCallback,\n SQLTransactionAsyncCallback,\n SQLTransactionAsync,\n SQLTransactionCallback,\n SQLTransactionErrorCallback,\n} from './SQLite.types';\n\nconst ExpoSQLite = requireNativeModule('ExpoSQLite');\nconst emitter = new EventEmitter(ExpoSQLite);\n\nfunction zipObject(keys: string[], values: any[]) {\n const result = {};\n for (let i = 0; i < keys.length; i++) {\n result[keys[i]] = values[i];\n }\n return result;\n}\n\n/** The database returned by `openDatabase()` */\nexport class SQLiteDatabase {\n _name: string;\n _closed: boolean = false;\n\n constructor(name: string) {\n this._name = name;\n }\n\n /**\n * Executes the SQL statement and returns a callback resolving with the result.\n */\n exec(queries: Query[], readOnly: boolean, callback: SQLiteCallback): void {\n if (this._closed) {\n throw new Error(`The SQLite database is closed`);\n }\n\n ExpoSQLite.exec(this._name, queries.map(_serializeQuery), readOnly).then(\n (nativeResultSets) => {\n callback(null, nativeResultSets.map(_deserializeResultSet));\n },\n (error) => {\n // TODO: make the native API consistently reject with an error, not a string or other type\n callback(error instanceof Error ? error : new Error(error));\n }\n );\n }\n\n /**\n * Executes the SQL statement and returns a Promise resolving with the result.\n */\n async execAsync(queries: Query[], readOnly: boolean): Promise<(ResultSetError | ResultSet)[]> {\n if (this._closed) {\n throw new Error(`The SQLite database is closed`);\n }\n\n const nativeResultSets = await ExpoSQLite.exec(\n this._name,\n queries.map(_serializeQuery),\n readOnly\n );\n return nativeResultSets.map(_deserializeResultSet);\n }\n\n /**\n * @deprecated Use `closeAsync()` instead.\n */\n close = this.closeAsync;\n\n /**\n * Close the database.\n */\n closeAsync(): Promise<void> {\n this._closed = true;\n return ExpoSQLite.close(this._name);\n }\n\n /**\n * Synchronously closes the database.\n */\n closeSync(): void {\n this._closed = true;\n return ExpoSQLite.closeSync(this._name);\n }\n\n /**\n * Delete the database file.\n * > The database has to be closed prior to deletion.\n */\n deleteAsync(): Promise<void> {\n if (!this._closed) {\n throw new Error(\n `Unable to delete '${this._name}' database that is currently open. Close it prior to deletion.`\n );\n }\n\n return ExpoSQLite.deleteAsync(this._name);\n }\n\n onDatabaseChange(cb: (result: { tableName: string; rowId: number }) => void) {\n return emitter.addListener('onDatabaseChange', cb);\n }\n\n /**\n * Creates a new transaction with Promise support.\n * @param asyncCallback A `SQLTransactionAsyncCallback` function that can perform SQL statements in a transaction.\n * @param readOnly true if all the SQL statements in the callback are read only.\n */\n async transactionAsync(\n asyncCallback: SQLTransactionAsyncCallback,\n readOnly: boolean = false\n ): Promise<void> {\n await this.execAsync([{ sql: 'BEGIN;', args: [] }], false);\n try {\n const transaction = new ExpoSQLTransactionAsync(this, readOnly);\n await asyncCallback(transaction);\n await this.execAsync([{ sql: 'END;', args: [] }], false);\n } catch (e: unknown) {\n await this.execAsync([{ sql: 'ROLLBACK;', args: [] }], false);\n throw e;\n }\n }\n\n // @ts-expect-error: properties that are added from websql\n version: string;\n\n /**\n * Execute a database transaction.\n * @param callback A function representing the transaction to perform. Takes a Transaction\n * (see below) as its only parameter, on which it can add SQL statements to execute.\n * @param errorCallback Called if an error occurred processing this transaction. Takes a single\n * parameter describing the error.\n * @param successCallback Called when the transaction has completed executing on the database.\n */\n // @ts-expect-error: properties that are added from websql\n transaction(\n callback: SQLTransactionCallback,\n errorCallback?: SQLTransactionErrorCallback,\n successCallback?: () => void\n ): void;\n\n // @ts-expect-error: properties that are added from websql\n readTransaction(\n callback: SQLTransactionCallback,\n errorCallback?: SQLTransactionErrorCallback,\n successCallback?: () => void\n ): void;\n}\n\nfunction _serializeQuery(query: Query): Query | [string, any[]] {\n return Platform.OS === 'android'\n ? {\n sql: query.sql,\n args: query.args.map(_escapeBlob),\n }\n : [query.sql, query.args];\n}\n\nfunction _deserializeResultSet(nativeResult): ResultSet | ResultSetError {\n const [errorMessage, insertId, rowsAffected, columns, rows] = nativeResult;\n // TODO: send more structured error information from the native module so we can better construct\n // a SQLException object\n if (errorMessage !== null) {\n return { error: new Error(errorMessage) } as ResultSetError;\n }\n\n return {\n insertId,\n rowsAffected,\n rows: rows.map((row) => zipObject(columns, row)),\n };\n}\n\nfunction _escapeBlob<T>(data: T): T {\n if (typeof data === 'string') {\n /* eslint-disable no-control-regex */\n return data\n .replace(/\\u0002/g, '\\u0002\\u0002')\n .replace(/\\u0001/g, '\\u0001\\u0002')\n .replace(/\\u0000/g, '\\u0001\\u0001') as any;\n /* eslint-enable no-control-regex */\n } else {\n return data;\n }\n}\n\nconst _openExpoSQLiteDatabase = customOpenDatabase(SQLiteDatabase);\n\n// @needsAudit @docsMissing\n/**\n * Open a database, creating it if it doesn't exist, and return a `Database` object. On disk,\n * the database will be created under the app's [documents directory](./filesystem), i.e.\n * `${FileSystem.documentDirectory}/SQLite/${name}`.\n * > The `version`, `description` and `size` arguments are ignored, but are accepted by the function\n * for compatibility with the WebSQL specification.\n * @param name Name of the database file to open.\n * @param version\n * @param description\n * @param size\n * @param callback\n * @return\n */\nexport function openDatabase(\n name: string,\n version: string = '1.0',\n description: string = name,\n size: number = 1,\n callback?: (db: SQLiteDatabase) => void\n): SQLiteDatabase {\n if (name === undefined) {\n throw new TypeError(`The database name must not be undefined`);\n }\n const db = _openExpoSQLiteDatabase(name, version, description, size, callback);\n db.exec = db._db.exec.bind(db._db);\n db.execAsync = db._db.execAsync.bind(db._db);\n db.closeAsync = db._db.closeAsync.bind(db._db);\n db.closeSync = db._db.closeSync.bind(db._db);\n db.onDatabaseChange = db._db.onDatabaseChange.bind(db._db);\n db.deleteAsync = db._db.deleteAsync.bind(db._db);\n db.transactionAsync = db._db.transactionAsync.bind(db._db);\n return db;\n}\n\n/**\n * Internal data structure for the async transaction API.\n * @internal\n */\nexport class ExpoSQLTransactionAsync implements SQLTransactionAsync {\n constructor(private readonly db: SQLiteDatabase, private readonly readOnly: boolean) {}\n\n async executeSqlAsync(\n sqlStatement: string,\n args?: (number | string)[]\n ): Promise<ResultSetError | ResultSet> {\n const resultSets = await this.db.execAsync(\n [{ sql: sqlStatement, args: args ?? [] }],\n this.readOnly\n );\n return resultSets[0];\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Copyright 2015-present 650 Industries. All rights reserved.
|
|
2
|
+
|
|
3
|
+
#import "CRSQLiteLoader.h"
|
|
4
|
+
#import <sqlite3/sqlite3.h>
|
|
5
|
+
|
|
6
|
+
int sqlite3_crsqlite_init(sqlite3 *db, char **pzErrMsg,
|
|
7
|
+
const sqlite3_api_routines *pApi);
|
|
8
|
+
|
|
9
|
+
int crsqlite_init_from_swift() {
|
|
10
|
+
int result = sqlite3_auto_extension((void *)sqlite3_crsqlite_init);
|
|
11
|
+
return result;
|
|
12
|
+
}
|
package/ios/ExpoSQLite.podspec
CHANGED
|
@@ -13,13 +13,16 @@ Pod::Spec.new do |s|
|
|
|
13
13
|
s.platform = :ios, '13.0'
|
|
14
14
|
s.source = { git: 'https://github.com/expo/expo.git' }
|
|
15
15
|
s.static_framework = true
|
|
16
|
-
|
|
16
|
+
|
|
17
17
|
s.dependency 'ExpoModulesCore'
|
|
18
|
+
s.dependency 'sqlite3'
|
|
19
|
+
s.resource_bundles = { 'ExpoSQLite' => ['../crsqlite.dylib'] }
|
|
20
|
+
|
|
21
|
+
# Swift/Objective-C compatibility
|
|
22
|
+
s.pod_target_xcconfig = {
|
|
23
|
+
'DEFINES_MODULE' => 'YES',
|
|
24
|
+
}
|
|
18
25
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
s.vendored_frameworks = "#{s.name}.xcframework"
|
|
22
|
-
else
|
|
23
|
-
s.source_files = "**/*.{h,m,swift}"
|
|
24
|
-
end
|
|
26
|
+
s.source_files = "**/*.{h,m,swift}"
|
|
27
|
+
s.vendored_frameworks = 'crsqlite.xcframework'
|
|
25
28
|
end
|
package/ios/SQLiteModule.swift
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import ExpoModulesCore
|
|
2
|
-
import
|
|
2
|
+
import sqlite3
|
|
3
3
|
|
|
4
4
|
public final class SQLiteModule: Module {
|
|
5
5
|
private var cachedDatabases = [String: OpaquePointer]()
|
|
6
|
+
private var hasListeners = false
|
|
7
|
+
private lazy var selfPointer = Unmanaged.passRetained(self).toOpaque()
|
|
6
8
|
|
|
7
9
|
public func definition() -> ModuleDefinition {
|
|
8
10
|
Name("ExpoSQLite")
|
|
9
11
|
|
|
12
|
+
Events("onDatabaseChange")
|
|
13
|
+
|
|
14
|
+
OnCreate {
|
|
15
|
+
crsqlite_init_from_swift()
|
|
16
|
+
}
|
|
17
|
+
|
|
10
18
|
AsyncFunction("exec") { (dbName: String, queries: [[Any]], readOnly: Bool) -> [Any?] in
|
|
11
19
|
guard let db = openDatabase(dbName: dbName) else {
|
|
12
20
|
throw DatabaseException()
|
|
@@ -31,6 +39,10 @@ public final class SQLiteModule: Module {
|
|
|
31
39
|
cachedDatabases.removeValue(forKey: dbName)
|
|
32
40
|
}
|
|
33
41
|
|
|
42
|
+
Function("closeSync") { (dbName: String) in
|
|
43
|
+
cachedDatabases.removeValue(forKey: dbName)
|
|
44
|
+
}
|
|
45
|
+
|
|
34
46
|
AsyncFunction("deleteAsync") { (dbName: String) in
|
|
35
47
|
if cachedDatabases[dbName] != nil {
|
|
36
48
|
throw DeleteDatabaseException(dbName)
|
|
@@ -51,8 +63,17 @@ public final class SQLiteModule: Module {
|
|
|
51
63
|
}
|
|
52
64
|
}
|
|
53
65
|
|
|
66
|
+
OnStartObserving {
|
|
67
|
+
hasListeners = true
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
OnStopObserving {
|
|
71
|
+
hasListeners = false
|
|
72
|
+
}
|
|
73
|
+
|
|
54
74
|
OnDestroy {
|
|
55
75
|
cachedDatabases.values.forEach {
|
|
76
|
+
executeSql(sql: "SELECT crsql_finalize()", with: [], for: $0, readOnly: false)
|
|
56
77
|
sqlite3_close($0)
|
|
57
78
|
}
|
|
58
79
|
}
|
|
@@ -63,7 +84,7 @@ public final class SQLiteModule: Module {
|
|
|
63
84
|
return nil
|
|
64
85
|
}
|
|
65
86
|
|
|
66
|
-
|
|
87
|
+
let directory = URL(string: fileSystem.documentDirectory)?.appendingPathComponent("SQLite")
|
|
67
88
|
fileSystem.ensureDirExists(withPath: directory?.absoluteString)
|
|
68
89
|
|
|
69
90
|
return directory?.appendingPathComponent(name)
|
|
@@ -71,7 +92,7 @@ public final class SQLiteModule: Module {
|
|
|
71
92
|
|
|
72
93
|
private func openDatabase(dbName: String) -> OpaquePointer? {
|
|
73
94
|
var db: OpaquePointer?
|
|
74
|
-
guard let path =
|
|
95
|
+
guard let path = pathForDatabaseName(name: dbName) else {
|
|
75
96
|
return nil
|
|
76
97
|
}
|
|
77
98
|
|
|
@@ -83,10 +104,26 @@ public final class SQLiteModule: Module {
|
|
|
83
104
|
|
|
84
105
|
if db == nil {
|
|
85
106
|
cachedDatabases.removeValue(forKey: dbName)
|
|
107
|
+
|
|
86
108
|
if sqlite3_open(path.absoluteString, &db) != SQLITE_OK {
|
|
87
109
|
return nil
|
|
88
110
|
}
|
|
89
111
|
|
|
112
|
+
sqlite3_update_hook(
|
|
113
|
+
db,
|
|
114
|
+
{ (obj, action, _, tableName, rowId) in
|
|
115
|
+
if let obj, let tableName {
|
|
116
|
+
let selfObj = Unmanaged<SQLiteModule>.fromOpaque(obj).takeUnretainedValue()
|
|
117
|
+
selfObj.sendEvent("onDatabaseChange", [
|
|
118
|
+
"tableName": String(cString: UnsafePointer(tableName)),
|
|
119
|
+
"rowId": rowId,
|
|
120
|
+
"typeId": SqlAction.fromCode(value: action)
|
|
121
|
+
])
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
selfPointer
|
|
125
|
+
)
|
|
126
|
+
|
|
90
127
|
cachedDatabases[dbName] = db
|
|
91
128
|
}
|
|
92
129
|
return db
|
|
@@ -184,7 +221,7 @@ public final class SQLiteModule: Module {
|
|
|
184
221
|
}
|
|
185
222
|
|
|
186
223
|
let SQLITE_TRANSIENT = unsafeBitCast(OpaquePointer(bitPattern: -1), to: sqlite3_destructor_type.self)
|
|
187
|
-
|
|
224
|
+
|
|
188
225
|
let data = stringArg.data(using: NSUTF8StringEncoding)
|
|
189
226
|
sqlite3_bind_text(statement, index, stringArg.utf8String, Int32(data?.count ?? 0), SQLITE_TRANSIENT)
|
|
190
227
|
}
|
|
@@ -209,3 +246,23 @@ public final class SQLiteModule: Module {
|
|
|
209
246
|
return NSString(format: "Error code %i: %@", code, message) as String
|
|
210
247
|
}
|
|
211
248
|
}
|
|
249
|
+
|
|
250
|
+
enum SqlAction: Int, Enumerable {
|
|
251
|
+
case insert
|
|
252
|
+
case delete
|
|
253
|
+
case update
|
|
254
|
+
case unknown
|
|
255
|
+
|
|
256
|
+
static func fromCode(value: Int32) -> SqlAction {
|
|
257
|
+
switch value {
|
|
258
|
+
case 9:
|
|
259
|
+
return .delete
|
|
260
|
+
case 18:
|
|
261
|
+
return .insert
|
|
262
|
+
case 23:
|
|
263
|
+
return .update
|
|
264
|
+
default:
|
|
265
|
+
return .unknown
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>AvailableLibraries</key>
|
|
6
|
+
<array>
|
|
7
|
+
<dict>
|
|
8
|
+
<key>LibraryIdentifier</key>
|
|
9
|
+
<string>ios-arm64</string>
|
|
10
|
+
<key>LibraryPath</key>
|
|
11
|
+
<string>crsqlite.framework</string>
|
|
12
|
+
<key>SupportedArchitectures</key>
|
|
13
|
+
<array>
|
|
14
|
+
<string>arm64</string>
|
|
15
|
+
</array>
|
|
16
|
+
<key>SupportedPlatform</key>
|
|
17
|
+
<string>ios</string>
|
|
18
|
+
</dict>
|
|
19
|
+
<dict>
|
|
20
|
+
<key>LibraryIdentifier</key>
|
|
21
|
+
<string>ios-arm64_x86_64-simulator</string>
|
|
22
|
+
<key>LibraryPath</key>
|
|
23
|
+
<string>crsqlite.framework</string>
|
|
24
|
+
<key>SupportedArchitectures</key>
|
|
25
|
+
<array>
|
|
26
|
+
<string>arm64</string>
|
|
27
|
+
<string>x86_64</string>
|
|
28
|
+
</array>
|
|
29
|
+
<key>SupportedPlatform</key>
|
|
30
|
+
<string>ios</string>
|
|
31
|
+
<key>SupportedPlatformVariant</key>
|
|
32
|
+
<string>simulator</string>
|
|
33
|
+
</dict>
|
|
34
|
+
</array>
|
|
35
|
+
<key>CFBundlePackageType</key>
|
|
36
|
+
<string>XFWK</string>
|
|
37
|
+
<key>XCFrameworkFormatVersion</key>
|
|
38
|
+
<string>1.0</string>
|
|
39
|
+
</dict>
|
|
40
|
+
</plist>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
|
6
|
+
<string>en</string>
|
|
7
|
+
<key>CFBundleExecutable</key>
|
|
8
|
+
<string>crsqlite</string>
|
|
9
|
+
<key>CFBundleIdentifier</key>
|
|
10
|
+
<string>io.vlcn.crsqlite</string>
|
|
11
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
|
12
|
+
<string>6.0</string>
|
|
13
|
+
<key>CFBundlePackageType</key>
|
|
14
|
+
<string>FMWK</string>
|
|
15
|
+
<key>CFBundleSignature</key>
|
|
16
|
+
<string>????</string>
|
|
17
|
+
</dict>
|
|
18
|
+
</plist>
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
3
|
+
<plist version="1.0">
|
|
4
|
+
<dict>
|
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
|
6
|
+
<string>en</string>
|
|
7
|
+
<key>CFBundleExecutable</key>
|
|
8
|
+
<string>crsqlite</string>
|
|
9
|
+
<key>CFBundleIdentifier</key>
|
|
10
|
+
<string>io.vlcn.crsqlite</string>
|
|
11
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
|
12
|
+
<string>6.0</string>
|
|
13
|
+
<key>CFBundlePackageType</key>
|
|
14
|
+
<string>FMWK</string>
|
|
15
|
+
<key>CFBundleSignature</key>
|
|
16
|
+
<string>????</string>
|
|
17
|
+
</dict>
|
|
18
|
+
</plist>
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-sqlite",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.5.0",
|
|
4
4
|
"description": "Provides access to a database that can be queried through a WebSQL-like API (https://www.w3.org/TR/webdatabase/). The database is persisted across restarts of your app.",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"expo": "*"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "2240630a92eb79a4e4bf73e1439916c394876478"
|
|
48
48
|
}
|
package/src/SQLite.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import './polyfillNextTick';
|
|
2
2
|
|
|
3
3
|
import customOpenDatabase from '@expo/websql/custom';
|
|
4
|
-
import { requireNativeModule } from 'expo-modules-core';
|
|
4
|
+
import { requireNativeModule, EventEmitter } from 'expo-modules-core';
|
|
5
5
|
import { Platform } from 'react-native';
|
|
6
6
|
|
|
7
7
|
import type {
|
|
@@ -16,6 +16,7 @@ import type {
|
|
|
16
16
|
} from './SQLite.types';
|
|
17
17
|
|
|
18
18
|
const ExpoSQLite = requireNativeModule('ExpoSQLite');
|
|
19
|
+
const emitter = new EventEmitter(ExpoSQLite);
|
|
19
20
|
|
|
20
21
|
function zipObject(keys: string[], values: any[]) {
|
|
21
22
|
const result = {};
|
|
@@ -77,11 +78,19 @@ export class SQLiteDatabase {
|
|
|
77
78
|
/**
|
|
78
79
|
* Close the database.
|
|
79
80
|
*/
|
|
80
|
-
closeAsync(): void {
|
|
81
|
+
closeAsync(): Promise<void> {
|
|
81
82
|
this._closed = true;
|
|
82
83
|
return ExpoSQLite.close(this._name);
|
|
83
84
|
}
|
|
84
85
|
|
|
86
|
+
/**
|
|
87
|
+
* Synchronously closes the database.
|
|
88
|
+
*/
|
|
89
|
+
closeSync(): void {
|
|
90
|
+
this._closed = true;
|
|
91
|
+
return ExpoSQLite.closeSync(this._name);
|
|
92
|
+
}
|
|
93
|
+
|
|
85
94
|
/**
|
|
86
95
|
* Delete the database file.
|
|
87
96
|
* > The database has to be closed prior to deletion.
|
|
@@ -96,6 +105,10 @@ export class SQLiteDatabase {
|
|
|
96
105
|
return ExpoSQLite.deleteAsync(this._name);
|
|
97
106
|
}
|
|
98
107
|
|
|
108
|
+
onDatabaseChange(cb: (result: { tableName: string; rowId: number }) => void) {
|
|
109
|
+
return emitter.addListener('onDatabaseChange', cb);
|
|
110
|
+
}
|
|
111
|
+
|
|
99
112
|
/**
|
|
100
113
|
* Creates a new transaction with Promise support.
|
|
101
114
|
* @param asyncCallback A `SQLTransactionAsyncCallback` function that can perform SQL statements in a transaction.
|
|
@@ -209,6 +222,8 @@ export function openDatabase(
|
|
|
209
222
|
db.exec = db._db.exec.bind(db._db);
|
|
210
223
|
db.execAsync = db._db.execAsync.bind(db._db);
|
|
211
224
|
db.closeAsync = db._db.closeAsync.bind(db._db);
|
|
225
|
+
db.closeSync = db._db.closeSync.bind(db._db);
|
|
226
|
+
db.onDatabaseChange = db._db.onDatabaseChange.bind(db._db);
|
|
212
227
|
db.deleteAsync = db._db.deleteAsync.bind(db._db);
|
|
213
228
|
db.transactionAsync = db._db.transactionAsync.bind(db._db);
|
|
214
229
|
return db;
|
package/tsconfig.json
CHANGED