minor changes to table.go
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return IgnoreDeleteError{}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
err := d.deleteFunc(db, key)
|
||||
if err == nil {
|
||||
delete(d.items, key)
|
||||
return d.deleteFunc(db, 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 {
|
||||
|
||||
Reference in New Issue
Block a user