Skip to content

Commit 0b01b40

Browse files
committed
Data backing POC
1 parent 2d59cde commit 0b01b40

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

Sources/SQLiteData/CloudKit/CloudKit+StructuredQueries.swift

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,22 @@
213213
}
214214
?? false
215215
}
216+
217+
@discardableResult
218+
package func setInlineValue(
219+
_ newValue: [UInt8],
220+
forKey key: CKRecord.FieldKey,
221+
at userModificationTime: Int64
222+
) -> Bool {
223+
guard
224+
encryptedValues[at: key] <= userModificationTime,
225+
encryptedValues[key] != newValue
226+
else { return false }
227+
encryptedValues[key] = newValue
228+
encryptedValues[at: key] = userModificationTime
229+
self.userModificationTime = userModificationTime
230+
return true
231+
}
216232

217233
@discardableResult
218234
package func removeValue(
@@ -245,7 +261,12 @@
245261
let value = Value(queryOutput: row[keyPath: keyPath])
246262
switch value.queryBinding {
247263
case .blob(let value):
248-
setValue(value, forKey: column.name, at: userModificationTime)
264+
switch (row as? DataBackingCustomizable)?.backing(for: column.name) ?? .asset {
265+
case .asset:
266+
setValue(value, forKey: column.name, at: userModificationTime)
267+
case .inline:
268+
setInlineValue(value, forKey: column.name, at: userModificationTime)
269+
}
249270
case .bool(let value):
250271
setValue(value, forKey: column.name, at: userModificationTime)
251272
case .double(let value):
@@ -290,6 +311,13 @@
290311
let didSet: Bool
291312
if let value = other[key] as? CKAsset {
292313
didSet = setAsset(value, forKey: key, at: other.encryptedValues[at: key])
314+
} else if let value = other[key] as? [UInt8] {
315+
switch (row as? DataBackingCustomizable)?.backing(for: key) ?? .asset {
316+
case .asset:
317+
didSet = setValue(value, forKey: column.name, at: other.encryptedValues[at: key])
318+
case .inline:
319+
didSet = setInlineValue(value, forKey: column.name, at: other.encryptedValues[at: key])
320+
}
293321
} else if let value = other.encryptedValues[key] as? any EquatableCKRecordValueProtocol {
294322
didSet = setValue(value, forKey: key, at: other.encryptedValues[at: key])
295323
} else if other.encryptedValues[key] == nil {
@@ -301,6 +329,7 @@
301329
var isRowValueModified: Bool {
302330
switch Value(queryOutput: row[keyPath: keyPath]).queryBinding {
303331
case .blob(let value):
332+
// TODO: Use return other.encryptedValues[key] != value if inline backing
304333
return other.encryptedValues[hash: key] != value.sha256
305334
case .bool(let value):
306335
return other.encryptedValues[key] != value
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
public protocol DataBackingCustomizable {
2+
func backing(for column: String) -> DataBacking
3+
}
4+
5+
public enum DataBacking {
6+
case asset
7+
case inline
8+
}

Tests/SQLiteDataTests/Internal/Schema.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ import SQLiteData
2222
var coverImage: Data?
2323
var id: RemindersList.ID { remindersListID }
2424
}
25+
extension RemindersListAsset: DataBackingCustomizable {
26+
func backing(for column: String) -> DataBacking {
27+
.asset
28+
}
29+
}
2530
@Table struct RemindersListPrivate: Equatable, Identifiable {
2631
let id: Int
2732
var position = 0

0 commit comments

Comments
 (0)