|
553 | 553 | } |
554 | 554 | guard let privateSyncEngine, let sharedSyncEngine |
555 | 555 | else { return } |
| 556 | + try await enqueueLocallyPendingChanges() |
556 | 557 | async let `private`: Void = privateSyncEngine.sendChanges(options) |
557 | 558 | async let shared: Void = sharedSyncEngine.sendChanges(options) |
558 | 559 | _ = try await (`private`, shared) |
|
590 | 591 | ) async throws { |
591 | 592 | try await enqueueLocallyPendingChanges() |
592 | 593 | try await userDatabase.write { db in |
593 | | - try PendingRecordZoneChange.delete().execute(db) |
594 | | - |
595 | 594 | let newTableNames = currentRecordTypeByTableName.keys.filter { tableName in |
596 | 595 | previousRecordTypeByTableName[tableName] == nil |
597 | 596 | } |
|
605 | 604 | } |
606 | 605 |
|
607 | 606 | private func enqueueLocallyPendingChanges() async throws { |
608 | | - let pendingRecordZoneChanges = try await metadatabase.read { db in |
| 607 | + let pendingRecordZoneChanges = try await metadatabase.write { db in |
609 | 608 | try PendingRecordZoneChange |
610 | | - .select(\.pendingRecordZoneChange) |
| 609 | + .delete() |
| 610 | + .returning(\.pendingRecordZoneChange) |
611 | 611 | .fetchAll(db) |
612 | 612 | } |
613 | 613 | let changesByIsPrivate = Dictionary(grouping: pendingRecordZoneChanges) { |
|
1577 | 1577 | var newPendingRecordZoneChanges: [CKSyncEngine.PendingRecordZoneChange] = [] |
1578 | 1578 | var newPendingDatabaseChanges: [CKSyncEngine.PendingDatabaseChange] = [] |
1579 | 1579 | defer { |
| 1580 | + let quotaExceeded = failedRecordSaves.contains(where: { $0.error.code == .quotaExceeded }) |
| 1581 | + delegate?.syncEngine( |
| 1582 | + self, |
| 1583 | + quotaExceeded: quotaExceeded, |
| 1584 | + scope: syncEngine.database.databaseScope |
| 1585 | + ) |
1580 | 1586 | syncEngine.state.add(pendingDatabaseChanges: newPendingDatabaseChanges) |
1581 | 1587 | syncEngine.state.add(pendingRecordZoneChanges: newPendingRecordZoneChanges) |
1582 | 1588 | } |
|
1700 | 1706 | break |
1701 | 1707 |
|
1702 | 1708 | case .quotaExceeded: |
1703 | | - delegate?.syncEngine(self, quotaExceeded: syncEngine.database.databaseScope) |
| 1709 | + await withErrorReporting { |
| 1710 | + try await userDatabase.write { db in |
| 1711 | + try PendingRecordZoneChange.insert { |
| 1712 | + PendingRecordZoneChange(.saveRecord(failedRecord.recordID)) |
| 1713 | + } |
| 1714 | + .execute(db) |
| 1715 | + } |
| 1716 | + } |
1704 | 1717 |
|
1705 | 1718 | case .networkFailure, .networkUnavailable, .zoneBusy, .serviceUnavailable, |
1706 | 1719 | .notAuthenticated, .operationCancelled, |
|
1738 | 1751 | syncEngine.state.add(pendingRecordZoneChanges: [.deleteRecord(failedRecordID)]) |
1739 | 1752 | break |
1740 | 1753 | case .networkFailure, .networkUnavailable, .zoneBusy, .serviceUnavailable, |
1741 | | - .notAuthenticated, .operationCancelled, .internalError, .partialFailure, |
1742 | | - .badContainer, .requestRateLimited, .missingEntitlement, .invalidArguments, |
1743 | | - .resultsTruncated, .assetFileNotFound, .assetFileModified, .incompatibleVersion, |
1744 | | - .constraintViolation, .changeTokenExpired, .badDatabase, .quotaExceeded, |
1745 | | - .limitExceeded, .userDeletedZone, .tooManyParticipants, .alreadyShared, |
1746 | | - .managedAccountRestricted, .participantMayNeedVerification, .serverResponseLost, |
1747 | | - .assetNotAvailable, .accountTemporarilyUnavailable, .permissionFailure, |
1748 | | - .unknownItem, .serverRecordChanged, .serverRejectedRequest, .zoneNotFound, |
1749 | | - .participantAlreadyInvited: |
| 1754 | + .notAuthenticated, .operationCancelled, .internalError, .partialFailure, |
| 1755 | + .badContainer, .requestRateLimited, .missingEntitlement, .invalidArguments, |
| 1756 | + .resultsTruncated, .assetFileNotFound, .assetFileModified, .incompatibleVersion, |
| 1757 | + .constraintViolation, .changeTokenExpired, .badDatabase, .quotaExceeded, |
| 1758 | + .limitExceeded, .userDeletedZone, .tooManyParticipants, .alreadyShared, |
| 1759 | + .managedAccountRestricted, .participantMayNeedVerification, .serverResponseLost, |
| 1760 | + .assetNotAvailable, .accountTemporarilyUnavailable, .permissionFailure, |
| 1761 | + .unknownItem, .serverRecordChanged, .serverRejectedRequest, .zoneNotFound, |
| 1762 | + .participantAlreadyInvited: |
1750 | 1763 | break |
1751 | 1764 | @unknown default: |
1752 | 1765 | break |
|
0 commit comments