Fix transfer errors, save raw data
This commit is contained in:
@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user