Added initial Settings
This commit is contained in:
@@ -14,4 +14,10 @@ create table if not exists Chapter (
|
||||
Number integer not null,
|
||||
TimeStampUnixEpoch integer not null,
|
||||
foreign key(MangaID) references Manga(ID)
|
||||
);
|
||||
|
||||
create table if not exists Setting (
|
||||
Name text not null primary key,
|
||||
Value text,
|
||||
DefaultValue text not null
|
||||
);
|
||||
@@ -11,6 +11,7 @@ type Manager struct {
|
||||
db *sql.DB
|
||||
Mangas DbTable[int, Manga]
|
||||
Chapters DbTable[int, Chapter]
|
||||
Settings DbTable[string, Setting]
|
||||
CreateIfNotExists bool
|
||||
}
|
||||
|
||||
@@ -18,8 +19,9 @@ func NewDatabase(connectionString string, createIfNotExists bool) Manager {
|
||||
return Manager{
|
||||
ConnectionString: connectionString,
|
||||
db: nil,
|
||||
Mangas: NewDbTable[int, Manga](updateManga, insertManga, loadMangas, deleteManga),
|
||||
Chapters: NewDbTable[int, Chapter](updateChapter, insertChapter, loadChapters, deleteChapter),
|
||||
Mangas: NewDbTable(updateManga, insertManga, loadMangas, deleteManga),
|
||||
Chapters: NewDbTable(updateChapter, insertChapter, loadChapters, deleteChapter),
|
||||
Settings: NewDbTable(updateSetting, insertSetting, loadSettings, deleteSetting),
|
||||
CreateIfNotExists: createIfNotExists,
|
||||
}
|
||||
}
|
||||
@@ -75,8 +77,12 @@ func (dbMgr *Manager) Save() error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = dbMgr.Chapters.Save(dbMgr.db)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return dbMgr.Chapters.Save(dbMgr.db)
|
||||
return dbMgr.Settings.Save(dbMgr.db)
|
||||
}
|
||||
|
||||
//go:embed createDb.sql
|
||||
@@ -98,5 +104,11 @@ func (dbMgr *Manager) load() error {
|
||||
return err
|
||||
}
|
||||
|
||||
err = dbMgr.Settings.Load(dbMgr.db)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
initSettings(&dbMgr.Settings)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
65
internal/database/setting.go
Normal file
65
internal/database/setting.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
)
|
||||
|
||||
type Setting struct {
|
||||
Name string
|
||||
Value string
|
||||
Default string
|
||||
}
|
||||
|
||||
func NewSetting(name string, defaultValue string) Setting {
|
||||
return Setting{
|
||||
Name: name,
|
||||
Value: defaultValue,
|
||||
Default: defaultValue,
|
||||
}
|
||||
}
|
||||
|
||||
func initSettings(settings *DbTable[string, Setting]) {
|
||||
addSettingIfNotExists(NewSetting("theme", "white"), settings)
|
||||
addSettingIfNotExists(NewSetting("order", "title"), settings)
|
||||
}
|
||||
|
||||
func addSettingIfNotExists(setting Setting, settings *DbTable[string, Setting]) {
|
||||
_, exists := settings.Get(setting.Name)
|
||||
if !exists {
|
||||
settings.Set(setting.Name, setting)
|
||||
}
|
||||
}
|
||||
|
||||
func updateSetting(db *sql.DB, s *Setting) error {
|
||||
const cmd = "UPDATE Setting set Value = ? WHERE Name = ?"
|
||||
_, err := db.Exec(cmd, s.Value, s.Name)
|
||||
return err
|
||||
}
|
||||
|
||||
func insertSetting(db *sql.DB, s *Setting) error {
|
||||
const cmd = "INSERT INTO Setting(Name, Value, DefaultValue) VALUES(?, ?, ?)"
|
||||
_, err := db.Exec(cmd, s.Name, s.Value, s.Default)
|
||||
return err
|
||||
}
|
||||
|
||||
func loadSettings(db *sql.DB) (map[string]Setting, error) {
|
||||
const cmd = "SELECT Name, Value, DefaultValue from Setting"
|
||||
rows, err := db.Query(cmd)
|
||||
|
||||
res := make(map[string]Setting)
|
||||
|
||||
for rows.Next() {
|
||||
setting := Setting{}
|
||||
if err = rows.Scan(&setting.Name, &setting.Value, &setting.Default); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
res[setting.Name] = setting
|
||||
}
|
||||
return res, err
|
||||
}
|
||||
|
||||
func deleteSetting(db *sql.DB, key string) error {
|
||||
const cmd = "UPDATE Setting set Value = DefaultValue WHERE Name = ?"
|
||||
_, err := db.Exec(cmd, key)
|
||||
return err
|
||||
}
|
||||
@@ -88,6 +88,16 @@ func (d *DbTable[K, T]) All() []T {
|
||||
return res
|
||||
}
|
||||
|
||||
func (d *DbTable[K, T]) Map() map[K]T {
|
||||
d.mutex.Lock()
|
||||
defer d.mutex.Unlock()
|
||||
res := make(map[K]T, len(d.items))
|
||||
for k, manga := range d.items {
|
||||
res[k] = manga
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func (d *DbTable[K, T]) Delete(db *sql.DB, key K) error {
|
||||
d.mutex.Lock()
|
||||
defer d.mutex.Unlock()
|
||||
|
||||
Reference in New Issue
Block a user