diff --git a/internal/database/database.go b/internal/database/database.go index 879abed..571febe 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -3,6 +3,7 @@ package database import ( "database/sql" _ "embed" + "errors" _ "github.com/mattn/go-sqlite3" ) @@ -55,7 +56,7 @@ func (dbMgr *Manager) Close() error { func (dbMgr *Manager) Delete(mangaId int) error { dbMgr.Mangas.Get(mangaId) err := dbMgr.Mangas.Delete(dbMgr.db, mangaId) - if err != nil { + if err != nil && !errors.Is(err, IgnoreDeleteError{}) { return err } @@ -63,7 +64,7 @@ func (dbMgr *Manager) Delete(mangaId int) error { for i, chapter := range chapters { if chapter.MangaId == mangaId { err := dbMgr.Chapters.Delete(dbMgr.db, i) - if err != nil { + if err != nil && !errors.Is(err, IgnoreDeleteError{}) { return err } } diff --git a/internal/database/setting.go b/internal/database/setting.go index ac60b0e..cd11d33 100644 --- a/internal/database/setting.go +++ b/internal/database/setting.go @@ -58,8 +58,17 @@ func loadSettings(db *sql.DB) (map[string]Setting, error) { return res, err } +type IgnoreDeleteError struct{} + +func (m IgnoreDeleteError) Error() string { + return "Should ignore deletion" +} + func deleteSetting(db *sql.DB, key string) error { const cmd = "UPDATE Setting set Value = DefaultValue WHERE Name = ?" _, err := db.Exec(cmd, key) - return err + if err != nil { + return err + } + return IgnoreDeleteError{} } diff --git a/internal/database/table.go b/internal/database/table.go index 1142d79..c22e44b 100644 --- a/internal/database/table.go +++ b/internal/database/table.go @@ -5,7 +5,7 @@ import ( "sync" ) -type DbStatus int +type DbStatus uint8 const ( New DbStatus = iota @@ -80,27 +80,56 @@ func (d *DbTable[K, T]) Map() map[K]T { return res } +func (d *DbTable[K, T]) First(filter func(match T) bool) (key K, value T, ok bool) { + d.mutex.Lock() + defer d.mutex.Unlock() + + for k, manga := range d.items { + if filter(manga) { + return k, manga, true + } + } + + return *new(K), *new(T), false +} + +func (d *DbTable[K, T]) Where(filter func(match T) bool) map[K]T { + d.mutex.Lock() + defer d.mutex.Unlock() + res := make(map[K]T, len(d.items)) + for k, manga := range d.items { + if filter(manga) { + res[k] = manga + } + } + return res +} + func (d *DbTable[K, T]) Delete(db *sql.DB, key K) error { d.mutex.Lock() defer d.mutex.Unlock() - delete(d.items, key) - return d.deleteFunc(db, key) + err := d.deleteFunc(db, key) + if err == nil { + delete(d.items, key) + } + return err } func (d *DbTable[K, T]) Save(db *sql.DB) error { d.mutex.Lock() defer d.mutex.Unlock() for k, status := range d.updated { - if status == Loaded { + switch status { + case Loaded: continue - } else if status == Updated { + case Updated: item := d.items[k] err := d.updateFunc(db, &item) if err != nil { return err } d.updated[k] = Loaded - } else { + case New: item := d.items[k] err := d.insertFunc(db, &item) if err != nil {