Change own DbTable implementation for Gorm

This commit is contained in:
Pablu23
2024-05-14 11:28:49 +02:00
parent 620a043286
commit 1bd80bc1c2
12 changed files with 125 additions and 485 deletions

View File

@@ -1,115 +1,59 @@
package database
import (
"database/sql"
_ "embed"
"errors"
_ "github.com/mattn/go-sqlite3"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type Manager struct {
ConnectionString string
db *sql.DB
Mangas DbTable[int, Manga]
Chapters DbTable[int, Chapter]
Settings DbTable[string, Setting]
Db *gorm.DB
CreateIfNotExists bool
}
func NewDatabase(connectionString string, createIfNotExists bool) Manager {
return Manager{
ConnectionString: connectionString,
db: nil,
Mangas: NewDbTable(updateManga, insertManga, loadMangas, deleteManga),
Chapters: NewDbTable(updateChapter, insertChapter, loadChapters, deleteChapter),
Settings: NewDbTable(updateSetting, insertSetting, loadSettings, deleteSetting),
Db: nil,
CreateIfNotExists: createIfNotExists,
}
}
func (dbMgr *Manager) Open() error {
db, err := sql.Open("sqlite3", dbMgr.ConnectionString)
db, err := gorm.Open(sqlite.Open(dbMgr.ConnectionString), &gorm.Config{})
if err != nil {
return err
}
dbMgr.db = db
dbMgr.Db = db
if dbMgr.CreateIfNotExists {
err = dbMgr.createDatabaseIfNotExists()
if err != nil {
return err
}
}
err = dbMgr.load()
return err
}
func (dbMgr *Manager) Close() error {
err := dbMgr.db.Close()
sql, err := dbMgr.Db.DB()
if err != nil {
return err
}
dbMgr.db = nil
err = sql.Close()
if err != nil {
return err
}
dbMgr.Db = nil
return nil
}
func (dbMgr *Manager) Delete(mangaId int) error {
dbMgr.Mangas.Get(mangaId)
err := dbMgr.Mangas.Delete(dbMgr.db, mangaId)
if err != nil && !errors.Is(err, IgnoreDeleteError{}) {
return err
}
chapters := dbMgr.Chapters.All()
for i, chapter := range chapters {
if chapter.MangaId == mangaId {
err := dbMgr.Chapters.Delete(dbMgr.db, i)
if err != nil && !errors.Is(err, IgnoreDeleteError{}) {
return err
}
}
}
return nil
func (dbMgr *Manager) Delete(mangaId int) {
dbMgr.Db.Delete(&Manga{}, mangaId)
}
func (dbMgr *Manager) Save() error {
err := dbMgr.Mangas.Save(dbMgr.db)
if err != nil {
return err
}
err = dbMgr.Chapters.Save(dbMgr.db)
if err != nil {
return err
}
return dbMgr.Settings.Save(dbMgr.db)
}
//go:embed createDb.sql
var createSql string
func (dbMgr *Manager) createDatabaseIfNotExists() error {
_, err := dbMgr.db.Exec(createSql)
err := dbMgr.Db.AutoMigrate(&Manga{}, &Chapter{}, &Setting{})
return err
}
func (dbMgr *Manager) load() error {
err := dbMgr.Chapters.Load(dbMgr.db)
if err != nil {
return err
}
err = dbMgr.Mangas.Load(dbMgr.db)
if err != nil {
return err
}
err = dbMgr.Settings.Load(dbMgr.db)
if err != nil {
return err
}
initSettings(&dbMgr.Settings)
return nil
}