Skip to content

Commit b373f0c

Browse files
Fix metadata observation. (#369)
* Fix metadata observation. * Workaround for generated column observation behavior. * optimization * clean up * clean up * fix * fix * update hasLastKnownServerRecord" * Update Sources/SQLiteData/CloudKit/SyncMetadata.swift Co-authored-by: Stephen Celis <[email protected]> * format * consistent order --------- Co-authored-by: Stephen Celis <[email protected]>
1 parent e64d353 commit b373f0c

File tree

13 files changed

+226
-135
lines changed

13 files changed

+226
-135
lines changed

Examples/RemindersTests/Internal.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import Testing
1414
try $0.bootstrapDatabase()
1515
try await $0.defaultSyncEngine.sendChanges()
1616
},
17-
.snapshots(record: .failed)
17+
.snapshots(record: .missing)
1818
)
1919
struct BaseTestSuite {}
2020

Examples/SyncUps/App.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ struct AppView: View {
6666
switch path {
6767
case .detail(let model):
6868
SyncUpDetailView(model: model)
69-
case .meeting(let meeting, attendees: let attendees):
69+
case .meeting(let meeting, let attendees):
7070
MeetingView(meeting: meeting, attendees: attendees)
7171
case .record(let model):
7272
RecordMeetingView(model: model)

Sources/SQLiteData/CloudKit/CloudKitSharing.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@
198198
"""
199199
)
200200
}
201-
try await metadatabase.write { db in
201+
try await userDatabase.write { db in
202202
try SyncMetadata
203203
.where { $0.recordName.eq(recordName) }
204204
.update {

Sources/SQLiteData/CloudKit/SyncEngine.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1502,7 +1502,8 @@
15021502
}
15031503
var unsyncedRecords: [CKRecord] = []
15041504
for start in stride(from: 0, to: orderedUnsyncedRecordIDs.count, by: batchSize) {
1505-
let recordIDsBatch = orderedUnsyncedRecordIDs
1505+
let recordIDsBatch =
1506+
orderedUnsyncedRecordIDs
15061507
.dropFirst(start)
15071508
.prefix(batchSize)
15081509
let results = try await syncEngine.database.records(for: Array(recordIDsBatch))
@@ -1586,7 +1587,7 @@
15861587
return false
15871588
case (_, nil):
15881589
return true
1589-
case let (.some(lhs), .some(rhs)):
1590+
case (.some(let lhs), .some(let rhs)):
15901591
let lhsIndex = tablesByOrder[lhs] ?? (rootFirst ? .max : .min)
15911592
let rhsIndex = tablesByOrder[rhs] ?? (rootFirst ? .max : .min)
15921593
guard lhsIndex != rhsIndex
@@ -1937,7 +1938,7 @@
19371938

19381939
private func refreshLastKnownServerRecord(_ record: CKRecord) async {
19391940
await withErrorReporting(.sqliteDataCloudKitFailure) {
1940-
try await metadatabase.write { db in
1941+
try await userDatabase.write { db in
19411942
let metadata = try SyncMetadata.find(record.recordID).fetchOne(db)
19421943
func updateLastKnownServerRecord() throws {
19431944
try SyncMetadata
@@ -2328,7 +2329,8 @@
23282329
tablesByName: [String: any SynchronizableTable]
23292330
) throws -> [String: Int] {
23302331
let tableDependencies = try userDatabase.read { db in
2331-
var dependencies: OrderedDictionary<HashableSynchronizedTable, [any SynchronizableTable]> = [:]
2332+
var dependencies: OrderedDictionary<HashableSynchronizedTable, [any SynchronizableTable]> =
2333+
[:]
23322334
for table in tables {
23332335
func open<T>(_: some SynchronizableTable<T>) throws -> [String] {
23342336
try PragmaForeignKeyList<T>

Sources/SQLiteData/CloudKit/SyncMetadata.swift

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,27 @@
9797
/// next batch of pending changes is processed.
9898
public let _isDeleted: Bool
9999

100-
@Column(generated: .virtual)
101-
public let hasLastKnownServerRecord: Bool
100+
@Column("hasLastKnownServerRecord", generated: .virtual)
101+
public let _hasLastKnownServerRecord: Bool
102+
103+
@Column("isShared", generated: .virtual)
104+
fileprivate let _isShared: Bool
105+
106+
/// The time the user last modified the record.
107+
public let userModificationTime: Int64
108+
109+
public var hasLastKnownServerRecord: Bool {
110+
lastKnownServerRecord != nil
111+
}
102112

103113
/// Determines if the record associated with this metadata is currently shared in CloudKit.
104114
///
105115
/// This can only return `true` for root records. For example, the metadata associated with a
106116
/// `RemindersList` can have `isShared == true`, but a `Reminder` associated with the list
107117
/// will have `isShared == false`.
108-
@Column(generated: .virtual)
109-
public let isShared: Bool
110-
111-
/// The time the user last modified the record.
112-
public let userModificationTime: Int64
118+
public var isShared: Bool {
119+
_isShared
120+
}
113121
}
114122

115123
@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
@@ -129,6 +137,24 @@
129137
public var parentRecordType: TableColumn<SyncMetadata, String?> {
130138
parentRecordID.parentRecordType
131139
}
140+
141+
// NB: Workaround for https://github.com/groue/GRDB.swift/discussions/1844
142+
public var hasLastKnownServerRecord: some QueryExpression<Bool> {
143+
#sql(
144+
"""
145+
((\(self._hasLastKnownServerRecord) = 1) AND (\(self.lastKnownServerRecord) OR 1))
146+
"""
147+
)
148+
}
149+
150+
// NB: Workaround for https://github.com/groue/GRDB.swift/discussions/1844
151+
public var isShared: some QueryExpression<Bool> {
152+
#sql(
153+
"""
154+
((\(self._isShared) = 1) AND (\(self.share) OR 1))
155+
"""
156+
)
157+
}
132158
}
133159

134160
@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
@@ -162,8 +188,8 @@
162188
self.lastKnownServerRecord = lastKnownServerRecord
163189
self._lastKnownServerRecordAllFields = _lastKnownServerRecordAllFields
164190
self.share = share
165-
self.hasLastKnownServerRecord = lastKnownServerRecord != nil
166-
self.isShared = share != nil
191+
self._hasLastKnownServerRecord = lastKnownServerRecord != nil
192+
self._isShared = share != nil
167193
self.userModificationTime = userModificationTime
168194
self._isDeleted = false
169195
}

Tests/SQLiteDataTests/AssertQueryTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Testing
88
@MainActor
99
@Suite(
1010
.dependency(\.defaultDatabase, try .database()),
11-
.snapshots(record: .failed),
11+
.snapshots(record: .missing),
1212
)
1313
struct AssertQueryTests {
1414
@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)

Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,8 @@
171171
│ ), │
172172
│ share: nil, │
173173
│ _isDeleted: false, │
174-
hasLastKnownServerRecord: true,
175-
isShared: false,
174+
_hasLastKnownServerRecord: true, │
175+
_isShared: false, │
176176
│ userModificationTime: 0 │
177177
│ ) │
178178
├────────────────────────────────────────────────────────────────────┤
@@ -193,8 +193,8 @@
193193
│ _lastKnownServerRecordAllFields: nil, │
194194
│ share: nil, │
195195
│ _isDeleted: false, │
196-
hasLastKnownServerRecord: false,
197-
isShared: false,
196+
_hasLastKnownServerRecord: false, │
197+
_isShared: false, │
198198
│ userModificationTime: 0 │
199199
│ ) │
200200
└────────────────────────────────────────────────────────────────────┘
@@ -257,8 +257,8 @@
257257
│ ), │
258258
│ share: nil, │
259259
│ _isDeleted: false, │
260-
hasLastKnownServerRecord: true,
261-
isShared: false,
260+
_hasLastKnownServerRecord: true, │
261+
_isShared: false, │
262262
│ userModificationTime: 0 │
263263
│ ) │
264264
├─────────────────────────────────────────────────────────────────────────────────────────┤
@@ -293,8 +293,8 @@
293293
│ ), │
294294
│ share: nil, │
295295
│ _isDeleted: false, │
296-
hasLastKnownServerRecord: true,
297-
isShared: false,
296+
_hasLastKnownServerRecord: true, │
297+
_isShared: false, │
298298
│ userModificationTime: 0 │
299299
│ ) │
300300
└─────────────────────────────────────────────────────────────────────────────────────────┘
@@ -421,8 +421,8 @@
421421
│ share: nil │
422422
│ ), │
423423
│ _isDeleted: false, │
424-
hasLastKnownServerRecord: true,
425-
isShared: true,
424+
_hasLastKnownServerRecord: true, │
425+
_isShared: true, │
426426
│ userModificationTime: 0 │
427427
│ ) │
428428
├─────────────────────────────────────────────────────────────────────────────────────────────────────┤
@@ -443,8 +443,8 @@
443443
│ _lastKnownServerRecordAllFields: nil, │
444444
│ share: nil, │
445445
│ _isDeleted: false, │
446-
hasLastKnownServerRecord: false,
447-
isShared: false,
446+
_hasLastKnownServerRecord: false, │
447+
_isShared: false, │
448448
│ userModificationTime: 0 │
449449
│ ) │
450450
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘
@@ -518,8 +518,8 @@
518518
│ share: nil │
519519
│ ), │
520520
│ _isDeleted: false, │
521-
hasLastKnownServerRecord: true,
522-
isShared: true,
521+
_hasLastKnownServerRecord: true, │
522+
_isShared: true, │
523523
│ userModificationTime: 0 │
524524
│ ) │
525525
├─────────────────────────────────────────────────────────────────────────────────────────────────────┤
@@ -554,8 +554,8 @@
554554
│ ), │
555555
│ share: nil, │
556556
│ _isDeleted: false, │
557-
hasLastKnownServerRecord: true,
558-
isShared: false,
557+
_hasLastKnownServerRecord: true, │
558+
_isShared: false, │
559559
│ userModificationTime: 0 │
560560
│ ) │
561561
└─────────────────────────────────────────────────────────────────────────────────────────────────────┘

Tests/SQLiteDataTests/CloudKitTests/AttachedMetadatabaseTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@
5656
│ │ ), │
5757
│ │ share: nil, │
5858
│ │ _isDeleted: false, │
59-
│ │ hasLastKnownServerRecord: true,
60-
│ │ isShared: false,
59+
│ │ _hasLastKnownServerRecord: true, │
60+
│ │ _isShared: false, │
6161
│ │ userModificationTime: 0 │
6262
│ │ ) │
6363
└─────────────────────┴────────────────────────────────────────────────────────────────────┘

Tests/SQLiteDataTests/CloudKitTests/FetchRecordZoneChangesTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -546,8 +546,8 @@
546546
│ ), │
547547
│ share: nil, │
548548
│ _isDeleted: false, │
549-
hasLastKnownServerRecord: true,
550-
isShared: false,
549+
_hasLastKnownServerRecord: true, │
550+
_isShared: false, │
551551
│ userModificationTime: 0 │
552552
│ ) │
553553
└────────────────────────────────────────────────────────────┘
@@ -629,8 +629,8 @@
629629
│ ), │
630630
│ share: nil, │
631631
│ _isDeleted: false, │
632-
hasLastKnownServerRecord: true,
633-
isShared: false,
632+
_hasLastKnownServerRecord: true, │
633+
_isShared: false, │
634634
│ userModificationTime: 0 │
635635
│ ) │
636636
└────────────────────────────────────────────────────────────┘
@@ -699,8 +699,8 @@
699699
│ ), │
700700
│ share: nil, │
701701
│ _isDeleted: false, │
702-
hasLastKnownServerRecord: true,
703-
isShared: false,
702+
_hasLastKnownServerRecord: true, │
703+
_isShared: false, │
704704
│ userModificationTime: 0 │
705705
│ ) │
706706
└────────────────────────────────────────────────────────────────┘

0 commit comments

Comments
 (0)