Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 1.6.1 (unreleased)

* Update Kotlin SDK to 1.7.0.

## 1.6.0

* Update core extension to 0.4.6 ([changelog](https://github.com/powersync-ja/powersync-sqlite-core/releases/tag/v0.4.6))
Expand Down
9 changes: 9 additions & 0 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 16 additions & 5 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ let packageName = "PowerSync"

// Set this to the absolute path of your Kotlin SDK checkout if you want to use a local Kotlin
// build. Also see docs/LocalBuild.md for details
let localKotlinSdkOverride: String? = nil
let localKotlinSdkOverride: String? = "/Users/simon/src/powersync-kotlin"

// Set this to the absolute path of your powersync-sqlite-core checkout if you want to use a
// local build of the core extension.
let localCoreExtension: String? = nil

let encryption = true

// Our target and dependency setup is different when a local Kotlin SDK is used. Without the local
// SDK, we have no package dependency on Kotlin and download the XCFramework from Kotlin releases as
// a binary target.
Expand All @@ -22,18 +24,24 @@ var conditionalDependencies: [Package.Dependency] = []
var conditionalTargets: [Target] = []
var kotlinTargetDependency = Target.Dependency.target(name: "PowerSyncKotlin")

if encryption {
conditionalDependencies.append(.package(url: "https://github.com/sqlcipher/SQLCipher.swift.git", from: "4.10.0"))
} else {
conditionalDependencies.append(.package(url: "https://github.com/sbooth/CSQLite.git", from: "3.50.4"))
}

if let kotlinSdkPath = localKotlinSdkOverride {
// We can't depend on local XCFrameworks outside of this project's root, so there's a Package.swift
// in the PowerSyncKotlin project pointing towards a local build.
conditionalDependencies.append(.package(path: "\(kotlinSdkPath)/PowerSyncKotlin"))
conditionalDependencies.append(.package(path: "\(kotlinSdkPath)/internal/PowerSyncKotlin"))

kotlinTargetDependency = .product(name: "PowerSyncKotlin", package: "PowerSyncKotlin")
} else {
// Not using a local build, so download from releases
conditionalTargets.append(.binaryTarget(
name: "PowerSyncKotlin",
url: "https://github.com/powersync-ja/powersync-kotlin/releases/download/v1.6.0/PowersyncKotlinRelease.zip",
checksum: "4f70331c11e30625eecf4ebcebe7b562e2e0165774890d2a43480ebc3a9081cc"
url: "https://github.com/powersync-ja/powersync-kotlin/releases/download/v1.7.0/PowersyncKotlinRelease.zip",
checksum: "836ac106c26a184c10373c862745d9af195737ad01505bb965f197797aa88535"
))
}

Expand Down Expand Up @@ -81,7 +89,10 @@ let package = Package(
name: packageName,
dependencies: [
kotlinTargetDependency,
.product(name: "PowerSyncSQLiteCore", package: corePackageName)
.product(name: "PowerSyncSQLiteCore", package: corePackageName),
encryption ?
.product(name: "SQLCipher", package: "SQLCipher.swift") :
.product(name: "CSQLite", package: "CSQLite"),
]
),
.testTarget(
Expand Down
5 changes: 3 additions & 2 deletions Sources/PowerSync/Kotlin/KotlinPowerSyncDatabaseImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,10 @@ final class KotlinPowerSyncDatabaseImpl: PowerSyncDatabaseProtocol,
init(
schema: Schema,
dbFilename: String,
logger: DatabaseLogger
logger: DatabaseLogger,
initialStatements: [String] = [],
) {
let factory = PowerSyncKotlin.DatabaseDriverFactory()
let factory = sqlite3DatabaseFactory(initialStatements: initialStatements)
kotlinDatabase = PowerSyncDatabase(
factory: factory,
schema: KotlinAdapter.Schema.toKotlin(schema),
Expand Down
2 changes: 1 addition & 1 deletion Sources/PowerSync/Kotlin/sync/KotlinSyncStatus.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import PowerSyncKotlin
final class KotlinSyncStatus: KotlinSyncStatusDataProtocol, SyncStatus {
private let baseStatus: PowerSyncKotlin.SyncStatus

var base: any PowerSyncKotlin.SyncStatusData {
var base: PowerSyncKotlin.SyncStatusData {
baseStatus
}

Expand Down
67 changes: 67 additions & 0 deletions Tests/PowerSyncTests/EncryptionTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
@testable import PowerSync
import XCTest


final class EncryptionTests: XCTestCase {

func testLinksSqlcipher() async throws {
let database = KotlinPowerSyncDatabaseImpl(
schema: Schema(),
dbFilename: ":memory:",
logger: DatabaseLogger(DefaultLogger())
)

let version = try await database.get("pragma cipher_version", mapper: {cursor in
try cursor.getString(index: 0)
});

XCTAssertEqual(version, "4.11.0 community")
try await database.close()
}

func testEncryption() async throws {
let database = KotlinPowerSyncDatabaseImpl(
schema: Schema(tables: [
Table(
name: "users",
columns: [
.text("name")
]
),
]),
dbFilename: "encrypted.db",
logger: DatabaseLogger(DefaultLogger()),
initialStatements: [
"pragma key = 'foobar'"
],
)

try await database.execute("INSERT INTO users (id, name) VALUES (uuid(), 'test')")
try await database.close()

let another = KotlinPowerSyncDatabaseImpl(
schema: Schema(tables: [
Table(
name: "users",
columns: [
.text("name")
]
),
]),
dbFilename: "encrypted.db",
logger: DatabaseLogger(DefaultLogger()),
initialStatements: [
"pragma key = 'wrong password'"
],
)

var hadError = false
do {
try await database.execute("DELETE FROM users")
} catch let error {
hadError = true
}

XCTAssertTrue(hadError)
}
}
Loading