Skip to content

Commit 3d103f0

Browse files
authored
Merge branch 'main' into improved-mock-cloud-database
2 parents bfe0e8a + 90568d3 commit 3d103f0

5 files changed

Lines changed: 151 additions & 2 deletions

File tree

Examples/Reminders/Schema.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,30 @@ func appDatabase() throws -> any DatabaseWriter {
229229
.execute(db)
230230
}
231231

232+
migrator.registerMigration("Create foreign key indexes") { db in
233+
try #sql(
234+
"""
235+
CREATE INDEX IF NOT EXISTS "idx_reminders_remindersListID"
236+
ON "reminders"("remindersListID")
237+
"""
238+
)
239+
.execute(db)
240+
try #sql(
241+
"""
242+
CREATE INDEX IF NOT EXISTS "idx_remindersTags_reminderID"
243+
ON "remindersTags"("reminderID")
244+
"""
245+
)
246+
.execute(db)
247+
try #sql(
248+
"""
249+
CREATE INDEX IF NOT EXISTS "idx_remindersTags_tagID"
250+
ON "remindersTags"("tagID")
251+
"""
252+
)
253+
.execute(db)
254+
}
255+
232256
try migrator.migrate(database)
233257

234258
try database.write { db in
@@ -515,3 +539,4 @@ nonisolated private let logger = Logger(subsystem: "Reminders", category: "Datab
515539
}
516540
}
517541
#endif
542+

Examples/SyncUps/Schema.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,22 @@ extension DependencyValues {
123123
)
124124
.execute(db)
125125
}
126+
migrator.registerMigration("Create foreign key indexes") { db in
127+
try #sql(
128+
"""
129+
CREATE INDEX IF NOT EXISTS "idx_attendees_syncUpID"
130+
ON "attendees"("syncUpID")
131+
"""
132+
)
133+
.execute(db)
134+
try #sql(
135+
"""
136+
CREATE INDEX IF NOT EXISTS "idx_meetings_syncUpID"
137+
ON "meetings"("syncUpID")
138+
"""
139+
)
140+
.execute(db)
141+
}
126142
try migrator.migrate(database)
127143
defaultDatabase = database
128144
defaultSyncEngine = try SyncEngine(

Sources/SQLiteData/CloudKit/SyncEngine.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1227,7 +1227,7 @@
12271227
recordName: metadata.recordName,
12281228
lastKnownServerRecord: metadata.lastKnownServerRecord,
12291229
rootRecordName: tree.rootRecordName,
1230-
rootLastKnownServerRecord: tree.lastKnownServerRecord
1230+
rootLastKnownServerRecord: tree.rootLastKnownServerRecord
12311231
)
12321232
}
12331233
)

Sources/SQLiteData/Documentation.docc/Articles/CloudKitSharing.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ let share = try await database.read { db in
401401
}
402402
guard
403403
share?.currentUserParticipant?.permission == .readWrite
404-
|| share?.permission == .readWrite
404+
|| share?.publicPermission == .readWrite
405405
else {
406406
// User does not have permissions to write to record.
407407
return

Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,114 @@
13691369
}
13701370
}
13711371

1372+
/// Deleting a root shared record that is not owned by current user should only delete
1373+
/// the CKShare but not the actual records, including associated records.
1374+
@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
1375+
@Test func deleteRootSharedRecord_CurrentUserNotOwner_DoNotCascade() async throws {
1376+
let externalZone = CKRecordZone(
1377+
zoneID: CKRecordZone.ID(
1378+
zoneName: "external.zone",
1379+
ownerName: "external.owner"
1380+
)
1381+
)
1382+
try await syncEngine.modifyRecordZones(scope: .shared, saving: [externalZone]).notify()
1383+
1384+
let modelARecord = CKRecord(
1385+
recordType: ModelA.tableName,
1386+
recordID: ModelA.recordID(for: 1, zoneID: externalZone.zoneID)
1387+
)
1388+
modelARecord.setValue(42, forKey: "count", at: now)
1389+
1390+
let share = CKShare(
1391+
rootRecord: modelARecord,
1392+
shareID: CKRecord.ID(
1393+
recordName: "share-\(modelARecord.recordID.recordName)",
1394+
zoneID: modelARecord.recordID.zoneID
1395+
)
1396+
)
1397+
1398+
try await syncEngine
1399+
.acceptShare(
1400+
metadata: ShareMetadata(
1401+
containerIdentifier: container.containerIdentifier!,
1402+
hierarchicalRootRecordID: modelARecord.recordID,
1403+
rootRecord: modelARecord,
1404+
share: share
1405+
)
1406+
)
1407+
1408+
try await userDatabase.userWrite { db in
1409+
try db.seed {
1410+
ModelB(id: 1, isOn: true, modelAID: 1)
1411+
ModelC(id: 1, title: "Hello world!", modelBID: 1)
1412+
}
1413+
}
1414+
1415+
try await syncEngine.processPendingRecordZoneChanges(scope: .shared)
1416+
1417+
try await userDatabase.userWrite { db in
1418+
try ModelA.find(1).delete().execute(db)
1419+
}
1420+
1421+
try await syncEngine.processPendingRecordZoneChanges(scope: .shared)
1422+
1423+
assertQuery(Reminder.all, database: userDatabase.database) {
1424+
"""
1425+
(No results)
1426+
"""
1427+
}
1428+
assertQuery(RemindersList.all, database: userDatabase.database) {
1429+
"""
1430+
(No results)
1431+
"""
1432+
}
1433+
assertQuery(SyncMetadata.all, database: syncEngine.metadatabase) {
1434+
"""
1435+
(No results)
1436+
"""
1437+
}
1438+
assertInlineSnapshot(of: container, as: .customDump) {
1439+
"""
1440+
MockCloudContainer(
1441+
privateCloudDatabase: MockCloudDatabase(
1442+
databaseScope: .private,
1443+
storage: []
1444+
),
1445+
sharedCloudDatabase: MockCloudDatabase(
1446+
databaseScope: .shared,
1447+
storage: [
1448+
[0]: CKRecord(
1449+
recordID: CKRecord.ID(1:modelAs/external.zone/external.owner),
1450+
recordType: "modelAs",
1451+
parent: nil,
1452+
share: CKReference(recordID: CKRecord.ID(share-1:modelAs/external.zone/external.owner)),
1453+
count: 42
1454+
),
1455+
[1]: CKRecord(
1456+
recordID: CKRecord.ID(1:modelBs/external.zone/external.owner),
1457+
recordType: "modelBs",
1458+
parent: CKReference(recordID: CKRecord.ID(1:modelAs/external.zone/external.owner)),
1459+
share: nil,
1460+
id: 1,
1461+
isOn: 1,
1462+
modelAID: 1
1463+
),
1464+
[2]: CKRecord(
1465+
recordID: CKRecord.ID(1:modelCs/external.zone/external.owner),
1466+
recordType: "modelCs",
1467+
parent: CKReference(recordID: CKRecord.ID(1:modelBs/external.zone/external.owner)),
1468+
share: nil,
1469+
id: 1,
1470+
modelBID: 1,
1471+
title: "Hello world!"
1472+
)
1473+
]
1474+
)
1475+
)
1476+
"""
1477+
}
1478+
}
1479+
13721480
/// Syncing deletion of a root shared record that is not owned by current user should delete
13731481
/// entire zone.
13741482
@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)

0 commit comments

Comments
 (0)