Skip to content

Commit 7d923cf

Browse files
committed
First go at turso
1 parent 38d2d6d commit 7d923cf

17 files changed

Lines changed: 904 additions & 71 deletions

.github/workflows/ci.yml

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,3 +412,103 @@ jobs:
412412
name: android-logcat-${{ github.job }}
413413
path: example/android-logcat.txt
414414
if-no-files-found: ignore
415+
416+
ios-turso:
417+
runs-on: macos-latest
418+
steps:
419+
- name: Checkout
420+
uses: actions/checkout@v4
421+
422+
- name: Xcode Select
423+
run: sudo xcode-select -s /Applications/Xcode_16.4.app
424+
425+
- name: Turn on Turso
426+
run: |
427+
node ./scripts/turnOnTurso.js
428+
429+
- name: Setup
430+
uses: ./.github/actions/setup
431+
432+
- name: install bundler dependencies
433+
run: |
434+
cd example
435+
bundle install
436+
437+
- name: Cache cocoapods
438+
id: cocoapods-cache
439+
uses: actions/cache@v4
440+
with:
441+
path: |
442+
**/ios/Pods
443+
key: ${{ runner.os }}-cocoapods-${{ hashFiles('example/ios/Podfile.lock') }}
444+
restore-keys: |
445+
${{ runner.os }}-cocoapods-
446+
447+
- name: Install cocoapods
448+
run: |
449+
cd example/ios
450+
bundle exec pod install
451+
env:
452+
NO_FLIPPER: 1
453+
454+
- name: run tests
455+
run: |
456+
./scripts/test-ios.sh
457+
458+
android-turso:
459+
runs-on: ubuntu-latest
460+
timeout-minutes: 40
461+
steps:
462+
- uses: actions/checkout@v4
463+
464+
- run: node ./scripts/turnOnTurso.js
465+
466+
- name: Setup
467+
uses: ./.github/actions/setup
468+
469+
- name: Install JDK
470+
uses: actions/setup-java@v3
471+
with:
472+
distribution: "zulu"
473+
java-version: "17"
474+
475+
- name: Finalize Android SDK
476+
run: |
477+
/bin/bash -c "yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses > /dev/null"
478+
479+
- name: Cache Gradle
480+
uses: actions/cache@v4
481+
with:
482+
path: |
483+
~/.gradle/wrapper
484+
~/.gradle/caches
485+
key: ${{ runner.os }}-gradle-${{ hashFiles('example/android/gradle/wrapper/gradle-wrapper.properties') }}
486+
restore-keys: |
487+
${{ runner.os }}-gradle-
488+
489+
- name: Enable KVM
490+
run: |
491+
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
492+
sudo udevadm control --reload-rules
493+
sudo udevadm trigger --name-match=kvm
494+
495+
- name: Give execute permissions to script
496+
run: chmod +x ./scripts/test-android.sh
497+
498+
- name: run tests
499+
uses: reactivecircus/android-emulator-runner@v2
500+
with:
501+
api-level: 29
502+
emulator-options: -no-window -no-boot-anim -no-audio -no-snapshot-load
503+
script: |
504+
adb wait-for-device
505+
adb shell input keyevent 82
506+
./scripts/test-android.sh
507+
508+
- name: Upload Android diagnostics
509+
if: failure()
510+
uses: actions/upload-artifact@v4
511+
with:
512+
name: android-logcat-${{ github.job }}
513+
path: example/android-logcat.txt
514+
if-no-files-found: ignore

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,4 @@ android/c_sources
8989
# c_sources/
9090

9191
scripts/sqlite-vec-*
92+
turso/

android/CMakeLists.txt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ if (USE_LIBSQL)
1515
include_directories(src/main/jniLibs/include)
1616
endif()
1717

18+
if (USE_TURSO)
19+
include_directories(src/main/tursoLibs/include)
20+
endif()
21+
1822
separate_arguments(SQLITE_FLAGS_LIST UNIX_COMMAND "${SQLITE_FLAGS}")
1923

2024
add_definitions(
@@ -52,6 +56,12 @@ elseif (USE_LIBSQL)
5256
add_definitions(
5357
-DOP_SQLITE_USE_LIBSQL=1
5458
)
59+
elseif (USE_TURSO)
60+
target_sources(${PACKAGE_NAME} PRIVATE ../cpp/turso_bridge.cpp)
61+
62+
add_definitions(
63+
-DOP_SQLITE_USE_TURSO=1
64+
)
5565
else()
5666
target_sources(${PACKAGE_NAME} PRIVATE ../cpp/sqlite3.c ../cpp/bridge.cpp)
5767
endif()
@@ -104,6 +114,22 @@ elseif (USE_LIBSQL)
104114
ReactAndroid::jsi
105115
fbjni::fbjni
106116
)
117+
elseif (USE_TURSO)
118+
cmake_path(SET TURSO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src/main/tursoLibs/${ANDROID_ABI}/libturso_sdk_kit.so NORMALIZE)
119+
add_library(turso_sdk_kit SHARED IMPORTED)
120+
set_target_properties(turso_sdk_kit PROPERTIES
121+
IMPORTED_LOCATION ${TURSO_PATH}
122+
IMPORTED_NO_SONAME TRUE
123+
)
124+
125+
target_link_libraries(
126+
${PACKAGE_NAME}
127+
turso_sdk_kit
128+
${LOG_LIB}
129+
ReactAndroid::reactnative
130+
ReactAndroid::jsi
131+
fbjni::fbjni
132+
)
107133
else ()
108134
target_link_libraries(
109135
${PACKAGE_NAME}

android/build.gradle

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def reactNativeArchitectures() {
3434

3535
def useSQLCipher = false
3636
def useLibsql = false
37+
def useTurso = false
3738
def useCRSQLite = false
3839
def performanceMode = false
3940
def sqliteFlags = ""
@@ -79,12 +80,19 @@ if(opsqliteConfig) {
7980
sqliteFlags = opsqliteConfig["sqliteFlags"] ? opsqliteConfig["sqliteFlags"] : ""
8081
enableFTS5 = !!opsqliteConfig["fts5"]
8182
useLibsql = !!opsqliteConfig["libsql"]
83+
useTurso = !!opsqliteConfig["turso"]
8284
enableRtree = !!opsqliteConfig["rtree"]
8385
tokenizers = opsqliteConfig["tokenizers"] ? opsqliteConfig["tokenizers"] : []
8486
}
8587

88+
if(useLibsql && useTurso) {
89+
throw new GradleException("[OP-SQLITE] Error: libsql and turso backends are mutually exclusive.")
90+
}
91+
8692
if(useSQLCipher) {
8793
println "[OP-SQLITE] using sqlcipher."
94+
} else if(useTurso) {
95+
println "[OP-SQLITE] using turso backend."
8896
} else if(useLibsql) {
8997
println "[OP-SQLITE] using libsql. Report any issues to Turso"
9098
}
@@ -127,6 +135,7 @@ android {
127135
targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
128136

129137
buildConfigField "boolean", "USE_LIBSQL", "${useLibsql}"
138+
buildConfigField "boolean", "USE_TURSO", "${useTurso}"
130139

131140
externalNativeBuild {
132141
cmake {
@@ -138,6 +147,10 @@ android {
138147
cFlags += "-DOP_SQLITE_USE_LIBSQL=1"
139148
cppFlags += "-DOP_SQLITE_USE_LIBSQL=1"
140149
}
150+
if(useTurso) {
151+
cFlags += "-DOP_SQLITE_USE_TURSO=1"
152+
cppFlags += "-DOP_SQLITE_USE_TURSO=1"
153+
}
141154
if(useCRSQLite) {
142155
cFlags += "-DOP_SQLITE_USE_CRSQLITE=1"
143156
cppFlags += "-DOP_SQLITE_USE_CRSQLITE=1"
@@ -179,6 +192,7 @@ android {
179192
"-DUSE_SQLCIPHER=${useSQLCipher ? 1 : 0}",
180193
"-DUSE_CRSQLITE=${useCRSQLite ? 1 : 0}",
181194
"-DUSE_LIBSQL=${useLibsql ? 1 : 0}",
195+
"-DUSE_TURSO=${useTurso ? 1 : 0}",
182196
"-DUSE_SQLITE_VEC=${useSqliteVec ? 1 : 0}",
183197
"-DUSER_DEFINED_SOURCE_FILES=${sourceFiles}",
184198
"-DUSER_DEFINED_TOKENIZERS_HEADER_PATH='${tokenizersHeaderPath}'",
@@ -244,6 +258,9 @@ android {
244258
if (useLibsql) {
245259
srcDirs += 'src/main/jniLibs'
246260
}
261+
if (useTurso) {
262+
srcDirs += 'src/main/tursoLibs'
263+
}
247264
if (useCRSQLite) {
248265
srcDirs += 'src/main/libcrsqlite'
249266
}

cpp/PreparedStatementHostObject.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ PreparedStatementHostObject::~PreparedStatementHostObject() {
116116
}
117117
#else
118118
if (_stmt != nullptr) {
119-
// sqlite3_finalize(_stmt);
119+
opsqlite_finalize_statement(_stmt);
120120
_stmt = nullptr;
121121
}
122122
#endif

cpp/bridge.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,12 @@ sqlite3_stmt *opsqlite_prepare_statement(sqlite3 *db,
338338
return statement;
339339
}
340340

341+
void opsqlite_finalize_statement(sqlite3_stmt *statement) {
342+
if (statement != nullptr) {
343+
sqlite3_finalize(statement);
344+
}
345+
}
346+
341347
BridgeResult opsqlite_execute(sqlite3 *db, std::string const &query,
342348
const std::vector<JSVariant> *params) {
343349
sqlite3_stmt *statement;

cpp/bridge.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ void opsqlite_deregister_rollback_hook(sqlite3 *db);
7171

7272
sqlite3_stmt *opsqlite_prepare_statement(sqlite3 *db, std::string const &query);
7373

74+
void opsqlite_finalize_statement(sqlite3_stmt *statement);
75+
7476
void opsqlite_bind_statement(sqlite3_stmt *statement,
7577
const std::vector<JSVariant> *params);
7678

0 commit comments

Comments
 (0)