package database import ( "database/sql" _ "embed" _ "github.com/mattn/go-sqlite3" ) type Manager struct { ConnectionString string db *sql.DB Mangas DbTable[int, Manga] Chapters DbTable[int, Chapter] CreateIfNotExists bool } 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), CreateIfNotExists: createIfNotExists, } } func (dbMgr *Manager) Open() error { db, err := sql.Open("sqlite3", dbMgr.ConnectionString) if err != nil { return err } 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() 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 { 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 { return err } } } return nil } func (dbMgr *Manager) Save() error { err := dbMgr.Mangas.Save(dbMgr.db) if err != nil { return err } return dbMgr.Chapters.Save(dbMgr.db) } //go:embed createDb.sql var createSql string func (dbMgr *Manager) createDatabaseIfNotExists() error { _, err := dbMgr.db.Exec(createSql) 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 } return nil }