83 lines
2.0 KiB
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
|
|
}
|