minor changes to table.go

This commit is contained in:
Pablu23
2024-04-04 21:36:12 +02:00
parent 56fc884952
commit 620a043286
3 changed files with 48 additions and 9 deletions

View File

@@ -3,6 +3,7 @@ package database
import ( import (
"database/sql" "database/sql"
_ "embed" _ "embed"
"errors"
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )
@@ -55,7 +56,7 @@ func (dbMgr *Manager) Close() error {
func (dbMgr *Manager) Delete(mangaId int) error { func (dbMgr *Manager) Delete(mangaId int) error {
dbMgr.Mangas.Get(mangaId) dbMgr.Mangas.Get(mangaId)
err := dbMgr.Mangas.Delete(dbMgr.db, mangaId) err := dbMgr.Mangas.Delete(dbMgr.db, mangaId)
if err != nil { if err != nil && !errors.Is(err, IgnoreDeleteError{}) {
return err return err
} }
@@ -63,7 +64,7 @@ func (dbMgr *Manager) Delete(mangaId int) error {
for i, chapter := range chapters { for i, chapter := range chapters {
if chapter.MangaId == mangaId { if chapter.MangaId == mangaId {
err := dbMgr.Chapters.Delete(dbMgr.db, i) err := dbMgr.Chapters.Delete(dbMgr.db, i)
if err != nil { if err != nil && !errors.Is(err, IgnoreDeleteError{}) {
return err return err
} }
} }

View File

@@ -58,8 +58,17 @@ func loadSettings(db *sql.DB) (map[string]Setting, error) {
return res, err return res, err
} }
type IgnoreDeleteError struct{}
func (m IgnoreDeleteError) Error() string {
return "Should ignore deletion"
}
func deleteSetting(db *sql.DB, key string) error { func deleteSetting(db *sql.DB, key string) error {
const cmd = "UPDATE Setting set Value = DefaultValue WHERE Name = ?" const cmd = "UPDATE Setting set Value = DefaultValue WHERE Name = ?"
_, err := db.Exec(cmd, key) _, err := db.Exec(cmd, key)
return err if err != nil {
return err
}
return IgnoreDeleteError{}
} }

View File

@@ -5,7 +5,7 @@ import (
"sync" "sync"
) )
type DbStatus int type DbStatus uint8
const ( const (
New DbStatus = iota New DbStatus = iota
@@ -80,27 +80,56 @@ func (d *DbTable[K, T]) Map() map[K]T {
return res 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 { func (d *DbTable[K, T]) Delete(db *sql.DB, key K) error {
d.mutex.Lock() d.mutex.Lock()
defer d.mutex.Unlock() defer d.mutex.Unlock()
delete(d.items, key) err := d.deleteFunc(db, key)
return d.deleteFunc(db, key) if err == nil {
delete(d.items, key)
}
return err
} }
func (d *DbTable[K, T]) Save(db *sql.DB) error { func (d *DbTable[K, T]) Save(db *sql.DB) error {
d.mutex.Lock() d.mutex.Lock()
defer d.mutex.Unlock() defer d.mutex.Unlock()
for k, status := range d.updated { for k, status := range d.updated {
if status == Loaded { switch status {
case Loaded:
continue continue
} else if status == Updated { case Updated:
item := d.items[k] item := d.items[k]
err := d.updateFunc(db, &item) err := d.updateFunc(db, &item)
if err != nil { if err != nil {
return err return err
} }
d.updated[k] = Loaded d.updated[k] = Loaded
} else { case New:
item := d.items[k] item := d.items[k]
err := d.insertFunc(db, &item) err := d.insertFunc(db, &item)
if err != nil { if err != nil {