Skip to content

Commit 61a625b

Browse files
authored
Add a Kotlin Native implementation (#1)
1 parent f526047 commit 61a625b

File tree

13 files changed

+134
-15
lines changed

13 files changed

+134
-15
lines changed

.github/workflows/pr.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,10 @@ jobs:
7777
run: ./gradlew lintRelease
7878

7979
test:
80-
runs-on: ubuntu-latest
80+
strategy:
81+
matrix:
82+
os: [ macos-latest, ubuntu-latest ]
83+
runs-on: ${{matrix.os}}
8184
steps:
8285
- uses: actions/checkout@v4
8386

@@ -93,6 +96,11 @@ jobs:
9396

9497
- name: Run tests
9598
run: ./gradlew allTests
99+
if: matrix.os == 'ubuntu-latest'
100+
101+
- name: Run Apple tests
102+
run: ./gradlew iosX64Test macosX64Test
103+
if: matrix.os == 'macos-latest'
96104

97105
env:
98106
GRADLE_OPTS: -Dorg.gradle.daemon=false -Dkotlin.incremental=false -Dorg.gradle.jvmargs="-Xmx16g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:MaxMetaspaceSize=1024m"

README.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ libraries.
55

66
It works with any of the available implementations of AndroidX SQLite; see their documentation for more information.
77

8-
Currently only Android and JVM are supported.
9-
108
## Gradle
119

1210
```kotlin

build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ gradleConventionsDefaults {
4040
gradleConventionsKmpDefaults {
4141
targets(
4242
KmpTarget.Android,
43+
KmpTarget.Ios,
4344
KmpTarget.Jvm,
45+
KmpTarget.Linux,
46+
KmpTarget.Macos,
4447
)
4548
}

gradle/libs.versions.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ kotlin = "2.1.0"
2121

2222
ktlint = "1.5.0"
2323

24+
okio = "3.10.2"
25+
2426
publish = "0.30.0"
2527

2628
[plugins]
@@ -45,6 +47,8 @@ cashapp-sqldelight-runtime = { module = "app.cash.sqldelight:runtime", version.r
4547
# not actually used; just here so renovate picks it up
4648
ktlint = { module = "com.pinterest.ktlint:ktlint-bom", version.ref = "ktlint" }
4749

50+
okio = { module = "com.squareup.okio:okio", version.ref = "okio" }
51+
4852
test-androidx-core = "androidx.test:core:1.6.1"
4953
test-junit = { module = "junit:junit", version = "4.13.2" }
5054
test-kotlin = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }

library/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,10 @@ kotlin {
3939
implementation(libs.androidx.sqliteBundled)
4040
implementation(libs.test.kotlin.junit)
4141
}
42+
43+
nativeTest.dependencies {
44+
implementation(libs.androidx.sqliteBundled)
45+
implementation(libs.okio)
46+
}
4247
}
4348
}

library/src/androidUnitTest/kotlin/com/eygraber/sqldelight/androidx/driver/AndroidxSqliteCommonTests.android.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,25 @@ import app.cash.sqldelight.Transacter
66
import org.junit.Assert
77
import org.junit.runner.RunWith
88
import org.robolectric.RobolectricTestRunner
9+
import java.io.File
910
import java.util.concurrent.Semaphore
1011

1112
@RunWith(RobolectricTestRunner::class)
1213
actual class CommonDriverTest : AndroidxSqliteDriverTest()
1314

14-
@RunWith(RobolectricTestRunner::class)
15-
actual class CommonEphemeralTest : AndroidxSqliteEphemeralTest()
16-
1715
@RunWith(RobolectricTestRunner::class)
1816
actual class CommonQueryTest : AndroidxSqliteQueryTest()
1917

2018
@RunWith(RobolectricTestRunner::class)
2119
actual class CommonTransacterTest : AndroidxSqliteTransacterTest()
2220

21+
@RunWith(RobolectricTestRunner::class)
22+
actual class CommonEphemeralTest : AndroidxSqliteEphemeralTest() {
23+
override fun deleteDbFile(filename: String) {
24+
File(filename).delete()
25+
}
26+
}
27+
2328
actual fun androidxSqliteTestDriver(): SQLiteDriver = AndroidSQLiteDriver()
2429

2530
actual inline fun <T> assertChecksThreadConfinement(

library/src/commonMain/kotlin/com/eygraber/sqldelight/androidx/driver/AndroidxSqliteDriver.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import app.cash.sqldelight.db.SqlDriver
1313
import app.cash.sqldelight.db.SqlPreparedStatement
1414
import app.cash.sqldelight.db.SqlSchema
1515
import kotlinx.atomicfu.locks.SynchronizedObject
16+
import kotlinx.atomicfu.locks.synchronized
1617

1718
internal expect class TransactionsThreadLocal() {
1819
internal fun get(): Transacter.Transaction?
@@ -22,7 +23,7 @@ internal expect class TransactionsThreadLocal() {
2223
internal const val DEFAULT_CACHE_SIZE = 20
2324

2425
/**
25-
* @param name Name of the database file, an empty string for a temporary database, or null for an in-memory database
26+
* @param databaseType Specifies the type of the database file
2627
* (see [Sqlite open documentation](https://www.sqlite.org/c3ref/open.html)).
2728
*
2829
* @see AndroidxSqliteDriver

library/src/commonTest/kotlin/com/eygraber/sqldelight/androidx/driver/AndroidxSqliteCommonTests.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import androidx.sqlite.SQLiteDriver
44
import app.cash.sqldelight.Transacter
55

66
expect class CommonDriverTest() : AndroidxSqliteDriverTest
7-
expect class CommonEphemeralTest() : AndroidxSqliteEphemeralTest
87
expect class CommonQueryTest() : AndroidxSqliteQueryTest
98
expect class CommonTransacterTest() : AndroidxSqliteTransacterTest
109

10+
expect class CommonEphemeralTest() : AndroidxSqliteEphemeralTest
11+
1112
expect fun androidxSqliteTestDriver(): SQLiteDriver
1213

1314
expect inline fun <T> assertChecksThreadConfinement(

library/src/commonTest/kotlin/com/eygraber/sqldelight/androidx/driver/AndroidxSqliteDriverTest.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,12 @@ abstract class AndroidxSqliteDriverTest {
6666
): SqlDriver = AndroidxSqliteDriver(androidxSqliteTestDriver(), AndroidxSqliteDatabaseType.Memory, schema)
6767

6868
private fun useSingleItemCacheDriver(block: (AndroidxSqliteDriver) -> Unit) {
69-
AndroidxSqliteDriver(androidxSqliteTestDriver(), AndroidxSqliteDatabaseType.Memory, schema, cacheSize = 1).use(block)
69+
AndroidxSqliteDriver(
70+
androidxSqliteTestDriver(),
71+
AndroidxSqliteDatabaseType.Memory,
72+
schema,
73+
cacheSize = 1,
74+
).use(block)
7075
}
7176

7277
private fun changes(): Long? =

library/src/commonTest/kotlin/com/eygraber/sqldelight/androidx/driver/AndroidxSqliteEphemeralTest.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import app.cash.sqldelight.db.QueryResult
66
import app.cash.sqldelight.db.SqlCursor
77
import app.cash.sqldelight.db.SqlDriver
88
import app.cash.sqldelight.db.SqlSchema
9-
import org.junit.After
10-
import java.io.File
9+
import kotlin.test.AfterTest
1110
import kotlin.test.BeforeTest
1211
import kotlin.test.Test
1312
import kotlin.test.assertEquals
@@ -57,6 +56,8 @@ abstract class AndroidxSqliteEphemeralTest {
5756

5857
private val dbName = "com.eygraber.sqldelight.androidx.driver.test.db"
5958

59+
protected abstract fun deleteDbFile(filename: String)
60+
6061
private fun setupDatabase(
6162
type: Type,
6263
): SqlDriver = when(type) {
@@ -67,12 +68,12 @@ abstract class AndroidxSqliteEphemeralTest {
6768

6869
@BeforeTest
6970
fun clearNamedDb() {
70-
File(dbName).delete()
71+
deleteDbFile(dbName)
7172
}
7273

73-
@After
74+
@AfterTest
7475
fun clearNamedDbPostTests() {
75-
File(dbName).delete()
76+
deleteDbFile(dbName)
7677
}
7778

7879
@Test

0 commit comments

Comments
 (0)