Save automatically, improve mocks
This commit is contained in:
@ -2,7 +2,47 @@ import Foundation
|
||||
|
||||
extension Content {
|
||||
|
||||
func saveToDisk() -> Bool {
|
||||
func needsSave() {
|
||||
setModificationTimestamp()
|
||||
|
||||
if saveState == .isSaved {
|
||||
update(saveState: saveState)
|
||||
}
|
||||
// Wait a few seconds for a save, to allow additional changes
|
||||
// Reduces the number of saves
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) {
|
||||
self.saveIfNeeded()
|
||||
}
|
||||
}
|
||||
|
||||
func saveIfNeeded() {
|
||||
guard saveState != .isSaved else {
|
||||
return
|
||||
}
|
||||
if Date.now.timeIntervalSince(lastModification) < 5 {
|
||||
// Additional modification made
|
||||
// Wait for next scheduled invocation of saveIfNeeded()
|
||||
// if the overall unsaved time is not too long
|
||||
if Date.now.timeIntervalSince(lastSave) < 30 {
|
||||
//print("Waiting while modifying")
|
||||
return
|
||||
}
|
||||
print("Saving after 30 seconds of modifications")
|
||||
}
|
||||
saveUnconditionally()
|
||||
}
|
||||
|
||||
func saveUnconditionally() {
|
||||
guard saveToDisk() else {
|
||||
update(saveState: .failedToSave)
|
||||
// TODO: Try to save again
|
||||
return
|
||||
}
|
||||
update(saveState: .isSaved)
|
||||
setLastSaveTimestamp()
|
||||
}
|
||||
|
||||
private func saveToDisk() -> Bool {
|
||||
guard didLoadContent else { return false }
|
||||
guard storage.contentScope != nil else {
|
||||
print("Storage not initialized, not saving content")
|
||||
@ -10,12 +50,28 @@ extension Content {
|
||||
}
|
||||
|
||||
var failedSaves = 0
|
||||
failedSaves += pages.count { !storage.save(pageMetadata: $0.data, for: $0.id) }
|
||||
failedSaves += posts.count { !storage.save(post: $0.data, for: $0.id) }
|
||||
failedSaves += tags.count { !storage.save(tagMetadata: $0.data, for: $0.id) }
|
||||
failedSaves.increment(!storage.save(settings: settings.data(tagOverview: tagOverview)))
|
||||
failedSaves += files.count { !storage.save(fileInfo: $0.data, for: $0.id) }
|
||||
var saves = 0
|
||||
let pageSaves = saveChanged(pages)
|
||||
failedSaves += pageSaves.unsaved
|
||||
saves += pageSaves.saved
|
||||
|
||||
let postSaves = saveChanged(posts)
|
||||
failedSaves += postSaves.unsaved
|
||||
saves += postSaves.saved
|
||||
|
||||
let tagSaves = saveChanged(tags)
|
||||
failedSaves += tagSaves.unsaved
|
||||
saves += tagSaves.saved
|
||||
|
||||
failedSaves.increment(!storage.save(settings: settings.data(tagOverview: tagOverview)))
|
||||
|
||||
let fileSaves = saveChanged(files)
|
||||
failedSaves += fileSaves.unsaved
|
||||
saves += fileSaves.saved
|
||||
|
||||
if saves > 0 {
|
||||
print("Saved \(saves) changed items")
|
||||
}
|
||||
if failedSaves > 0 {
|
||||
print("Save partially failed with \(failedSaves) errors")
|
||||
return false
|
||||
@ -39,4 +95,22 @@ extension Content {
|
||||
}
|
||||
return success
|
||||
}
|
||||
|
||||
private func saveChanged<S>(_ items: S) -> (saved: Int, unsaved: Int, unchanged: Int) where S: Sequence, S.Element: StorageItem {
|
||||
var failed = 0
|
||||
var saved = 0
|
||||
var unchanged = 0
|
||||
for item in items {
|
||||
guard let wasSaved = item.saveIfNeeded() else {
|
||||
unchanged += 1
|
||||
continue
|
||||
}
|
||||
if wasSaved {
|
||||
saved += 1
|
||||
} else {
|
||||
failed += 1
|
||||
}
|
||||
}
|
||||
return (saved, failed, unchanged)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user