|
| 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" |
0 commit comments