Files
mangaGetter/internal/database/manga.go

83 lines
2.0 KiB
Go

package database
import (
"bytes"
"cmp"
"database/sql"
"slices"
)
type Manga struct {
Id int
Title string
TimeStampUnix int64
Thumbnail *bytes.Buffer
LastChapterNum int
}
func NewManga(id int, title string, timeStampUnix int64) Manga {
return Manga{
Id: id,
Title: title,
TimeStampUnix: timeStampUnix,
}
}
// GetLatestChapter TODO: Cache this somehow
func (m *Manga) GetLatestChapter(chapters *DbTable[int, Chapter]) (*Chapter, bool) {
c := chapters.All()
slices.SortStableFunc(c, func(a, b Chapter) int {
return cmp.Compare(b.TimeStampUnix, a.TimeStampUnix)
})
for _, chapter := range c {
if chapter.MangaId == m.Id {
return &chapter, true
}
}
return nil, false
}
func updateManga(db *sql.DB, m *Manga) error {
const cmd = "UPDATE Manga set Title = ?, TimeStampUnixEpoch = ?, Thumbnail = ?, LatestAvailableChapter = ? WHERE ID = ?"
_, err := db.Exec(cmd, m.Title, m.TimeStampUnix, m.Thumbnail.Bytes(), m.LastChapterNum, m.Id)
return err
}
func insertManga(db *sql.DB, manga *Manga) error {
const cmd = "INSERT INTO Manga(ID, Title, TimeStampUnixEpoch, Thumbnail, LatestAvailableChapter) values(?, ?, ?, ?, ?)"
_, err := db.Exec(cmd, manga.Id, manga.Title, manga.TimeStampUnix, manga.Thumbnail.Bytes(), manga.LastChapterNum)
return err
}
func loadMangas(db *sql.DB) (map[int]Manga, error) {
rows, err := db.Query("SELECT Id, Title, TimeStampUnixEpoch, Thumbnail, LatestAvailableChapter FROM Manga")
if err != nil {
return nil, err
}
res := make(map[int]Manga)
for rows.Next() {
manga := Manga{}
var thumbnail []byte
if err = rows.Scan(&manga.Id, &manga.Title, &manga.TimeStampUnix, &thumbnail, &manga.LastChapterNum); err != nil {
return nil, err
}
if len(thumbnail) != 0 {
manga.Thumbnail = bytes.NewBuffer(thumbnail)
}
res[manga.Id] = manga
}
return res, nil
}
func deleteManga(db *sql.DB, key int) error {
_, err := db.Exec("DELETE from Chapter where ID = ?", key)
return err
}