diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 65053c47..599702d2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,25 +1,28 @@ name: build + on: workflow_dispatch: pull_request: - branches: - - "**" push: branches: - - "**" + - main jobs: build: strategy: + fail-fast: false matrix: - os: [ macOS-latest ] -# os: [ macOS-latest, ubuntu-18.04 ] GitHub actions removed ubuntu-18.04 -# os: [ macOS-latest, windows-latest, ubuntu-18.04 ] + os: [ macOS-latest, windows-latest, ubuntu-latest ] runs-on: ${{matrix.os}} steps: - name: Checkout the repo uses: actions/checkout@v4 + - uses: actions/setup-java@v2 + with: + distribution: "adopt" + java-version: "17" + - name: Install msys2 if: matrix.os == 'windows-latest' uses: msys2/setup-msys2@v2 @@ -29,7 +32,7 @@ jobs: install: git mingw-w64-x86_64-toolchain libsqlite - name: Validate Gradle Wrapper - uses: gradle/wrapper-validation-action@v1 + uses: gradle/actions/wrapper-validation@v4 - name: Cache gradle uses: actions/cache@v4 @@ -54,6 +57,11 @@ jobs: echo "c:\msys64\mingw64\bin" >> $GITHUB_PATH - name: Build + if: matrix.os != 'macOS-latest' run: ./gradlew build --no-daemon --stacktrace + + - name: Build and Test + if: matrix.os == 'macOS-latest' + run: ./gradlew build allTests --no-daemon --stacktrace env: GRADLE_OPTS: -Dorg.gradle.configureondemand=true -Dkotlin.incremental=false -Dorg.gradle.jvmargs="-Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:MaxMetaspaceSize=512m" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index ed9b2e63..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: deploy -on: workflow_dispatch - -jobs: - deploy: - runs-on: macos-latest - steps: - - name: Checkout the repo - uses: actions/checkout@v4 - - - uses: actions/setup-java@v2 - with: - distribution: "adopt" - java-version: "17" - - name: Validate Gradle Wrapper - uses: gradle/wrapper-validation-action@v1 - - name: Cache gradle - uses: actions/cache@v4 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} - restore-keys: | - ${{ runner.os }}-gradle- - - - name: Cache konan - uses: actions/cache@v4 - with: - path: ~/.konan - key: ${{ runner.os }}-gradle-${{ hashFiles('*.gradle.kts') }} - restore-keys: | - ${{ runner.os }}-gradle- - - - name: Publish - run: ./gradlew publish --no-daemon --stacktrace --no-build-cache - env: - ORG_GRADLE_PROJECT_SONATYPE_NEXUS_USERNAME: ${{ secrets.SONATYPE_NEXUS_USERNAME }} - ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.SONATYPE_NEXUS_USERNAME }} - ORG_GRADLE_PROJECT_SONATYPE_NEXUS_PASSWORD: ${{ secrets.SONATYPE_NEXUS_PASSWORD }} - ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.SONATYPE_NEXUS_PASSWORD }} - ORG_GRADLE_PROJECT_SIGNING_KEY: ${{ secrets.SIGNING_KEY }} - ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.SIGNING_KEY }} - -env: - GRADLE_OPTS: -Dkotlin.incremental=false -Dorg.gradle.jvmargs="-Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:MaxMetaspaceSize=512m" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2d726b61..7fa50b72 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -22,7 +22,7 @@ jobs: distribution: "adopt" java-version: "17" - name: Validate Gradle Wrapper - uses: gradle/wrapper-validation-action@v1 + uses: gradle/actions/wrapper-validation@v4 - name: Cache gradle uses: actions/cache@v4 with: @@ -39,8 +39,8 @@ jobs: restore-keys: | ${{ runner.os }}-gradle- - - name: Finish Maven Central Release - run: ./gradlew closeAndReleaseRepository --no-daemon --stacktrace --no-build-cache + - name: Publish Artifacts to Maven Central + run: ./gradlew publish --no-daemon --stacktrace --no-build-cache env: ORG_GRADLE_PROJECT_SONATYPE_NEXUS_USERNAME: ${{ secrets.SONATYPE_NEXUS_USERNAME }} ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.SONATYPE_NEXUS_USERNAME }} diff --git a/.gitignore b/.gitignore index 43c1311b..cf821771 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,4 @@ samples/**/*.kt.bc-build samples/androidNativeActivity/Polyhedron .vscode +.kotlin/ diff --git a/gradle.properties b/gradle.properties index bb953334..b472ea80 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ kotlin.code.style=official GROUP=co.touchlab VERSION_NAME=1.3.3 -KOTLIN_VERSION=1.9.20 +KOTLIN_VERSION=2.2.10 kotlin.native.ignoreDisabledTargets=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e411586a..3ae1e2f1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/sqliter-driver/build.gradle.kts b/sqliter-driver/build.gradle.kts index 93ecd94a..236e2e46 100644 --- a/sqliter-driver/build.gradle.kts +++ b/sqliter-driver/build.gradle.kts @@ -2,7 +2,7 @@ import org.jetbrains.kotlin.konan.target.HostManager plugins { kotlin("multiplatform") - id("com.vanniktech.maven.publish") version "0.27.0" + id("com.vanniktech.maven.publish") version "0.34.0" } val GROUP: String by project @@ -11,31 +11,13 @@ val VERSION_NAME: String by project group = GROUP version = VERSION_NAME -fun configInterop(target: org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget) { - val main by target.compilations.getting - val sqlite3 by main.cinterops.creating { - includeDirs("$projectDir/src/include") -// extraOpts = listOf("-mode", "sourcecode") - } - - target.compilations.forEach { kotlinNativeCompilation -> - kotlinNativeCompilation.kotlinOptions.freeCompilerArgs += when { - HostManager.hostIsLinux -> listOf( - "-linker-options", - "-lsqlite3 -L/usr/lib/x86_64-linux-gnu -L/usr/lib" - ) - - HostManager.hostIsMingw -> listOf("-linker-options", "-lsqlite3 -Lc:\\msys64\\mingw64\\lib") - else -> listOf("-linker-options", "-lsqlite3") - } - } -} - kotlin { - jvmToolchain(11) + jvmToolchain(17) } kotlin { + applyDefaultHierarchyTemplate() + val knTargets = listOf( macosX64(), iosX64(), @@ -55,75 +37,50 @@ kotlin { linuxArm64(), ) - knTargets - .forEach { target -> - configInterop(target) + knTargets.forEach { target -> + target.compilations["main"].cinterops.create("sqlite3").apply { + includeDirs("$projectDir/src/include") +// extraOpts = listOf("-mode", "sourcecode") } + target.compilerOptions { + freeCompilerArgs.addAll( + when { + HostManager.hostIsLinux -> listOf( + "-linker-options", + "-lsqlite3 -L/usr/lib/x86_64-linux-gnu -L/usr/lib" + ) + + HostManager.hostIsMingw -> listOf("-linker-options", "-lsqlite3 -Lc:\\msys64\\mingw64\\lib") + else -> listOf("-linker-options", "-lsqlite3") + } + ) + } + } + sourceSets { all { - languageSettings.apply { + languageSettings { optIn("kotlin.experimental.ExperimentalNativeApi") optIn("kotlinx.cinterop.ExperimentalForeignApi") optIn("kotlinx.cinterop.BetaInteropApi") - } - } - commonMain { - dependencies { - } - } - commonTest { - dependencies { - implementation(kotlin("test")) - } - } - - val nativeCommonMain = sourceSets.maybeCreate("nativeCommonMain") - val nativeCommonTest = sourceSets.maybeCreate("nativeCommonTest") - - val appleMain = sourceSets.maybeCreate("appleMain").apply { - dependsOn(nativeCommonMain) - } - val linuxMain = sourceSets.maybeCreate("linuxMain").apply { - dependsOn(nativeCommonMain) - } - val linuxX64Main = sourceSets.maybeCreate("linuxX64Main").apply { - dependsOn(linuxMain) - } - val linuxArm64Main = sourceSets.maybeCreate("linuxArm64Main").apply { - dependsOn(linuxMain) - } - - val mingwMain = sourceSets.maybeCreate("mingwMain").apply { - dependsOn(nativeCommonMain) - } - - val mingwX64Main = sourceSets.maybeCreate("mingwX64Main").apply { - dependsOn(mingwMain) - } - - knTargets.forEach { target -> - when { - target.name.startsWith("mingw") -> { - target.compilations.getByName("main").defaultSourceSet.dependsOn(mingwMain) - target.compilations.getByName("test").defaultSourceSet.dependsOn(nativeCommonTest) - } - target.name.startsWith("linux") -> { - target.compilations.getByName("test").defaultSourceSet.dependsOn(nativeCommonTest) - } - - else -> { - target.compilations.getByName("main").defaultSourceSet.dependsOn(appleMain) - target.compilations.getByName("test").defaultSourceSet.dependsOn(nativeCommonTest) + compilerOptions { + freeCompilerArgs.add("-Xexpect-actual-classes") } } } + + commonTest.dependencies { + implementation(kotlin("test")) + } } } -tasks.withType { - kotlinOptions.freeCompilerArgs += "-Xexpect-actual-classes" +mavenPublishing { + // Signing and POM are automatically handled by the plugin + gradle.properties + configureBasedOnAppliedPlugins(true, true) + publishToMavenCentral(automaticRelease = true) } listOf( diff --git a/sqliter-driver/src/linuxMain/kotlin/co/touchlab/sqliter/concurrency/Lock.kt b/sqliter-driver/src/linuxMain/kotlin/co/touchlab/sqliter/concurrency/Lock.kt index 19ea450a..bf3b8780 100644 --- a/sqliter-driver/src/linuxMain/kotlin/co/touchlab/sqliter/concurrency/Lock.kt +++ b/sqliter-driver/src/linuxMain/kotlin/co/touchlab/sqliter/concurrency/Lock.kt @@ -1,10 +1,19 @@ package co.touchlab.sqliter.concurrency -import co.touchlab.sqliter.util.maybeFreeze import kotlinx.cinterop.Arena import kotlinx.cinterop.alloc import kotlinx.cinterop.ptr -import platform.posix.* +import platform.posix.PTHREAD_MUTEX_RECURSIVE +import platform.posix.pthread_mutex_destroy +import platform.posix.pthread_mutex_init +import platform.posix.pthread_mutex_lock +import platform.posix.pthread_mutex_t +import platform.posix.pthread_mutex_trylock +import platform.posix.pthread_mutex_unlock +import platform.posix.pthread_mutexattr_destroy +import platform.posix.pthread_mutexattr_init +import platform.posix.pthread_mutexattr_settype +import platform.posix.pthread_mutexattr_t /** * A simple lock. @@ -19,7 +28,6 @@ internal actual class Lock actual constructor() { pthread_mutexattr_init(attr.ptr) pthread_mutexattr_settype(attr.ptr, PTHREAD_MUTEX_RECURSIVE.toInt()) pthread_mutex_init(mutex.ptr, attr.ptr) - maybeFreeze() } actual fun lock() { diff --git a/sqliter-driver/src/mingwX64Main/kotlin/co/touchlab/sqliter/concurrency/Lock.kt b/sqliter-driver/src/mingwX64Main/kotlin/co/touchlab/sqliter/concurrency/Lock.kt index fcc946f8..d5968c91 100644 --- a/sqliter-driver/src/mingwX64Main/kotlin/co/touchlab/sqliter/concurrency/Lock.kt +++ b/sqliter-driver/src/mingwX64Main/kotlin/co/touchlab/sqliter/concurrency/Lock.kt @@ -1,6 +1,5 @@ package co.touchlab.sqliter.concurrency -import co.touchlab.sqliter.util.maybeFreeze import kotlinx.cinterop.Arena import kotlinx.cinterop.alloc import kotlinx.cinterop.ptr @@ -29,7 +28,6 @@ internal actual class Lock actual constructor() { pthread_mutexattr_init(attr.ptr) pthread_mutexattr_settype(attr.ptr, PTHREAD_MUTEX_RECURSIVE.toInt()) pthread_mutex_init(mutex.ptr, attr.ptr) - maybeFreeze() } actual fun lock() { diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/concurrency/SingleThreadDatabaseConnection.kt b/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/concurrency/SingleThreadDatabaseConnection.kt deleted file mode 100644 index 038de212..00000000 --- a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/concurrency/SingleThreadDatabaseConnection.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2018 Touchlab, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package co.touchlab.sqliter.concurrency - -import co.touchlab.sqliter.DatabaseConnection -import co.touchlab.sqliter.util.ensureNeverFrozenIfStrictMM - -internal class SingleThreadDatabaseConnection(delegateConnection: DatabaseConnection):DatabaseConnection by delegateConnection -{ - init { - ensureNeverFrozenIfStrictMM() - } -} \ No newline at end of file diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/util/Functions.kt b/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/util/Functions.kt deleted file mode 100644 index f84916f8..00000000 --- a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/util/Functions.kt +++ /dev/null @@ -1,17 +0,0 @@ -package co.touchlab.sqliter.util - -import kotlin.native.concurrent.ensureNeverFrozen -import kotlin.native.concurrent.freeze - -@OptIn(FreezingIsDeprecated::class) -internal inline fun T.maybeFreeze(): T = if (Platform.memoryModel == MemoryModel.STRICT) { - this.freeze() -} else { - this -} - -@OptIn(FreezingIsDeprecated::class) -internal inline fun T.ensureNeverFrozenIfStrictMM() { - if (Platform.memoryModel == MemoryModel.STRICT) - this?.ensureNeverFrozen() -} \ No newline at end of file diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/Cursor.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/Cursor.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/Cursor.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/Cursor.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConfiguration.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/DatabaseConfiguration.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConfiguration.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/DatabaseConfiguration.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConnection.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/DatabaseConnection.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseConnection.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/DatabaseConnection.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseFileContext.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/DatabaseFileContext.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseFileContext.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/DatabaseFileContext.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseManager.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/DatabaseManager.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/DatabaseManager.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/DatabaseManager.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/Statement.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/Statement.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/Statement.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/Statement.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnection.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnection.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnection.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnection.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/concurrency/Lock.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/concurrency/Lock.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/concurrency/Lock.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/concurrency/Lock.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/createDatabaseManager.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/createDatabaseManager.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/createDatabaseManager.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/createDatabaseManager.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/internal/File.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/internal/File.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/internal/File.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/internal/File.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/ActualSqliteStatement.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/ActualSqliteStatement.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/ActualSqliteStatement.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/ActualSqliteStatement.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/Logger.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/Logger.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/Logger.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/Logger.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/SQLiteException.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/SQLiteException.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/SQLiteException.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/SQLiteException.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/SqliteDatabase.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/SqliteDatabase.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/SqliteDatabase.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/SqliteDatabase.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/SqliteStatement.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/SqliteStatement.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/SqliteStatement.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/SqliteStatement.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/TracingSqliteStatement.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/TracingSqliteStatement.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/TracingSqliteStatement.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/TracingSqliteStatement.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/Types.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/Types.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/interop/Types.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/interop/Types.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeCursor.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeCursor.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeCursor.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeCursor.kt diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseConnection.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseConnection.kt similarity index 95% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseConnection.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseConnection.kt index b1787fc7..012f084a 100644 --- a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseConnection.kt +++ b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseConnection.kt @@ -21,7 +21,6 @@ import co.touchlab.sqliter.concurrency.Lock import co.touchlab.sqliter.concurrency.withLock import co.touchlab.sqliter.interop.SqliteDatabase import co.touchlab.sqliter.interop.SqliteDatabasePointer -import co.touchlab.sqliter.util.maybeFreeze import kotlin.concurrent.AtomicInt import kotlin.concurrent.AtomicReference @@ -50,12 +49,12 @@ class NativeDatabaseConnection internal constructor( override fun beginTransaction() = transLock.withLock { withStatement("BEGIN;") { execute() } - transaction.value = Transaction(false).maybeFreeze() + transaction.value = Transaction(false) } override fun setTransactionSuccessful() = transLock.withLock { val trans = checkFailTransaction() - transaction.value = trans.copy(successful = true).maybeFreeze() + transaction.value = trans.copy(successful = true) } override fun endTransaction() = transLock.withLock { diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt similarity index 80% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt index 1f2b35d2..bac6fad3 100644 --- a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt +++ b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeDatabaseManager.kt @@ -16,25 +16,33 @@ package co.touchlab.sqliter.native -import co.touchlab.sqliter.* +import co.touchlab.sqliter.DatabaseConfiguration +import co.touchlab.sqliter.DatabaseConnection +import co.touchlab.sqliter.DatabaseManager +import co.touchlab.sqliter.NO_VERSION_CHECK import co.touchlab.sqliter.concurrency.ConcurrentDatabaseConnection import co.touchlab.sqliter.concurrency.Lock -import co.touchlab.sqliter.concurrency.SingleThreadDatabaseConnection import co.touchlab.sqliter.concurrency.withLock import co.touchlab.sqliter.interop.OpenFlags import co.touchlab.sqliter.interop.dbOpen -import co.touchlab.sqliter.util.maybeFreeze +import co.touchlab.sqliter.resetCipherKey +import co.touchlab.sqliter.setCipherKey +import co.touchlab.sqliter.updateForeignKeyConstraints +import co.touchlab.sqliter.updateJournalMode +import co.touchlab.sqliter.updateRecursiveTriggers +import co.touchlab.sqliter.updateSynchronousFlag import kotlin.concurrent.AtomicInt -class NativeDatabaseManager(private val path:String, - override val configuration: DatabaseConfiguration -): DatabaseManager { +class NativeDatabaseManager( + private val path: String, + override val configuration: DatabaseConfiguration +) : DatabaseManager { override fun createMultiThreadedConnection(): DatabaseConnection { - return ConcurrentDatabaseConnection(createConnection()).maybeFreeze() + return ConcurrentDatabaseConnection(createConnection()) } override fun createSingleThreadedConnection(): DatabaseConnection { - return SingleThreadDatabaseConnection(createConnection()) + return createConnection() } private val lock = Lock() @@ -83,13 +91,18 @@ class NativeDatabaseManager(private val path:String, conn.updateRecursiveTriggers(configuration.extendedConfig.recursiveTriggers) - if(newConnection.value == 0){ + if (newConnection.value == 0) { conn.updateJournalMode(configuration.journalMode) try { val version = configuration.version - if(version != NO_VERSION_CHECK) - conn.migrateIfNeeded(configuration.create, configuration.upgrade, configuration.downgrade, version) + if (version != NO_VERSION_CHECK) + conn.migrateIfNeeded( + configuration.create, + configuration.upgrade, + configuration.downgrade, + version + ) } catch (e: Exception) { // If this failed, we have to close the connection or we will end up leaking it. @@ -115,7 +128,7 @@ class NativeDatabaseManager(private val path:String, } } - internal fun closeConnection(connection:DatabaseConnection){ + internal fun closeConnection(connection: DatabaseConnection) { configuration.lifecycleConfig.onCloseConnection(connection) } } diff --git a/sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeStatement.kt b/sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeStatement.kt similarity index 100% rename from sqliter-driver/src/nativeCommonMain/kotlin/co/touchlab/sqliter/native/NativeStatement.kt rename to sqliter-driver/src/nativeMain/kotlin/co/touchlab/sqliter/native/NativeStatement.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/BaseDatabaseTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/BaseDatabaseTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/BaseDatabaseTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/BaseDatabaseTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/BasicTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/BasicTest.kt similarity index 89% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/BasicTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/BasicTest.kt index e8d74823..56342ec1 100644 --- a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/BasicTest.kt +++ b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/BasicTest.kt @@ -16,10 +16,10 @@ package co.touchlab.sqliter -import kotlin.system.getTimeMillis import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue +import kotlin.time.TimeSource class BasicTest{ @@ -27,7 +27,7 @@ class BasicTest{ fun createTable(){ basicTestDb {manager -> val connection = manager.createSingleThreadedConnection() - val start = getTimeMillis() + val start = TimeSource.Monotonic.markNow() connection.withTransaction { val statement = it.createStatement("INSERT INTO test VALUES (?, ?, ?, ?)") for(i in 0 until 100_000) { @@ -50,13 +50,13 @@ class BasicTest{ println("Query timeBlocking: $timeBlocking") } - println("Full run time ${getTimeMillis() - start}") + println("Full run time ${start.elapsedNow().inWholeMilliseconds}") connection.close() } } inline fun timeCursorBlocking(cursor:Cursor, proc:(Cursor)->Boolean):Long{ - val start = getTimeMillis() + val start = TimeSource.Monotonic.markNow() var rowCount = 0 while (proc(cursor)) { rowCount++ @@ -69,6 +69,6 @@ class BasicTest{ val names = cursor.columnNames assertEquals(4, names.size) - return getTimeMillis() - start + return start.elapsedNow().inWholeMilliseconds } } \ No newline at end of file diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/CursorExtensions.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/CursorExtensions.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/CursorExtensions.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/CursorExtensions.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/CursorTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/CursorTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/CursorTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/CursorTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/DatabaseConfigurationTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/DatabaseConfigurationTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/DatabaseConfigurationTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/DatabaseConfigurationTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/DatabaseConnectionTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/DatabaseConnectionTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/DatabaseConnectionTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/DatabaseConnectionTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/DatabaseManagerTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/DatabaseManagerTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/DatabaseManagerTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/DatabaseManagerTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/Helper.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/Helper.kt similarity index 70% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/Helper.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/Helper.kt index efeb4b82..036a2091 100644 --- a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/Helper.kt +++ b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/Helper.kt @@ -19,45 +19,47 @@ package co.touchlab.sqliter import co.touchlab.sqliter.DatabaseFileContext.deleteDatabase import kotlin.native.concurrent.Future import kotlin.native.concurrent.waitForMultipleFutures +import kotlin.random.Random val TEST_DB_NAME = "testdb" fun createTestDb( - name:String = TEST_DB_NAME, - version:Int = 1, - timeout:Int? = null, - update:(DatabaseConnection, Int, Int)->Unit = {_,_,_->}, + name: String = TEST_DB_NAME, + version: Int = 1, + timeout: Int? = null, + update: (DatabaseConnection, Int, Int) -> Unit = { _, _, _ -> }, onCreateConnection: (DatabaseConnection) -> Unit = { _ -> }, onCloseConnection: (DatabaseConnection) -> Unit = { _ -> }, - create:(DatabaseConnection)->Unit - ):DatabaseManager{ + create: (DatabaseConnection) -> Unit +): DatabaseManager { try { deleteDatabase(name) } catch (e: Exception) { } var extended = DatabaseConfiguration.Extended() - if(timeout != null) + if (timeout != null) extended = extended.copy(busyTimeout = timeout) - return createDatabaseManager(DatabaseConfiguration( - name = name, - version = version, - create = create, - upgrade = update, - loggingConfig = DatabaseConfiguration.Logging(logger = NoneLogger), - lifecycleConfig = DatabaseConfiguration.Lifecycle( - onCreateConnection = onCreateConnection, - onCloseConnection = onCloseConnection - ), - extendedConfig = extended - )) + return createDatabaseManager( + DatabaseConfiguration( + name = name, + version = version, + create = create, + upgrade = update, + loggingConfig = DatabaseConfiguration.Logging(logger = NoneLogger), + lifecycleConfig = DatabaseConfiguration.Lifecycle( + onCreateConnection = onCreateConnection, + onCloseConnection = onCloseConnection + ), + extendedConfig = extended + ) + ) } -inline fun deleteAfter(name: String, manager: DatabaseManager, block:(DatabaseManager)->Unit){ +inline fun deleteAfter(name: String, manager: DatabaseManager, block: (DatabaseManager) -> Unit) { try { block(manager) - } - finally { + } finally { deleteDatabase(name) } } @@ -101,13 +103,11 @@ fun Collection>.waitForAllFutures() { } } -/** - * For connections where we don't care about threading, randomize(ish) - */ -fun DatabaseManager.surpriseMeConnection():DatabaseConnection { - return if(currentTimeMillis() %2 == 0L){ +/** For connections where we don't care about threading, randomize(ish) */ +fun DatabaseManager.surpriseMeConnection(): DatabaseConnection { + return if (Random.nextBoolean()) { createMultiThreadedConnection() - }else{ + } else { createSingleThreadedConnection() } } \ No newline at end of file diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/MultithreadedTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/MultithreadedTest.kt similarity index 95% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/MultithreadedTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/MultithreadedTest.kt index da16f9f8..c1ad9ba5 100644 --- a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/MultithreadedTest.kt +++ b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/MultithreadedTest.kt @@ -23,6 +23,7 @@ import kotlin.native.concurrent.Worker import kotlin.native.concurrent.freeze import kotlin.test.Test import kotlin.test.assertEquals +import kotlin.time.TimeSource class MultithreadedTest { /*@Test @@ -48,12 +49,12 @@ class MultithreadedTest { } } */ - inline fun timer(block:()->Unit){ - val start = currentTimeMillis() + inline fun timer(block: () -> Unit) { + val start = TimeSource.Monotonic.markNow() try { block() - }finally { - println("Total time ${currentTimeMillis() - start}") + } finally { + println("Total time ${start.elapsedNow().inWholeMilliseconds}") } } diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/NativeCursorTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/NativeCursorTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/NativeCursorTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/NativeCursorTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/NativeDatabaseConnectionTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/NativeDatabaseConnectionTest.kt similarity index 90% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/NativeDatabaseConnectionTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/NativeDatabaseConnectionTest.kt index 089d2907..6e0368e3 100644 --- a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/NativeDatabaseConnectionTest.kt +++ b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/NativeDatabaseConnectionTest.kt @@ -16,30 +16,29 @@ package co.touchlab.sqliter -import co.touchlab.sqliter.util.maybeFreeze import platform.posix.usleep import kotlin.concurrent.AtomicInt import kotlin.native.concurrent.Future import kotlin.native.concurrent.FutureState import kotlin.native.concurrent.TransferMode import kotlin.native.concurrent.Worker -import kotlin.system.getTimeMillis import kotlin.test.* +import kotlin.time.TimeSource -class NativeDatabaseConnectionTest : BaseDatabaseTest(){ +class NativeDatabaseConnectionTest : BaseDatabaseTest() { -// @Test + // @Test fun multithreadedActivityWAL() { multithreadedActivity(JournalMode.WAL) } -// @Test + // @Test fun multithreadedActivityDELETE() { multithreadedActivity(JournalMode.DELETE) } fun multithreadedActivity(mode: JournalMode) { - val start = getTimeMillis() + val start = TimeSource.Monotonic.markNow() val manager = createDatabaseManager( DatabaseConfiguration( name = TEST_DB_NAME, version = 1, @@ -83,7 +82,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ val workers = Array(10) { Worker.start() } val futures = mutableListOf>() workers.forEach { - futures.add(it.execute(TransferMode.SAFE, { ManagerOps(manager, biginsert, bigselect).maybeFreeze() }) { + futures.add(it.execute(TransferMode.SAFE, { ManagerOps(manager, biginsert, bigselect) }) { val conn = it.manager.surpriseMeConnection() try { for (i in 0 until 10) { @@ -107,7 +106,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ workers.forEach { it.requestTermination() } assertEquals(2_550_000, mainConn.longForQuery("select count(*) from test")) - println("time ${mode.name} ${getTimeMillis() - start}") + println("time ${mode.name} ${start.elapsedNow().inWholeMilliseconds}") mainConn.close() } @@ -153,7 +152,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ reader.withStatement("select num, str from test limit 20") { val cursor = query() cursor.next() - val start = getTimeMillis() + val start = TimeSource.Monotonic.markNow() writer.withStatement("insert into test(num, str)values(?,?)") { bindLong(1, 1) @@ -165,7 +164,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ executeInsert() } - val time = getTimeMillis() - start + val time = start.elapsedNow().inWholeMilliseconds //Verify probably worked without delay assertTrue(time < 100) @@ -215,7 +214,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ reader.withStatement("select num, str from test limit 20") { val cursor = query() cursor.next() - val start = getTimeMillis() + val start = TimeSource.Monotonic.markNow() assertFails { writer.withStatement("insert into test(num, str)values(?,?)") { @@ -229,7 +228,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ } } - val time = getTimeMillis() - start + val time = start.elapsedNow().inWholeMilliseconds //Verify timeout on writer assertTrue(time > 1300) @@ -272,7 +271,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ threadWait(3000, manager) { val queryBlock: (DatabaseConnection) -> Unit = { it.withStatement("select num, str from test limit 20") { - val start = getTimeMillis() + val start = TimeSource.Monotonic.markNow() val cursor = query() cursor.next() try { @@ -281,7 +280,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ println("cursor ${cursor.getLong(0)}/${cursor.getString(1)}") } - println("Run time ${getTimeMillis() - start}") + println("Run time ${start.elapsedNow().inWholeMilliseconds}") } finally { cursor.statement.resetStatement() } @@ -297,18 +296,21 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ } } -// @Test + // @Test fun testTimeout() { - val manager = createDatabaseManager(DatabaseConfiguration( - name = TEST_DB_NAME, - version = 1, - create = { db -> - db.withStatement(TWO_COL) { - execute() - } - }, - extendedConfig = DatabaseConfiguration.Extended(busyTimeout = 4000), - loggingConfig = DatabaseConfiguration.Logging(logger = NoneLogger))) + val manager = createDatabaseManager( + DatabaseConfiguration( + name = TEST_DB_NAME, + version = 1, + create = { db -> + db.withStatement(TWO_COL) { + execute() + } + }, + extendedConfig = DatabaseConfiguration.Extended(busyTimeout = 4000), + loggingConfig = DatabaseConfiguration.Logging(logger = NoneLogger) + ) + ) val block: (DatabaseConnection) -> Unit = { it.withTransaction { @@ -341,7 +343,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ }*/ @Test - fun testFailedCloseRecall(){ + fun testFailedCloseRecall() { val manager = basicDb() val conn = manager.createMultiThreadedConnection() @@ -355,7 +357,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ } @Test - fun lateQueryCloseSucceeds(){ + fun lateQueryCloseSucceeds() { val manager = basicDb() val conn = manager.createMultiThreadedConnection() @@ -393,7 +395,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ execute() } }, - upgrade = {_,_,_ -> + upgrade = { _, _, _ -> throw IllegalStateException("This shouldn't happen") }, extendedConfig = DatabaseConfiguration.Extended(busyTimeout = 3000), @@ -408,15 +410,15 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ create = { throw IllegalStateException("This shouldn't happen") }, - upgrade = {_,_,_ -> - if(!upgradeCalled.compareAndSet(0, 1)) + upgrade = { _, _, _ -> + if (!upgradeCalled.compareAndSet(0, 1)) throw IllegalStateException("Multiple upgrade calls") } ) val workers = (0 until 20).map { Worker.start(errorReporting = true, name = "Test Worker $it") } val futures = workers.map { worker -> - worker.execute(TransferMode.SAFE, { config2.maybeFreeze() }) { + worker.execute(TransferMode.SAFE, { config2 }) { val managerInner = createDatabaseManager(it) val conn = managerInner.createMultiThreadedConnection() conn.close() @@ -425,7 +427,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ futures.forEach { it.result - if(it.state == FutureState.THROWN) + if (it.state == FutureState.THROWN) throw IllegalStateException("db failed") } } @@ -433,7 +435,7 @@ class NativeDatabaseConnectionTest : BaseDatabaseTest(){ private fun threadWait(time: Int, manager: DatabaseManager, block: (DatabaseConnection) -> Unit): Boolean { return manager.withConnection { val worker = Worker.start() - val future = worker.execute(TransferMode.SAFE, { Pair(manager, block).maybeFreeze() }) { + val future = worker.execute(TransferMode.SAFE, { Pair(manager, block) }) { try { usleep(500_000u) it.first.withConnection(it.second) diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/NativeDatabaseManagerTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/NativeDatabaseManagerTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/NativeDatabaseManagerTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/NativeDatabaseManagerTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/NativeStatementTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/NativeStatementTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/NativeStatementTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/NativeStatementTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/TestSupport.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/TestSupport.kt similarity index 63% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/TestSupport.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/TestSupport.kt index 9a00c730..82e9290e 100644 --- a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/TestSupport.kt +++ b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/TestSupport.kt @@ -16,16 +16,15 @@ package co.touchlab.sqliter -import co.touchlab.sqliter.util.maybeFreeze import kotlin.native.concurrent.Future import kotlin.native.concurrent.TransferMode import kotlin.native.concurrent.Worker -import kotlin.system.getTimeMillis +import kotlin.time.TimeSource -class MPWorker(){ +class MPWorker() { val worker = Worker.start() fun runBackground(backJob: () -> T): MPFuture { - return MPFuture(worker.execute(TransferMode.SAFE, {backJob.maybeFreeze()}){ + return MPFuture(worker.execute(TransferMode.SAFE, { backJob }) { it() }) } @@ -36,37 +35,35 @@ class MPWorker(){ } class MPFuture(private val future: Future) { - fun consume():T = future.result + fun consume(): T = future.result } -fun createWorker():MPWorker = MPWorker() +fun createWorker(): MPWorker = MPWorker() -class ThreadOps(val producer:()->C){ - private val exes = mutableListOf<(C)->Unit>() - private val tests = mutableListOf<(C)->Unit>() +class ThreadOps(val producer: () -> C) { + private val exes = mutableListOf<(C) -> Unit>() + private val tests = mutableListOf<(C) -> Unit>() var lastRunTime = 0L - fun exe(proc:(C)->Unit){ + fun exe(proc: (C) -> Unit) { exes.add(proc) } - fun test(proc:(C)->Unit){ + fun test(proc: (C) -> Unit) { tests.add(proc) } - fun run(threads:Int, collection:C = producer(), randomize:Boolean = false):C{ + fun run(threads: Int, collection: C = producer(), randomize: Boolean = false): C { - if(randomize){ + if (randomize) { exes.shuffle() tests.shuffle() } - exes.maybeFreeze() + val start = TimeSource.Monotonic.markNow() - val start = currentTimeMillis() - - val workers= Array(threads){MPWorker()} - for(i in 0 until exes.size){ + val workers = Array(threads) { MPWorker() } + for (i in 0 until exes.size) { val ex = exes[i] workers[i % workers.size] .runBackground { ex(collection) } @@ -75,10 +72,8 @@ class ThreadOps(val producer:()->C){ tests.forEach { it(collection) } - lastRunTime = currentTimeMillis() - start + lastRunTime = start.elapsedNow().inWholeMilliseconds return collection } } - -fun currentTimeMillis(): Long = getTimeMillis() \ No newline at end of file diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnectionTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnectionTest.kt similarity index 85% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnectionTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnectionTest.kt index 259898d6..af4281c1 100644 --- a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnectionTest.kt +++ b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentDatabaseConnectionTest.kt @@ -17,10 +17,9 @@ package co.touchlab.sqliter.concurrency import co.touchlab.sqliter.* -import co.touchlab.sqliter.util.maybeFreeze import kotlin.test.Test import kotlin.test.assertEquals -import kotlin.test.assertFails +import kotlin.time.TimeSource class ConcurrentDatabaseConnectionTest { @@ -41,7 +40,7 @@ class ConcurrentDatabaseConnectionTest { } else { it.createMultiThreadedConnection() } - val start = currentTimeMillis() + val start = TimeSource.Monotonic.markNow() val statement = conn.createStatement("insert into test(num, str)values(?,?)") @@ -59,7 +58,7 @@ class ConcurrentDatabaseConnectionTest { statement.finalizeStatement() } - totalTime = currentTimeMillis() - start + totalTime = start.elapsedNow().inWholeMilliseconds assertEquals((INSERT_COUNT * INSERT_LOOP_COUNT).toLong(), conn.longForQuery("select count(*) from test")) conn.close() @@ -68,25 +67,6 @@ class ConcurrentDatabaseConnectionTest { return totalTime } - - @Test - fun singleThreadedConnectionFreezeFails() { - // Skip if not strict - if (Platform.memoryModel != MemoryModel.STRICT) { - return - } - basicTestDb(TWO_COL) { - val conn = it.createSingleThreadedConnection() - try { - assertFails { conn.maybeFreeze() } - } catch (assertion: AssertionError) { - throw assertion - } finally { - conn.close() - } - } - } - @Test fun concurrentAccessWorks() { basicTestDb(TWO_COL) { diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentPlaygroundTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentPlaygroundTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentPlaygroundTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/concurrency/ConcurrentPlaygroundTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/cts/DatabaseStatementTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/cts/DatabaseStatementTest.kt similarity index 100% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/cts/DatabaseStatementTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/cts/DatabaseStatementTest.kt diff --git a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/performance/DbPerformanceTest.kt b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/performance/DbPerformanceTest.kt similarity index 85% rename from sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/performance/DbPerformanceTest.kt rename to sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/performance/DbPerformanceTest.kt index 4c35d4ae..ea179643 100644 --- a/sqliter-driver/src/nativeCommonTest/kotlin/co/touchlab/sqliter/performance/DbPerformanceTest.kt +++ b/sqliter-driver/src/nativeTest/kotlin/co/touchlab/sqliter/performance/DbPerformanceTest.kt @@ -3,8 +3,9 @@ package co.touchlab.sqliter.performance import co.touchlab.sqliter.* import kotlin.test.Test import kotlin.test.assertTrue +import kotlin.time.TimeSource -class DbPerformanceTest:BaseDatabaseTest() { +class DbPerformanceTest : BaseDatabaseTest() { @Test fun bigInsertTest() { val manager = createDatabaseManager( @@ -27,8 +28,8 @@ class DbPerformanceTest:BaseDatabaseTest() { val connection = manager.surpriseMeConnection() - val start = currentTimeMillis() - connection.withStatement("insert into test(num, str)values(?,?)"){ + val start = TimeSource.Monotonic.markNow() + connection.withStatement("insert into test(num, str)values(?,?)") { insertList.forEach { bindLong(1, it.first) bindString(2, it.second) @@ -36,7 +37,7 @@ class DbPerformanceTest:BaseDatabaseTest() { } } - val time = currentTimeMillis() - start + val time = start.elapsedNow().inWholeMilliseconds println("Insert took time $time") //Failing on CI. Need another approach for performance // assertTrue("Insert took time ${time}") {time < 6000}