|
1125 | 1125 |
|
1126 | 1126 | let batch = await syncEngine.recordZoneChangeBatch(pendingChanges: changes) { recordID in |
1127 | 1127 | guard |
1128 | | - let (metadata, allFields) = await withErrorReporting( |
| 1128 | + let metadata = await withErrorReporting( |
1129 | 1129 | .sqliteDataCloudKitFailure, |
1130 | 1130 | catching: { |
1131 | 1131 | try await metadatabase.read { db in |
1132 | 1132 | try SyncMetadata |
1133 | 1133 | .find(recordID) |
1134 | | - .select { ($0, $0._lastKnownServerRecordAllFields) } |
1135 | 1134 | .fetchOne(db) |
1136 | 1135 | } |
1137 | 1136 | } |
|
1197 | 1196 | } |
1198 | 1197 |
|
1199 | 1198 | let record = |
1200 | | - allFields |
1201 | | - ?? metadata.lastKnownServerRecord |
| 1199 | + metadata.allFieldsRecord |
1202 | 1200 | ?? CKRecord( |
1203 | 1201 | recordType: metadata.recordType, |
1204 | 1202 | recordID: recordID |
|
1221 | 1219 | with: T(queryOutput: row), |
1222 | 1220 | userModificationTime: metadata.userModificationTime |
1223 | 1221 | ) |
1224 | | - await refreshLastKnownServerRecord(record) |
| 1222 | + await withErrorReporting(.sqliteDataCloudKitFailure) { |
| 1223 | + try await userDatabase.write { db in |
| 1224 | + try refreshLastKnownServerRecord(record, db: db) |
| 1225 | + if metadata._pendingStatus == .reinserted { |
| 1226 | + try SyncMetadata |
| 1227 | + .find(record.recordID) |
| 1228 | + .update { $0._pendingStatus = #bind(nil) } |
| 1229 | + .execute(db) |
| 1230 | + } |
| 1231 | + } |
| 1232 | + } |
1225 | 1233 | sentRecord = recordID |
1226 | 1234 | return record |
1227 | 1235 | } |
|
1949 | 1957 | func open<T>(_ table: some SynchronizableTable<T>) throws { |
1950 | 1958 | var columnNames: [String] = T.TableColumns.writableColumns.map(\.name) |
1951 | 1959 | if !force, |
1952 | | - let allFields = metadata._lastKnownServerRecordAllFields, |
| 1960 | + let allFields = metadata.allFieldsRecord, |
1953 | 1961 | let row = try T.find(#sql("\(bind: metadata.recordPrimaryKey)")).fetchOne(db) |
1954 | 1962 | { |
| 1963 | + if metadata._pendingStatus == .reinserted { |
| 1964 | + allFields.update(with: T(queryOutput: row), userModificationTime: metadata.userModificationTime) |
| 1965 | + } |
1955 | 1966 | serverRecord.update( |
1956 | 1967 | with: allFields, |
1957 | 1968 | row: T(queryOutput: row), |
|
1971 | 1982 | .find(serverRecord.recordID) |
1972 | 1983 | .update { $0.setLastKnownServerRecord(serverRecord) } |
1973 | 1984 | .execute(db) |
| 1985 | + if metadata._pendingStatus == .reinserted { |
| 1986 | + try SyncMetadata |
| 1987 | + .find(serverRecord.recordID) |
| 1988 | + .update { $0._pendingStatus = #bind(nil) } |
| 1989 | + .execute(db) |
| 1990 | + } |
1974 | 1991 | } catch { |
1975 | 1992 | guard |
1976 | 1993 | let error = error as? DatabaseError, |
|
1993 | 2010 | private func refreshLastKnownServerRecord(_ record: CKRecord) async { |
1994 | 2011 | await withErrorReporting(.sqliteDataCloudKitFailure) { |
1995 | 2012 | try await userDatabase.write { db in |
1996 | | - let metadata = try SyncMetadata.find(record.recordID).fetchOne(db) |
1997 | | - func updateLastKnownServerRecord() throws { |
1998 | | - try SyncMetadata |
1999 | | - .find(record.recordID) |
2000 | | - .update { $0.setLastKnownServerRecord(record) } |
2001 | | - .execute(db) |
2002 | | - } |
2003 | | - |
2004 | | - if let lastKnownDate = metadata?.lastKnownServerRecord?.modificationDate { |
2005 | | - if let recordDate = record.modificationDate, lastKnownDate < recordDate { |
2006 | | - try updateLastKnownServerRecord() |
2007 | | - } |
2008 | | - } else { |
2009 | | - try updateLastKnownServerRecord() |
2010 | | - } |
| 2013 | + try refreshLastKnownServerRecord(record, db: db) |
| 2014 | + } |
| 2015 | + } |
| 2016 | + } |
| 2017 | + |
| 2018 | + private func refreshLastKnownServerRecord(_ record: CKRecord, db: Database) throws { |
| 2019 | + let metadata = try SyncMetadata.find(record.recordID).fetchOne(db) |
| 2020 | + func updateLastKnownServerRecord() throws { |
| 2021 | + try SyncMetadata |
| 2022 | + .find(record.recordID) |
| 2023 | + .update { $0.setLastKnownServerRecord(record) } |
| 2024 | + .execute(db) |
| 2025 | + } |
| 2026 | + if let lastKnownDate = metadata?.lastKnownServerRecord?.modificationDate { |
| 2027 | + if let recordDate = record.modificationDate, lastKnownDate < recordDate { |
| 2028 | + try updateLastKnownServerRecord() |
2011 | 2029 | } |
| 2030 | + } else { |
| 2031 | + try updateLastKnownServerRecord() |
2012 | 2032 | } |
2013 | 2033 | } |
2014 | 2034 |
|
|
0 commit comments