Skip to content

Commit fe981a7

Browse files
authored
Fix logic that determines sharing private tables. (#306)
1 parent 5891349 commit fe981a7

10 files changed

Lines changed: 110 additions & 59 deletions

File tree

Examples/Examples.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 19 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/SQLiteData/CloudKit/SyncEngine.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,8 +1127,7 @@
11271127
recordID: recordID
11281128
)
11291129
if let parentRecordName = metadata.parentRecordName,
1130-
let parentRecordType = metadata.parentRecordType,
1131-
!privateTables.contains(where: { $0.base.tableName == parentRecordType })
1130+
!privateTables.contains(where: { $0.base.tableName == metadata.recordType })
11321131
{
11331132
record.parent = CKRecord.Reference(
11341133
recordID: CKRecord.ID(

Tests/SQLiteDataTests/CloudKitTests/AccountLifecycleTests.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
try db.seed {
1818
RemindersList(id: 1, title: "Personal")
1919
Reminder(id: 1, title: "Get milk", remindersListID: 1)
20-
RemindersListPrivate(id: 1, remindersListID: 1)
20+
RemindersListPrivate(remindersListID: 1)
2121
UnsyncedModel(id: 1)
2222
}
2323
}
@@ -43,7 +43,7 @@
4343
try db.seed {
4444
RemindersList(id: 1, title: "Personal")
4545
Reminder(id: 1, title: "Get milk", remindersListID: 1)
46-
RemindersListPrivate(id: 1, remindersListID: 1)
46+
RemindersListPrivate(remindersListID: 1)
4747
UnsyncedModel(id: 1)
4848
}
4949
}
@@ -95,9 +95,8 @@
9595
[1]: CKRecord(
9696
recordID: CKRecord.ID(1:remindersListPrivates/zone/__defaultOwner__),
9797
recordType: "remindersListPrivates",
98-
parent: CKReference(recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__)),
98+
parent: nil,
9999
share: nil,
100-
id: 1,
101100
position: 0,
102101
remindersListID: 1
103102
),
@@ -611,7 +610,7 @@
611610
try db.seed {
612611
RemindersList(id: 1, title: "Personal")
613612
Reminder(id: 1, title: "Get milk", remindersListID: 1)
614-
RemindersListPrivate(id: 1, remindersListID: 1)
613+
RemindersListPrivate(remindersListID: 1)
615614
UnsyncedModel(id: 1)
616615
}
617616
}

Tests/SQLiteDataTests/CloudKitTests/CloudKitTests.swift

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,29 +75,22 @@
7575
tableName: "remindersListPrivates",
7676
schema: """
7777
CREATE TABLE "remindersListPrivates" (
78-
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
79-
"position" INTEGER NOT NULL ON CONFLICT REPLACE DEFAULT 0,
80-
"remindersListID" INTEGER NOT NULL REFERENCES "remindersLists"("id") ON DELETE CASCADE
78+
"remindersListID" INTEGER PRIMARY KEY NOT NULL REFERENCES "remindersLists"("id")
79+
ON DELETE CASCADE,
80+
"position" INTEGER NOT NULL ON CONFLICT REPLACE DEFAULT 0
8181
) STRICT
8282
""",
8383
tableInfo: [
8484
[0]: TableInfo(
85-
defaultValue: nil,
86-
isPrimaryKey: true,
87-
name: "id",
88-
isNotNull: true,
89-
type: "INTEGER"
90-
),
91-
[1]: TableInfo(
9285
defaultValue: "0",
9386
isPrimaryKey: false,
9487
name: "position",
9588
isNotNull: true,
9689
type: "INTEGER"
9790
),
98-
[2]: TableInfo(
91+
[1]: TableInfo(
9992
defaultValue: nil,
100-
isPrimaryKey: false,
93+
isPrimaryKey: true,
10194
name: "remindersListID",
10295
isNotNull: true,
10396
type: "INTEGER"
@@ -769,7 +762,7 @@
769762
try await userDatabase.userWrite { db in
770763
try db.seed {
771764
RemindersList(id: 1, title: "Personal")
772-
RemindersListPrivate(id: 1, position: 1, remindersListID: 1)
765+
RemindersListPrivate(remindersListID: 1, position: 1)
773766
Reminder(id: 1, title: "", remindersListID: 1)
774767
Reminder(id: 2, title: "", remindersListID: 1)
775768
Reminder(id: 3, title: "", remindersListID: 1)
@@ -901,6 +894,5 @@
901894
}
902895
}
903896
}
904-
905897
}
906898
#endif

Tests/SQLiteDataTests/CloudKitTests/FetchedDatabaseChangesTests.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
RemindersList(id: 2, title: "Business")
2121
Reminder(id: 1, title: "Get milk", remindersListID: 1)
2222
Reminder(id: 2, title: "Call accountant", remindersListID: 2)
23-
RemindersListPrivate(id: 1, remindersListID: 1)
24-
RemindersListPrivate(id: 2, remindersListID: 2)
23+
RemindersListPrivate(remindersListID: 1)
24+
RemindersListPrivate(remindersListID: 2)
2525
UnsyncedModel(id: 1)
2626
UnsyncedModel(id: 2)
2727
}
@@ -52,8 +52,8 @@
5252
RemindersList(id: 2, title: "Business")
5353
Reminder(id: 1, title: "Get milk", remindersListID: 1)
5454
Reminder(id: 2, title: "Call accountant", remindersListID: 2)
55-
RemindersListPrivate(id: 1, remindersListID: 1)
56-
RemindersListPrivate(id: 2, remindersListID: 2)
55+
RemindersListPrivate(remindersListID: 1)
56+
RemindersListPrivate(remindersListID: 2)
5757
UnsyncedModel(id: 1)
5858
UnsyncedModel(id: 2)
5959
}
@@ -106,18 +106,16 @@
106106
[2]: CKRecord(
107107
recordID: CKRecord.ID(1:remindersListPrivates/zone/__defaultOwner__),
108108
recordType: "remindersListPrivates",
109-
parent: CKReference(recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__)),
109+
parent: nil,
110110
share: nil,
111-
id: 1,
112111
position: 0,
113112
remindersListID: 1
114113
),
115114
[3]: CKRecord(
116115
recordID: CKRecord.ID(2:remindersListPrivates/zone/__defaultOwner__),
117116
recordType: "remindersListPrivates",
118-
parent: CKReference(recordID: CKRecord.ID(2:remindersLists/zone/__defaultOwner__)),
117+
parent: nil,
119118
share: nil,
120-
id: 2,
121119
position: 0,
122120
remindersListID: 2
123121
),

Tests/SQLiteDataTests/CloudKitTests/NextRecordZoneChangeBatchTests.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@
225225
try await userDatabase.userWrite { db in
226226
try db.seed {
227227
RemindersList(id: 1, title: "Personal")
228-
RemindersListPrivate(id: 1, position: 42, remindersListID: 1)
228+
RemindersListPrivate(remindersListID: 1, position: 42)
229229
}
230230
}
231231

@@ -239,9 +239,8 @@
239239
[0]: CKRecord(
240240
recordID: CKRecord.ID(1:remindersListPrivates/zone/__defaultOwner__),
241241
recordType: "remindersListPrivates",
242-
parent: CKReference(recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__)),
242+
parent: nil,
243243
share: nil,
244-
id: 1,
245244
position: 42,
246245
remindersListID: 1
247246
),

Tests/SQLiteDataTests/CloudKitTests/RecordTypeTests.swift

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,29 +73,22 @@
7373
tableName: "remindersListPrivates",
7474
schema: """
7575
CREATE TABLE "remindersListPrivates" (
76-
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
77-
"position" INTEGER NOT NULL ON CONFLICT REPLACE DEFAULT 0,
78-
"remindersListID" INTEGER NOT NULL REFERENCES "remindersLists"("id") ON DELETE CASCADE
76+
"remindersListID" INTEGER PRIMARY KEY NOT NULL REFERENCES "remindersLists"("id")
77+
ON DELETE CASCADE,
78+
"position" INTEGER NOT NULL ON CONFLICT REPLACE DEFAULT 0
7979
) STRICT
8080
""",
8181
tableInfo: [
8282
[0]: TableInfo(
83-
defaultValue: nil,
84-
isPrimaryKey: true,
85-
name: "id",
86-
isNotNull: true,
87-
type: "INTEGER"
88-
),
89-
[1]: TableInfo(
9083
defaultValue: "0",
9184
isPrimaryKey: false,
9285
name: "position",
9386
isNotNull: true,
9487
type: "INTEGER"
9588
),
96-
[2]: TableInfo(
89+
[1]: TableInfo(
9790
defaultValue: nil,
98-
isPrimaryKey: false,
91+
isPrimaryKey: true,
9992
name: "remindersListID",
10093
isNotNull: true,
10194
type: "INTEGER"

Tests/SQLiteDataTests/CloudKitTests/SharingTests.swift

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116
@Test func sharePrivateTable() async throws {
117117
let error = await #expect(throws: (any Error).self) {
118118
_ = try await self.syncEngine.share(
119-
record: RemindersListPrivate(id: 1, remindersListID: 1),
119+
record: RemindersListPrivate(remindersListID: 1),
120120
configure: { _ in }
121121
)
122122
}
@@ -151,6 +151,58 @@
151151
}
152152
}
153153

154+
@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
155+
@Test func privateTableNotShared() async throws {
156+
let remindersList = RemindersList(id: 1, title: "Personal")
157+
try await userDatabase.userWrite { db in
158+
try db.seed {
159+
remindersList
160+
RemindersListPrivate(remindersListID: 1, position: 42)
161+
}
162+
}
163+
try await syncEngine.processPendingRecordZoneChanges(scope: .private)
164+
165+
let _ = try await syncEngine.share(record: remindersList, configure: { _ in })
166+
167+
assertInlineSnapshot(of: container, as: .customDump) {
168+
"""
169+
MockCloudContainer(
170+
privateCloudDatabase: MockCloudDatabase(
171+
databaseScope: .private,
172+
storage: [
173+
[0]: CKRecord(
174+
recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__),
175+
recordType: "cloudkit.share",
176+
parent: nil,
177+
share: nil
178+
),
179+
[1]: CKRecord(
180+
recordID: CKRecord.ID(1:remindersListPrivates/zone/__defaultOwner__),
181+
recordType: "remindersListPrivates",
182+
parent: nil,
183+
share: nil,
184+
position: 42,
185+
remindersListID: 1
186+
),
187+
[2]: CKRecord(
188+
recordID: CKRecord.ID(1:remindersLists/zone/__defaultOwner__),
189+
recordType: "remindersLists",
190+
parent: nil,
191+
share: CKReference(recordID: CKRecord.ID(share-1:remindersLists/zone/__defaultOwner__)),
192+
id: 1,
193+
title: "Personal"
194+
)
195+
]
196+
),
197+
sharedCloudDatabase: MockCloudDatabase(
198+
databaseScope: .shared,
199+
storage: []
200+
)
201+
)
202+
"""
203+
}
204+
}
205+
154206
@available(iOS 17, macOS 14, tvOS 17, watchOS 10, *)
155207
@Test func shareRecordBeforeSync() async throws {
156208
let error = await #expect(throws: (any Error).self) {

Tests/SQLiteDataTests/CloudKitTests/TriggerTests.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@
255255
AFTER DELETE ON "remindersListPrivates"
256256
FOR EACH ROW WHEN "sqlitedata_icloud_syncEngineIsSynchronizingChanges"() BEGIN
257257
DELETE FROM "sqlitedata_icloud_metadata"
258-
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("old"."id")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersListPrivates'));
258+
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("old"."remindersListID")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersListPrivates'));
259259
END
260260
""",
261261
[17]: """
@@ -276,7 +276,7 @@
276276
WHERE ((NOT ("sqlitedata_icloud_syncEngineIsSynchronizingChanges"())) AND (("rootShares"."parentRecordName") IS (NULL))) AND (NOT ("sqlitedata_icloud_hasPermission"("rootShares"."share")));
277277
UPDATE "sqlitedata_icloud_metadata"
278278
SET "_isDeleted" = 1
279-
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("old"."id")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersListPrivates'));
279+
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("old"."remindersListID")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersListPrivates'));
280280
END
281281
""",
282282
[18]: """
@@ -626,7 +626,7 @@
626626
WHERE ((NOT ("sqlitedata_icloud_syncEngineIsSynchronizingChanges"())) AND (("rootShares"."parentRecordName") IS (NULL))) AND (NOT ("sqlitedata_icloud_hasPermission"("rootShares"."share")));
627627
INSERT INTO "sqlitedata_icloud_metadata"
628628
("recordPrimaryKey", "recordType", "zoneName", "ownerName", "parentRecordPrimaryKey", "parentRecordType")
629-
SELECT "new"."id", 'remindersListPrivates', coalesce(coalesce("sqlitedata_icloud_currentZoneName"(), (SELECT "sqlitedata_icloud_metadata"."zoneName"
629+
SELECT "new"."remindersListID", 'remindersListPrivates', coalesce(coalesce("sqlitedata_icloud_currentZoneName"(), (SELECT "sqlitedata_icloud_metadata"."zoneName"
630630
FROM "sqlitedata_icloud_metadata"
631631
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("new"."remindersListID")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersLists')))), 'zone'), coalesce(coalesce("sqlitedata_icloud_currentOwnerName"(), (SELECT "sqlitedata_icloud_metadata"."ownerName"
632632
FROM "sqlitedata_icloud_metadata"
@@ -878,8 +878,8 @@
878878
""",
879879
[47]: """
880880
CREATE TRIGGER "sqlitedata_icloud_after_primary_key_change_on_remindersListPrivates"
881-
AFTER UPDATE OF "id" ON "remindersListPrivates"
882-
FOR EACH ROW WHEN ("old"."id") <> ("new"."id") BEGIN
881+
AFTER UPDATE OF "remindersListID" ON "remindersListPrivates"
882+
FOR EACH ROW WHEN ("old"."remindersListID") <> ("new"."remindersListID") BEGIN
883883
WITH "rootShares" AS (
884884
SELECT "sqlitedata_icloud_metadata"."parentRecordName" AS "parentRecordName", "sqlitedata_icloud_metadata"."share" AS "share"
885885
FROM "sqlitedata_icloud_metadata"
@@ -894,7 +894,7 @@
894894
WHERE ((NOT ("sqlitedata_icloud_syncEngineIsSynchronizingChanges"())) AND (("rootShares"."parentRecordName") IS (NULL))) AND (NOT ("sqlitedata_icloud_hasPermission"("rootShares"."share")));
895895
UPDATE "sqlitedata_icloud_metadata"
896896
SET "_isDeleted" = 1
897-
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("old"."id")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersListPrivates'));
897+
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("old"."remindersListID")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersListPrivates'));
898898
END
899899
""",
900900
[48]: """
@@ -1230,7 +1230,7 @@
12301230
WHERE ((NOT ("sqlitedata_icloud_syncEngineIsSynchronizingChanges"())) AND (("rootShares"."parentRecordName") IS (NULL))) AND (NOT ("sqlitedata_icloud_hasPermission"("rootShares"."share")));
12311231
INSERT INTO "sqlitedata_icloud_metadata"
12321232
("recordPrimaryKey", "recordType", "zoneName", "ownerName", "parentRecordPrimaryKey", "parentRecordType")
1233-
SELECT "new"."id", 'remindersListPrivates', coalesce(coalesce("sqlitedata_icloud_currentZoneName"(), (SELECT "sqlitedata_icloud_metadata"."zoneName"
1233+
SELECT "new"."remindersListID", 'remindersListPrivates', coalesce(coalesce("sqlitedata_icloud_currentZoneName"(), (SELECT "sqlitedata_icloud_metadata"."zoneName"
12341234
FROM "sqlitedata_icloud_metadata"
12351235
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("new"."remindersListID")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersLists')))), 'zone'), coalesce(coalesce("sqlitedata_icloud_currentOwnerName"(), (SELECT "sqlitedata_icloud_metadata"."ownerName"
12361236
FROM "sqlitedata_icloud_metadata"
@@ -1242,7 +1242,7 @@
12421242
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("new"."remindersListID")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersLists')))), "sqlitedata_icloud_metadata"."zoneName"), "ownerName" = coalesce(coalesce("sqlitedata_icloud_currentOwnerName"(), (SELECT "sqlitedata_icloud_metadata"."ownerName"
12431243
FROM "sqlitedata_icloud_metadata"
12441244
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("new"."remindersListID")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersLists')))), "sqlitedata_icloud_metadata"."ownerName"), "parentRecordPrimaryKey" = "new"."remindersListID", "parentRecordType" = 'remindersLists', "userModificationTime" = "sqlitedata_icloud_currentTime"()
1245-
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("new"."id")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersListPrivates'));
1245+
WHERE (("sqlitedata_icloud_metadata"."recordPrimaryKey") = ("new"."remindersListID")) AND (("sqlitedata_icloud_metadata"."recordType") = ('remindersListPrivates'));
12461246
END
12471247
""",
12481248
[60]: """

Tests/SQLiteDataTests/Internal/Schema.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ import SQLiteData
2323
var id: RemindersList.ID { remindersListID }
2424
}
2525
@Table struct RemindersListPrivate: Equatable, Identifiable {
26-
let id: Int
27-
var position = 0
26+
@Column(primaryKey: true)
2827
var remindersListID: RemindersList.ID
28+
var position = 0
29+
var id: RemindersList.ID { remindersListID }
2930
}
3031
@Table struct Tag: Equatable, Identifiable {
3132
@Column(primaryKey: true)
@@ -112,9 +113,9 @@ func database(
112113
try #sql(
113114
"""
114115
CREATE TABLE "remindersListPrivates" (
115-
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
116-
"position" INTEGER NOT NULL ON CONFLICT REPLACE DEFAULT 0,
117-
"remindersListID" INTEGER NOT NULL REFERENCES "remindersLists"("id") ON DELETE CASCADE
116+
"remindersListID" INTEGER PRIMARY KEY NOT NULL REFERENCES "remindersLists"("id")
117+
ON DELETE CASCADE,
118+
"position" INTEGER NOT NULL ON CONFLICT REPLACE DEFAULT 0
118119
) STRICT
119120
"""
120121
)

0 commit comments

Comments
 (0)