Skip to content
Merged
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
56 changes: 30 additions & 26 deletions Sources/SQLiteData/CloudKit/SyncEngine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1219,7 +1219,7 @@
if let share = record as? CKShare {
shares.append(.share(share))
} else {
upsertFromServerRecord(record)
await upsertFromServerRecord(record)
if let shareReference = record.share {
shares.append(.reference(shareReference))
}
Expand Down Expand Up @@ -1280,7 +1280,7 @@
switch error.code {
case .serverRecordChanged:
guard let serverRecord = error.serverRecord else { continue }
upsertFromServerRecord(serverRecord)
await upsertFromServerRecord(serverRecord)
newPendingRecordZoneChanges.append(.saveRecord(failedRecord.recordID))

case .zoneNotFound:
Expand Down Expand Up @@ -1364,7 +1364,7 @@
let serverRecord = try await container.sharedCloudDatabase.record(
for: failedRecord.recordID
)
upsertFromServerRecord(serverRecord, force: true)
await upsertFromServerRecord(serverRecord, force: true)
} catch let error as CKError where error.code == .unknownItem {
try await userDatabase.write { db in
try T
Expand Down Expand Up @@ -1448,13 +1448,13 @@
private func upsertFromServerRecord(
_ serverRecord: CKRecord,
force: Bool = false
) {
withErrorReporting(.sqliteDataCloudKitFailure) {
) async {
await withErrorReporting(.sqliteDataCloudKitFailure) {
guard let table = tablesByName[serverRecord.recordType]
else {
guard let recordPrimaryKey = serverRecord.recordID.recordPrimaryKey
else { return }
try userDatabase.write { db in
try await userDatabase.write { db in
try SyncMetadata.insert {
SyncMetadata(
recordPrimaryKey: recordPrimaryKey,
Expand All @@ -1476,40 +1476,44 @@
return
}

let metadata = try metadatabase.read { db in
let metadata = try await metadatabase.read { db in
try SyncMetadata
.where { $0.recordName.eq(serverRecord.recordID.recordName) }
.fetchOne(db)
}
serverRecord.userModificationDate =
metadata?.userModificationDate ?? serverRecord.userModificationDate

func open<T: PrimaryKeyedTable>(_: T.Type) throws {
var columnNames = T.TableColumns.writableColumns.map(\.name)
func open<T: PrimaryKeyedTable>(_: T.Type) async throws {
let columnNames: [String]
if !force, let metadata, let allFields = metadata._lastKnownServerRecordAllFields {
let row = try userDatabase.read { db in
try T.find(#sql("\(bind: metadata.recordPrimaryKey)")).fetchOne(db)
}
guard let row
else {
reportIssue(
columnNames = try await userDatabase.read { db in
var columnNames = T.TableColumns.writableColumns.map(\.name)
let row = try T.find(#sql("\(bind: metadata.recordPrimaryKey)")).fetchOne(db)
guard let row
else {
reportIssue(
"""
Local database record could not be found for '\(serverRecord.recordID.recordName)'.
"""
)
return
}
serverRecord.update(
with: allFields,
row: T(queryOutput: row),
columnNames: &columnNames,
parentForeignKey: foreignKeysByTableName[T.tableName]?.count == 1
)
return columnNames
}
serverRecord.update(
with: allFields,
row: T(queryOutput: row),
columnNames: &columnNames,
parentForeignKey: foreignKeysByTableName[T.tableName]?.count == 1
? foreignKeysByTableName[T.tableName]?.first
: nil
)
)
return columnNames
}
} else {
columnNames = T.TableColumns.writableColumns.map(\.name)
}

try userDatabase.write { db in
try await userDatabase.write { db in
do {
try #sql(upsert(T.self, record: serverRecord, columnNames: columnNames)).execute(db)
try UnsyncedRecordID.find(serverRecord.recordID).delete().execute(db)
Expand All @@ -1532,7 +1536,7 @@
}
}
}
try open(table)
try await open(table)
}
}

Expand Down