Skip to content

Commit 6bec83b

Browse files
feat: ios working
1 parent 76ccdda commit 6bec83b

61 files changed

Lines changed: 2563 additions & 2241 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ DerivedData
3030
project.xcworkspace
3131
*.env.local
3232
ios/Pods
33+
example/ios/Pods
34+
ios/build
35+
example/vendor
3336

3437
# Android/IJ
3538
#
Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
diff --git a/android/build.gradle b/android/build.gradle
2+
index 70ebca0eed3ccd79fe8b7d107d5d860bd6ca34db..5da86593b0ad638d0147719ce5a987ea6617e198 100644
3+
--- a/android/build.gradle
4+
+++ b/android/build.gradle
5+
@@ -1,5 +1,4 @@
6+
import java.nio.file.Paths
7+
-import groovy.json.JsonSlurper
8+
9+
buildscript {
10+
repositories {
11+
@@ -27,10 +26,10 @@ def isNewArchitectureEnabled() {
12+
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
13+
}
14+
15+
-def useSQLCipher = false
16+
+def useSQLCipher = true
17+
def useLibsql = false
18+
def useCRSQLite = false
19+
-def performanceMode = false
20+
+def performanceMode = true
21+
def sqliteFlags = ""
22+
def enableFTS5 = false
23+
def useSqliteVec = false
24+
@@ -38,28 +37,6 @@ def enableRtree = false
25+
def tokenizers = []
26+
27+
def isInsideNodeModules = rootDir.absolutePath.contains("node_modules")
28+
-def packageJson
29+
-
30+
-if ( isInsideNodeModules ) {
31+
- def packageJsonFile = new File("$rootDir/../../../package.json")
32+
- packageJson = new JsonSlurper().parseText(packageJsonFile.text)
33+
-} else {
34+
- def packageJsonFile = new File("$rootDir/../package.json")
35+
- packageJson = new JsonSlurper().parseText(packageJsonFile.text)
36+
-}
37+
-
38+
-def opsqliteConfig = packageJson["op-sqlite"]
39+
-if(opsqliteConfig) {
40+
- useSQLCipher = opsqliteConfig["sqlcipher"]
41+
- useCRSQLite = opsqliteConfig["crsqlite"]
42+
- useSqliteVec = opsqliteConfig["sqliteVec"]
43+
- performanceMode = opsqliteConfig["performanceMode"]
44+
- sqliteFlags = opsqliteConfig["sqliteFlags"] ? opsqliteConfig["sqliteFlags"] : ""
45+
- enableFTS5 = opsqliteConfig["fts5"]
46+
- useLibsql = opsqliteConfig["libsql"]
47+
- enableRtree = opsqliteConfig["rtree"]
48+
- tokenizers = opsqliteConfig["tokenizers"] ? opsqliteConfig["tokenizers"] : []
49+
-}
50+
51+
if(useSQLCipher) {
52+
println "[OP-SQLITE] using SQLCipher 🔒"
53+
diff --git a/android/cpp-adapter.cpp b/android/cpp-adapter.cpp
54+
index 8feaf7719661ef248113f11b1643deedb4b510af..be0ade91b7f92281cdc4ebb941ed5e2a3770ea19 100644
55+
--- a/android/cpp-adapter.cpp
56+
+++ b/android/cpp-adapter.cpp
57+
@@ -19,8 +19,8 @@ struct OPSQLiteBridge : jni::JavaClass<OPSQLiteBridge> {
58+
static void registerNatives() {
59+
javaClassStatic()->registerNatives(
60+
{makeNativeMethod("installNativeJsi", OPSQLiteBridge::installNativeJsi),
61+
- makeNativeMethod("clearStateNativeJsi",
62+
- OPSQLiteBridge::clearStateNativeJsi)});
63+
+ makeNativeMethod("clearStateNativeJsi", OPSQLiteBridge::clearStateNativeJsi),
64+
+ makeNativeMethod("deleteAllDBsJsi", OPSQLiteBridge::deleteAllDBsJsi)});
65+
}
66+
67+
private:
68+
@@ -39,6 +39,10 @@ private:
69+
static void clearStateNativeJsi(jni::alias_ref<jni::JObject> thiz) {
70+
opsqlite::invalidate();
71+
}
72+
+
73+
+ static bool deleteAllDBsJsi(jni::alias_ref<jni::JObject> thiz) {
74+
+ return opsqlite::deleteAllDbs();
75+
+ }
76+
};
77+
78+
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) {
79+
diff --git a/android/src/main/java/com/op/sqlite/OPSQLiteBridge.kt b/android/src/main/java/com/op/sqlite/OPSQLiteBridge.kt
80+
index 44f86df6a21a6f7272b2c79b196586ef8fec886b..624eef492321269ef62d3ba55338c95a6da8d503 100644
81+
--- a/android/src/main/java/com/op/sqlite/OPSQLiteBridge.kt
82+
+++ b/android/src/main/java/com/op/sqlite/OPSQLiteBridge.kt
83+
@@ -13,6 +13,8 @@ class OPSQLiteBridge {
84+
)
85+
private external fun clearStateNativeJsi()
86+
87+
+ private external fun deleteAllDBsJsi(): Boolean
88+
+
89+
fun install(context: ReactContext) {
90+
val jsContextPointer = context.javaScriptContextHolder!!.get()
91+
val jsCallInvokerHolder =
92+
@@ -31,6 +33,9 @@ class OPSQLiteBridge {
93+
clearStateNativeJsi()
94+
}
95+
96+
+ fun deleteAllDBs() {
97+
+ deleteAllDBsJsi()
98+
+ }
99+
companion object {
100+
val instance = OPSQLiteBridge()
101+
}
102+
diff --git a/android/src/main/java/com/op/sqlite/OPSQLiteModule.kt b/android/src/main/java/com/op/sqlite/OPSQLiteModule.kt
103+
index fea0aa7fb0266f812370309393eccb6eafef0fd5..e169fea192761a619bac31df9bffb603eb2d65a1 100644
104+
--- a/android/src/main/java/com/op/sqlite/OPSQLiteModule.kt
105+
+++ b/android/src/main/java/com/op/sqlite/OPSQLiteModule.kt
106+
@@ -6,14 +6,15 @@ import com.facebook.react.bridge.ReactApplicationContext
107+
import com.facebook.react.bridge.ReactMethod
108+
import com.facebook.react.bridge.ReactContextBaseJavaModule
109+
import com.facebook.react.bridge.ReadableMap
110+
+import com.facebook.react.module.annotations.ReactModule
111+
import java.io.File
112+
import java.io.FileOutputStream
113+
import java.io.InputStream
114+
import java.io.OutputStream
115+
import com.facebook.react.util.RNLog;
116+
117+
-//@ReactModule(name = OPSQLiteModule.NAME)
118+
-internal class OPSQLiteModule(context: ReactApplicationContext?) : ReactContextBaseJavaModule(context) {
119+
+@ReactModule(name = OPSQLiteModule.NAME)
120+
+class OPSQLiteModule(context: ReactApplicationContext?) : ReactContextBaseJavaModule(context) {
121+
override fun getName(): String {
122+
return NAME
123+
}
124+
@@ -55,6 +56,16 @@ internal class OPSQLiteModule(context: ReactApplicationContext?) : ReactContextB
125+
throw Exception("Do not call getDylibPath on Android")
126+
}
127+
128+
+ @ReactMethod(isBlockingSynchronousMethod = true)
129+
+ fun closeAllConnections() {
130+
+ OPSQLiteBridge.instance.invalidate()
131+
+ }
132+
+
133+
+ @ReactMethod(isBlockingSynchronousMethod = true)
134+
+ fun deleteAllDBs() {
135+
+ OPSQLiteBridge.instance.deleteAllDBs();
136+
+ }
137+
+
138+
@ReactMethod
139+
fun moveAssetsDatabase(args: ReadableMap, promise: Promise) {
140+
val filename = args.getString("filename")!!
141+
diff --git a/cpp/DBHostObject.cpp b/cpp/DBHostObject.cpp
142+
index 33e8e25b1268534c93de89c0bebe759b99553c40..5843a46942ff8004ab3efe9517cdd72c41d67314 100644
143+
--- a/cpp/DBHostObject.cpp
144+
+++ b/cpp/DBHostObject.cpp
145+
@@ -847,6 +847,10 @@ void DBHostObject::invalidate() {
146+
#endif
147+
}
148+
149+
+void DBHostObject::drop() {
150+
+ opsqlite_remove(db, db_name, std::string(base_path));
151+
+}
152+
+
153+
DBHostObject::~DBHostObject() { invalidate(); }
154+
155+
} // namespace opsqlite
156+
diff --git a/cpp/DBHostObject.h b/cpp/DBHostObject.h
157+
index b665ddd63162b74ea96ff7cc96a61b2099dc9803..26a561d245967fdc7e6c6a3408c9455e166bafdb 100644
158+
--- a/cpp/DBHostObject.h
159+
+++ b/cpp/DBHostObject.h
160+
@@ -67,6 +67,7 @@ class JSI_EXPORT DBHostObject : public jsi::HostObject {
161+
void on_commit();
162+
void on_rollback();
163+
void invalidate();
164+
+ void drop();
165+
~DBHostObject() override;
166+
167+
private:
168+
diff --git a/cpp/bindings.cpp b/cpp/bindings.cpp
169+
index 3af52b22a12ca4b07e4b019199cd969f3fac2f78..90e8dedf77c598eada71f0542c07773c6b27a82b 100644
170+
--- a/cpp/bindings.cpp
171+
+++ b/cpp/bindings.cpp
172+
@@ -36,6 +36,13 @@ void invalidate() {
173+
dbs.clear();
174+
}
175+
176+
+bool deleteAllDbs() {
177+
+ for(const auto &db : dbs) {
178+
+ db->drop();
179+
+ }
180+
+ return true;
181+
+}
182+
+
183+
void install(jsi::Runtime &rt,
184+
const std::shared_ptr<react::CallInvoker> &invoker,
185+
const char *base_path, const char *crsqlite_path,
186+
diff --git a/cpp/bindings.h b/cpp/bindings.h
187+
index 91511ab8dff0cbd34c6b8b844c1783c39d4317cb..cc73dfe4405d568cbfbbfa5a9c879a1d88f260bf 100644
188+
--- a/cpp/bindings.h
189+
+++ b/cpp/bindings.h
190+
@@ -14,6 +14,7 @@ void install(jsi::Runtime &rt,
191+
const char *base_path, const char *crsqlite_path,
192+
const char *sqlite_vec_path);
193+
void invalidate();
194+
+bool deleteAllDbs();
195+
void expoUpdatesWorkaround(const char *base_path);
196+
197+
} // namespace opsqlite
198+
diff --git a/op-sqlite.podspec b/op-sqlite.podspec
199+
index b8568b91ae3f578512a9687e71801182e3457b5e..f547bc0a63ba243b2b0bfaf51c3161f4ee04621b 100644
200+
--- a/op-sqlite.podspec
201+
+++ b/op-sqlite.podspec
202+
@@ -11,20 +11,11 @@ folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1
203+
fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
204+
205+
parent_folder_name = File.basename(__dir__)
206+
-app_package = nil
207+
-# When installed on user node_modules lives inside node_modules/@op-engineering/op-sqlite
208+
-if is_user_app
209+
- app_package = JSON.parse(File.read(File.join(__dir__, "..", "..", "..", "package.json")))
210+
-# When running on the example app
211+
-else
212+
- app_package = JSON.parse(File.read(File.join(__dir__, "example", "package.json")))
213+
-end
214+
215+
-op_sqlite_config = app_package["op-sqlite"]
216+
-use_sqlcipher = false
217+
+use_sqlcipher = true
218+
use_crsqlite = false
219+
use_libsql = false
220+
-performance_mode = false
221+
+performance_mode = true
222+
phone_version = false
223+
sqlite_flags = ""
224+
fts5 = false
225+
@@ -32,19 +23,6 @@ rtree = false
226+
use_sqlite_vec = false
227+
tokenizers = []
228+
229+
-if(op_sqlite_config != nil)
230+
- use_sqlcipher = op_sqlite_config["sqlcipher"] == true
231+
- use_crsqlite = op_sqlite_config["crsqlite"] == true
232+
- use_libsql = op_sqlite_config["libsql"] == true
233+
- performance_mode = op_sqlite_config["performanceMode"] || false
234+
- phone_version = op_sqlite_config["iosSqlite"] == true
235+
- sqlite_flags = op_sqlite_config["sqliteFlags"] || ""
236+
- fts5 = op_sqlite_config["fts5"] == true
237+
- rtree = op_sqlite_config["rtree"] == true
238+
- use_sqlite_vec = op_sqlite_config["sqliteVec"] == true
239+
- tokenizers = op_sqlite_config["tokenizers"] || []
240+
-end
241+
-
242+
if phone_version then
243+
if use_sqlcipher then
244+
raise "SQLCipher is not supported with phone version"

.yarnrc.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
nodeLinker: node-modules
2+
nmHoistingLimits: workspaces

0 commit comments

Comments
 (0)