Fix transfer errors, save raw data

This commit is contained in:
Christoph Hagen
2023-07-03 13:28:51 +02:00
parent 396571fd30
commit d1a24b581d
22 changed files with 369 additions and 1370 deletions

View File

@ -15,9 +15,6 @@ final class PersistentStorage: ObservableObject {
@AppStorage("newestDate")
private var newestMeasurementTime: Int = 0
@AppStorage("deviceTime")
private var lastDeviceTimeData: Data?
/**
The date of the latest measurement.
@ -71,6 +68,8 @@ final class PersistentStorage: ObservableObject {
ensureExistenceOfFolder()
//recalculateDailyCounts()
updateTransferCount()
updateDeviceInfoCount()
}
private func ensureExistenceOfFolder() {
@ -121,7 +120,7 @@ final class PersistentStorage: ObservableObject {
private func updateLastMeasurements(_ measurements: [TemperatureMeasurement]) {
let startDate = Date().addingTimeInterval(-lastValueInterval).seconds
recentMeasurements = (measurements + recentMeasurements)
.filter { $0.id > startDate }
.filter { $0.id > startDate }.sorted().reversed()
log.info("\(recentMeasurements.count) recent measurements (with \(measurements.count) new entries)")
}
@ -278,35 +277,78 @@ final class PersistentStorage: ObservableObject {
}
}
// MARK: Device time
// MARK: Device info archive
var lastDeviceTime: DeviceTime? {
get {
guard let data = lastDeviceTimeData else {
return nil
}
@Published
var numberOfStoredDeviceInfos: Int = 0
private func updateDeviceInfoCount() {
let count = countFiles(in: "info")
DispatchQueue.main.async {
self.numberOfStoredDeviceInfos = count
}
}
@Published
var numberOfStoredTransfers: Int = 0
private func updateTransferCount() {
let count = countFiles(in: "transfers")
DispatchQueue.main.async {
self.numberOfStoredTransfers = count
}
}
private func countFiles(in folder: String) -> Int {
let folder = PersistentStorage.documentDirectory.appendingPathComponent(folder)
guard fm.fileExists(atPath: folder.path) else {
return 0
}
do {
return try fm.contentsOfDirectory(atPath: folder.path).count
} catch {
log.error("Failed to count files in '\(folder)': \(error)")
return -1
}
}
private func save(data: Data, date: Date, in folderName: String) -> Bool {
let folder = PersistentStorage.documentDirectory.appendingPathComponent(folderName)
if !fm.fileExists(atPath: folder.path) {
do {
let result: DeviceTime = try BinaryDecoder.decode(from: data)
return result
try fm.createDirectory(at: folder, withIntermediateDirectories: false)
} catch {
log.error("Failed to decode device time: \(error)")
lastDeviceTimeData = nil
return nil
log.error("Failed to create folder '\(folderName)': \(error)")
return false
}
}
set {
guard let newValue else {
lastDeviceTimeData = nil
return
}
do {
let data = try BinaryEncoder.encode(newValue)
lastDeviceTimeData = data
} catch {
log.error("Failed to encode device time: \(error)")
lastDeviceTimeData = nil
}
let url = folder.appendingPathComponent("\(date.seconds)")
do {
try data.write(to: url)
} catch {
log.error("Failed to write '\(url.lastPathComponent)' in '\(folder)': \(error)")
return false
}
return true
}
@discardableResult
func save(deviceInfo: DeviceInfo) -> Bool {
defer { updateDeviceInfoCount() }
let data: Data
do {
data = try BinaryEncoder.encode(deviceInfo)
} catch {
log.error("Failed to encode device info for storage: \(error)")
return false
}
return save(data: data, date: deviceInfo.time.date, in: "info")
}
@discardableResult
func saveTransferData(data: Data, date: Date) -> Bool {
defer { updateTransferCount() }
return save(data: data, date: date, in: "transfers")
}
}