|
213 | 213 | } |
214 | 214 | ?? false |
215 | 215 | } |
| 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 | + } |
216 | 232 |
|
217 | 233 | @discardableResult |
218 | 234 | package func removeValue( |
|
245 | 261 | let value = Value(queryOutput: row[keyPath: keyPath]) |
246 | 262 | switch value.queryBinding { |
247 | 263 | 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 | + } |
249 | 270 | case .bool(let value): |
250 | 271 | setValue(value, forKey: column.name, at: userModificationTime) |
251 | 272 | case .double(let value): |
|
290 | 311 | let didSet: Bool |
291 | 312 | if let value = other[key] as? CKAsset { |
292 | 313 | 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 | + } |
293 | 321 | } else if let value = other.encryptedValues[key] as? any EquatableCKRecordValueProtocol { |
294 | 322 | didSet = setValue(value, forKey: key, at: other.encryptedValues[at: key]) |
295 | 323 | } else if other.encryptedValues[key] == nil { |
|
301 | 329 | var isRowValueModified: Bool { |
302 | 330 | switch Value(queryOutput: row[keyPath: keyPath]).queryBinding { |
303 | 331 | case .blob(let value): |
| 332 | + // TODO: Use return other.encryptedValues[key] != value if inline backing |
304 | 333 | return other.encryptedValues[hash: key] != value.sha256 |
305 | 334 | case .bool(let value): |
306 | 335 | return other.encryptedValues[key] != value |
|
0 commit comments