Skip to content

Commit 6cc1cfb

Browse files
authored
Fix bug that reset timestamp of record when sharing. (#278)
* Fix bug that reset timestamp of record when sharing. * wip * Clean up' * clean up * wip * test
1 parent 98546f9 commit 6cc1cfb

5 files changed

Lines changed: 41 additions & 39 deletions

File tree

Sources/SQLiteData/CloudKit/CloudKitSharing.swift

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,14 @@
118118
)
119119
}
120120
let recordName = record.recordName
121-
let metadata =
121+
let lastKnownServerRecord =
122122
try await metadatabase.read { db in
123123
try SyncMetadata
124124
.where { $0.recordName.eq(recordName) }
125-
.select { ($0.recordType, $0.recordName, $0.lastKnownServerRecord) }
125+
.select(\._lastKnownServerRecordAllFields)
126126
.fetchOne(db)
127127
} ?? nil
128-
guard let (recordType, recordName, lastKnownServerRecord) = metadata
128+
guard let lastKnownServerRecord
129129
else {
130130
throw SharingError(
131131
recordTableName: T.tableName,
@@ -137,18 +137,11 @@
137137
)
138138
}
139139

140-
let rootRecord =
141-
lastKnownServerRecord
142-
?? CKRecord(
143-
recordType: recordType,
144-
recordID: CKRecord.ID(recordName: recordName, zoneID: defaultZone.zoneID)
145-
)
146-
147140
var existingShare: CKShare? {
148141
get async throws {
149142
let share = try await metadatabase.read { db in
150143
try SyncMetadata
151-
.find(rootRecord.recordID)
144+
.find(lastKnownServerRecord.recordID)
152145
.select(\.share)
153146
.fetchOne(db) ?? nil
154147
}
@@ -157,7 +150,7 @@
157150
return nil
158151
}
159152
do {
160-
return try await container.database(for: rootRecord.recordID)
153+
return try await container.database(for: lastKnownServerRecord.recordID)
161154
.record(for: shareRecordID) as? CKShare
162155
} catch let error as CKError where error.code == .unknownItem {
163156
return nil
@@ -168,16 +161,16 @@
168161
let sharedRecord =
169162
try await existingShare
170163
?? CKShare(
171-
rootRecord: rootRecord,
164+
rootRecord: lastKnownServerRecord,
172165
shareID: CKRecord.ID(
173166
recordName: "share-\(recordName)",
174-
zoneID: rootRecord.recordID.zoneID
167+
zoneID: lastKnownServerRecord.recordID.zoneID
175168
)
176169
)
177170

178171
configure(sharedRecord)
179172
let (saveResults, _) = try await container.privateCloudDatabase.modifyRecords(
180-
saving: [sharedRecord, rootRecord],
173+
saving: [sharedRecord, lastKnownServerRecord],
181174
deleting: []
182175
)
183176

@@ -188,9 +181,9 @@
188181
.first
189182
let savedRootRecord = try saveResults.values.compactMap { result in
190183
let record = try result.get()
191-
return record.recordID == rootRecord.recordID ? record : nil
184+
return record.recordID == lastKnownServerRecord.recordID ? record : nil
192185
}
193-
.first
186+
.first
194187
guard let savedShare, let savedRootRecord
195188
else {
196189
throw SharingError(

Sources/SQLiteData/CloudKit/SyncEngine.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -321,12 +321,6 @@
321321
: URL(filePath: metadatabase.path).lastPathComponent
322322
let attachedMetadatabaseName =
323323
URL(string: attachedMetadatabasePath)?.lastPathComponent ?? ""
324-
325-
try URL.metadatabase(
326-
databasePath: attachedMetadatabasePath,
327-
containerIdentifier: self.container.containerIdentifier
328-
)
329-
.lastPathComponent
330324
if metadatabaseName != attachedMetadatabaseName {
331325
throw SchemaError(
332326
reason: .metadatabaseMismatch(

Tests/SQLiteDataTests/CloudKitTests/MetadataTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@
551551
try await syncEngine.processPendingRecordZoneChanges(scope: .private)
552552

553553
assertQuery(
554-
RemindersList.join(SyncMetadata.all) { $0.hasMetadata(in: $1) },
554+
RemindersList.join(SyncMetadata.all) { $0.syncMetadataID.eq($1.id) },
555555
database: userDatabase.database
556556
) {
557557
"""

Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -612,16 +612,19 @@
612612

613613
let _ = try await syncEngine.share(record: remindersList, configure: { _ in })
614614

615-
assertQuery(SyncMetadata.select(\.share), database: syncEngine.metadatabase) {
615+
assertQuery(
616+
SyncMetadata.select { ($0.share, $0.userModificationTime) },
617+
database: syncEngine.metadatabase
618+
) {
616619
"""
617-
┌────────────────────────────────────────────────────────────────────────┐
618-
│ CKRecord( │
619-
│ recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__), │
620-
│ recordType: "cloudkit.share", │
621-
│ parent: nil, │
622-
│ share: nil │
623-
│ ) │
624-
└────────────────────────────────────────────────────────────────────────┘
620+
┌────────────────────────────────────────────────────────────────────────┬───
621+
│ CKRecord( │ 0 │
622+
│ recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__), │
623+
│ recordType: "cloudkit.share", │
624+
│ parent: nil, │
625+
│ share: nil │
626+
│ ) │
627+
└────────────────────────────────────────────────────────────────────────┴───
625628
"""
626629
}
627630

@@ -641,7 +644,9 @@
641644
recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__),
642645
recordType: "remindersLists",
643646
parent: nil,
644-
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__))
647+
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)),
648+
id: 1,
649+
title: "Personal"
645650
)
646651
]
647652
),
@@ -700,7 +705,9 @@
700705
recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__),
701706
recordType: "remindersLists",
702707
parent: nil,
703-
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__))
708+
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)),
709+
id: 1,
710+
title: "Personal"
704711
)
705712
]
706713
),
@@ -763,7 +770,9 @@
763770
recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__),
764771
recordType: "remindersLists",
765772
parent: nil,
766-
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__))
773+
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)),
774+
id: 1,
775+
title: "Personal"
767776
)
768777
]
769778
),
@@ -793,7 +802,9 @@
793802
recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__),
794803
recordType: "remindersLists",
795804
parent: nil,
796-
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__))
805+
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)),
806+
id: 1,
807+
title: "Personal"
797808
)
798809
]
799810
),
@@ -2787,7 +2798,9 @@
27872798
recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__),
27882799
recordType: "remindersLists",
27892800
parent: nil,
2790-
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__))
2801+
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)),
2802+
id: 1,
2803+
title: "Personal"
27912804
)
27922805
]
27932806
),

Tests/SQLiteDataTests/CloudKitTests/SyncEngineLifecycleTests.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,9 @@
452452
recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__),
453453
recordType: "remindersLists",
454454
parent: nil,
455-
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__))
455+
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)),
456+
id: 1,
457+
title: "Personal"
456458
)
457459
]
458460
),

0 commit comments

Comments
 (0)