From 61a5617e62d47f2e77bd58ed092c81c8295a3852 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Tue, 22 Apr 2025 18:40:46 +0200 Subject: [PATCH 1/7] Fix extracting PowerSync library from JAR --- CHANGELOG.md | 1 + .../kotlin/com/powersync/ExtractLib.kt | 26 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94996f76..41d65ae7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 1.0.0-BETA31 * Added helpers for Attachment syncing. +* Fix loading native PowerSync extension for Java targets. ## 1.0.0-BETA30 diff --git a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt index 9666b5ac..4ebd4c88 100644 --- a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt +++ b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt @@ -1,6 +1,10 @@ package com.powersync import java.io.File +import java.nio.file.Files +import java.nio.file.Path +import kotlin.io.path.Path +import kotlin.io.path.absolutePathString private class R @@ -21,14 +25,20 @@ internal fun extractLib(fileName: String): String { else -> error("Unsupported architecture: $sysArch") } - val path = "/$prefix${fileName}_$arch.$extension" + val path = Files.createTempFile(Path(System.getProperty("java.io.tmpdir")), prefix, extension) + val file = path.toFile().apply { + setReadable(true) + setWritable(true) + setExecutable(true) - val resourceURI = - (R::class.java.getResource(path) ?: error("Resource $path not found")) + deleteOnExit() + } - // Wrapping the above in a File handle resolves the URI to a path usable by SQLite. - // This is particularly relevant on Windows. - // On Windows [resourceURI.path] starts with a `/`, e.g. `/c:/...`. SQLite does not load this path correctly. - // The wrapping here transforms the path to `c:/...` which does load correctly. - return File(resourceURI.path).path.toString() + val resourcePath = "/$prefix${fileName}_$arch.$extension" + + (R::class.java.getResourceAsStream(resourcePath) ?: error("Resource $path not found")).use { input -> + file.outputStream().use { output -> input.copyTo(output) } + } + + return path.absolutePathString() } From f2576b566345166ae92447ce332ccc24f8419cc3 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Wed, 23 Apr 2025 13:03:45 +0200 Subject: [PATCH 2/7] Reformat --- .../src/jvmMain/kotlin/com/powersync/ExtractLib.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt index 4ebd4c88..d10f003f 100644 --- a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt +++ b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt @@ -1,6 +1,5 @@ package com.powersync -import java.io.File import java.nio.file.Files import java.nio.file.Path import kotlin.io.path.Path @@ -26,13 +25,14 @@ internal fun extractLib(fileName: String): String { } val path = Files.createTempFile(Path(System.getProperty("java.io.tmpdir")), prefix, extension) - val file = path.toFile().apply { - setReadable(true) - setWritable(true) - setExecutable(true) + val file = + path.toFile().apply { + setReadable(true) + setWritable(true) + setExecutable(true) - deleteOnExit() - } + deleteOnExit() + } val resourcePath = "/$prefix${fileName}_$arch.$extension" From 6f906189649be0f2fd9421d74822b2a66a25b2cd Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Wed, 23 Apr 2025 13:18:00 +0200 Subject: [PATCH 3/7] Expand temporary file name --- core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt index d10f003f..e50c69e8 100644 --- a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt +++ b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt @@ -24,7 +24,7 @@ internal fun extractLib(fileName: String): String { else -> error("Unsupported architecture: $sysArch") } - val path = Files.createTempFile(Path(System.getProperty("java.io.tmpdir")), prefix, extension) + val path = Files.createTempFile(Path(System.getProperty("java.io.tmpdir")), "$prefix$fileName", extension) val file = path.toFile().apply { setReadable(true) From 1b4f2825423fb392e9a151cdfcff52bf240d6233 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Wed, 23 Apr 2025 13:24:19 +0200 Subject: [PATCH 4/7] Check path format --- .../kotlin/com/powersync/ExtractLib.kt | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt index e50c69e8..39e20df6 100644 --- a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt +++ b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt @@ -1,9 +1,12 @@ package com.powersync +import java.io.File import java.nio.file.Files import java.nio.file.Path +import java.util.UUID import kotlin.io.path.Path import kotlin.io.path.absolutePathString +import kotlin.uuid.Uuid private class R @@ -24,21 +27,22 @@ internal fun extractLib(fileName: String): String { else -> error("Unsupported architecture: $sysArch") } - val path = Files.createTempFile(Path(System.getProperty("java.io.tmpdir")), "$prefix$fileName", extension) - val file = - path.toFile().apply { - setReadable(true) - setWritable(true) - setExecutable(true) + val suffix = UUID.randomUUID().toString() + val file = File(System.getProperty("java.io.tmpdir"), "$prefix$fileName-$suffix.$extension").apply { + setReadable(true) + setWritable(true) + setExecutable(true) + + deleteOnExit() + } - deleteOnExit() - } val resourcePath = "/$prefix${fileName}_$arch.$extension" - (R::class.java.getResourceAsStream(resourcePath) ?: error("Resource $path not found")).use { input -> + (R::class.java.getResourceAsStream(resourcePath) ?: error("Resource $resourcePath not found")).use { input -> file.outputStream().use { output -> input.copyTo(output) } } - return path.absolutePathString() + println("PowerSync loadable should be at $file") + return file.absolutePath } From c9ac3eebe27852877761a25297dbeea0be8b107f Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Wed, 23 Apr 2025 14:22:44 +0200 Subject: [PATCH 5/7] Fix lints --- core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt index 39e20df6..58b73310 100644 --- a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt +++ b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt @@ -1,12 +1,7 @@ package com.powersync import java.io.File -import java.nio.file.Files -import java.nio.file.Path import java.util.UUID -import kotlin.io.path.Path -import kotlin.io.path.absolutePathString -import kotlin.uuid.Uuid private class R From b0c57ab6c589bc4b9e47bc722165ebaaa822a54f Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Wed, 23 Apr 2025 14:40:55 +0200 Subject: [PATCH 6/7] Reformat --- .../src/jvmMain/kotlin/com/powersync/ExtractLib.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt index 58b73310..48c661be 100644 --- a/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt +++ b/core/src/jvmMain/kotlin/com/powersync/ExtractLib.kt @@ -23,14 +23,14 @@ internal fun extractLib(fileName: String): String { } val suffix = UUID.randomUUID().toString() - val file = File(System.getProperty("java.io.tmpdir"), "$prefix$fileName-$suffix.$extension").apply { - setReadable(true) - setWritable(true) - setExecutable(true) - - deleteOnExit() - } + val file = + File(System.getProperty("java.io.tmpdir"), "$prefix$fileName-$suffix.$extension").apply { + setReadable(true) + setWritable(true) + setExecutable(true) + deleteOnExit() + } val resourcePath = "/$prefix${fileName}_$arch.$extension" From 086881b748941662c246171c524e49edb13116d4 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Thu, 24 Apr 2025 16:00:53 +0200 Subject: [PATCH 7/7] Bump version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index f1a61d99..9056b618 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,7 @@ development=true RELEASE_SIGNING_ENABLED=true # Library config GROUP=com.powersync -LIBRARY_VERSION=1.0.0-BETA31 +LIBRARY_VERSION=1.0.0-BETA32 GITHUB_REPO=https://github.com/powersync-ja/powersync-kotlin.git # POM POM_URL=https://github.com/powersync-ja/powersync-kotlin/