Skip to content
Open
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
36 changes: 19 additions & 17 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,20 +53,22 @@ jobs:
'
if: failure()

# NB: GRDB 7.6.1 does not currently build on Linux.
# linux:
# name: Linux
# strategy:
# matrix:
# swift:
# - '6.1'
# runs-on: ubuntu-latest
# container: swift:${{ matrix.swift }}
# steps:
# - uses: actions/checkout@v4
# - name: Install Build Dependencies
# run: |
# apt-get update
# apt-get install -y libsqlite3-dev
# - name: Build
# run: swift build
linux:
name: Linux
strategy:
matrix:
swift:
- '6.1'
runs-on: ubuntu-latest
container: swift:${{ matrix.swift }}
steps:
- uses: actions/checkout@v5
- name: Install Build Dependencies
run: |
apt-get update
apt-get install -y libsqlite3-dev
- name: Build
run: swift build
- name: Test
run: |
swift test
29 changes: 28 additions & 1 deletion Package.resolved

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

6 changes: 6 additions & 0 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ let package = Package(
.package(url: "https://github.com/pointfreeco/swift-perception", from: "2.0.0"),
.package(url: "https://github.com/pointfreeco/swift-sharing", from: "2.3.0"),
.package(url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.18.4"),
.package(url: "https://github.com/apple/swift-crypto.git", "1.0.0"..<"5.0.0"),
.package(
url: "https://github.com/pointfreeco/swift-structured-queries",
from: "0.31.0",
Expand All @@ -57,6 +58,11 @@ let package = Package(
.product(name: "Perception", package: "swift-perception"),
.product(name: "Sharing", package: "swift-sharing"),
.product(name: "StructuredQueriesSQLite", package: "swift-structured-queries"),
.product(
name: "Crypto",
package: "swift-crypto",
condition: .when(platforms: [.linux])
),
.product(
name: "Tagged",
package: "swift-tagged",
Expand Down
24 changes: 11 additions & 13 deletions Sources/SQLiteData/CloudKit/Internal/ForeignKey.swift
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
#if canImport(CloudKit)
import Foundation
import StructuredQueriesCore
import Foundation
import StructuredQueriesCore

@Table
package struct ForeignKey {
let table: String
let from: String
let to: String
let onUpdate: ForeignKeyAction
let onDelete: ForeignKeyAction
let isNotNull: Bool
}
#endif
@Table
package struct ForeignKey {
let table: String
let from: String
let to: String
let onUpdate: ForeignKeyAction
let onDelete: ForeignKeyAction
let isNotNull: Bool
}
130 changes: 64 additions & 66 deletions Sources/SQLiteData/CloudKit/Internal/Pragmas.swift
Original file line number Diff line number Diff line change
@@ -1,78 +1,76 @@
#if canImport(CloudKit)
@Table
struct PragmaDatabaseList {
static var tableAlias: String? { "databases" }
static var tableFragment: QueryFragment { "pragma_database_list()" }
@Table
struct PragmaDatabaseList {
static var tableAlias: String? { "databases" }
static var tableFragment: QueryFragment { "pragma_database_list()" }

@Column("seq") let sequence: Int
let name: String
let file: String
}

@Table
struct PragmaForeignKeyCheck {
static var tableAlias: String? { "foreignKeyChecks" }
static var tableFragment: QueryFragment { "pragma_foreign_key_check()" }
@Column("seq") let sequence: Int
let name: String
let file: String
}

let table: String
let rowid: Int
let parent: String
@Column("fkid")
let index: Int
}
@Table
struct PragmaForeignKeyCheck {
static var tableAlias: String? { "foreignKeyChecks" }
static var tableFragment: QueryFragment { "pragma_foreign_key_check()" }

@Table
package struct PragmaForeignKeyList<Base: Table> {
package static var tableAlias: String? { "\(Base.tableName)ForeignKeys" }
package static var tableFragment: QueryFragment {
"pragma_foreign_key_list(\(quote: Base.tableName, delimiter: .text))"
}
let table: String
let rowid: Int
let parent: String
@Column("fkid")
let index: Int
}

package let id: Int
@Column("seq") package let sequence: Int
package let table: String
package let from: String
package let to: String
@Column("on_update") package let onUpdate: ForeignKeyAction
@Column("on_delete") package let onDelete: ForeignKeyAction
package let match: String
@Table
package struct PragmaForeignKeyList<Base: Table> {
package static var tableAlias: String? { "\(Base.tableName)ForeignKeys" }
package static var tableFragment: QueryFragment {
"pragma_foreign_key_list(\(quote: Base.tableName, delimiter: .text))"
}

package enum ForeignKeyAction: String, QueryBindable {
case cascade = "CASCADE"
case restrict = "RESTRICT"
case setDefault = "SET DEFAULT"
case setNull = "SET NULL"
case noAction = "NO ACTION"
}
package let id: Int
@Column("seq") package let sequence: Int
package let table: String
package let from: String
package let to: String
@Column("on_update") package let onUpdate: ForeignKeyAction
@Column("on_delete") package let onDelete: ForeignKeyAction
package let match: String
}

@Table
struct PragmaIndexList<Base: Table> {
static var tableAlias: String? { "\(Base.tableName)Indices" }
static var tableFragment: QueryFragment {
"pragma_index_list(\(quote: Base.tableName, delimiter: .text))"
}
package enum ForeignKeyAction: String, QueryBindable {
case cascade = "CASCADE"
case restrict = "RESTRICT"
case setDefault = "SET DEFAULT"
case setNull = "SET NULL"
case noAction = "NO ACTION"
}

@Column("seq") let sequence: Int
let name: String
@Column("unique") let isUnique: Bool
let origin: String
@Column("partial") let isPartial: Bool
@Table
struct PragmaIndexList<Base: Table> {
static var tableAlias: String? { "\(Base.tableName)Indices" }
static var tableFragment: QueryFragment {
"pragma_index_list(\(quote: Base.tableName, delimiter: .text))"
}

@Table
package struct PragmaTableInfo<Base: Table> {
package static var tableAlias: String? { "\(Base.tableName)TableInfo" }
package static var schemaName: String? { Base.schemaName }
package static var tableFragment: QueryFragment {
"pragma_table_info(\(quote: Base.tableName, delimiter: .text))"
}
@Column("seq") let sequence: Int
let name: String
@Column("unique") let isUnique: Bool
let origin: String
@Column("partial") let isPartial: Bool
}

@Column("cid") package let columnID: Int
package let name: String
package let type: String
@Column("notnull") package let isNotNull: Bool
@Column("dflt_value") package let defaultValue: String?
@Column("pk") package let isPrimaryKey: Bool
@Table
package struct PragmaTableInfo<Base: Table> {
package static var tableAlias: String? { "\(Base.tableName)TableInfo" }
package static var schemaName: String? { Base.schemaName }
package static var tableFragment: QueryFragment {
"pragma_table_info(\(quote: Base.tableName, delimiter: .text))"
}
#endif

@Column("cid") package let columnID: Int
package let name: String
package let type: String
@Column("notnull") package let isNotNull: Bool
@Column("dflt_value") package let defaultValue: String?
@Column("pk") package let isPrimaryKey: Bool
}
22 changes: 10 additions & 12 deletions Sources/SQLiteData/CloudKit/Internal/SQLiteSchema.swift
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
#if canImport(CloudKit)
@Table("sqlite_schema")
package struct SQLiteSchema {
package let type: ObjectType
package let name: String
@Column("tbl_name")
package let tableName: String
package let sql: String?
@Table("sqlite_schema")
package struct SQLiteSchema {
package let type: ObjectType
package let name: String
@Column("tbl_name")
package let tableName: String
package let sql: String?

package enum ObjectType: String, QueryBindable {
case table, index, view, trigger
}
package enum ObjectType: String, QueryBindable {
case table, index, view, trigger
}
#endif
}
82 changes: 40 additions & 42 deletions Sources/SQLiteData/CloudKit/Internal/UserDatabase.swift
Original file line number Diff line number Diff line change
@@ -1,56 +1,54 @@
#if canImport(CloudKit)
import Dependencies
import Dependencies

package struct UserDatabase {
package let database: any DatabaseWriter
package init(database: any DatabaseWriter) {
self.database = database
}

var path: String {
database.path
}
package struct UserDatabase {
package let database: any DatabaseWriter
package init(database: any DatabaseWriter) {
self.database = database
}

var configuration: Configuration {
database.configuration
}
var path: String {
database.path
}

package func write<T: Sendable>(
_ updates: @Sendable (Database) throws -> T
) async throws -> T {
try await database.write { db in
try $_isSynchronizingChanges.withValue(true) {
try updates(db)
}
}
}
var configuration: Configuration {
database.configuration
}

package func read<T: Sendable>(
_ updates: @Sendable (Database) throws -> T
) async throws -> T {
try await database.read { db in
package func write<T: Sendable>(
_ updates: @Sendable (Database) throws -> T
) async throws -> T {
try await database.write { db in
try $_isSynchronizingChanges.withValue(true) {
try updates(db)
}
}
}

@_disfavoredOverload
package func write<T>(
_ updates: (Database) throws -> T
) throws -> T {
try database.write { db in
try $_isSynchronizingChanges.withValue(true) {
try updates(db)
}
}
package func read<T: Sendable>(
_ updates: @Sendable (Database) throws -> T
) async throws -> T {
try await database.read { db in
try updates(db)
}
}

@_disfavoredOverload
package func read<T>(
_ updates: (Database) throws -> T
) throws -> T {
try database.read { db in
@_disfavoredOverload
package func write<T>(
_ updates: (Database) throws -> T
) throws -> T {
try database.write { db in
try $_isSynchronizingChanges.withValue(true) {
try updates(db)
}
}
}
#endif

@_disfavoredOverload
package func read<T>(
_ updates: (Database) throws -> T
) throws -> T {
try database.read { db in
try updates(db)
}
}
}
Loading