minor changes to table.go
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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{}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user