Added Thumbnails and saving those to db,
also added Log for Locking and unlocking Rw, because there was a Problem with that, and now it stays
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"database/sql"
|
||||
_ "embed"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
@@ -12,6 +14,7 @@ type Manga struct {
|
||||
Id int
|
||||
Title string
|
||||
TimeStampUnix int64
|
||||
Thumbnail *bytes.Buffer
|
||||
|
||||
// Not in DB
|
||||
LatestChapter *Chapter
|
||||
@@ -26,7 +29,7 @@ type Chapter struct {
|
||||
TimeStampUnix int64
|
||||
}
|
||||
|
||||
type DatabaseManager struct {
|
||||
type Manager struct {
|
||||
ConnectionString string
|
||||
db *sql.DB
|
||||
|
||||
@@ -37,8 +40,8 @@ type DatabaseManager struct {
|
||||
CreateIfNotExists bool
|
||||
}
|
||||
|
||||
func NewDatabase(connectionString string, createIfNotExists bool) DatabaseManager {
|
||||
return DatabaseManager{
|
||||
func NewDatabase(connectionString string, createIfNotExists bool) Manager {
|
||||
return Manager{
|
||||
ConnectionString: connectionString,
|
||||
Rw: &sync.Mutex{},
|
||||
Mangas: make(map[int]*Manga),
|
||||
@@ -47,7 +50,7 @@ func NewDatabase(connectionString string, createIfNotExists bool) DatabaseManage
|
||||
}
|
||||
}
|
||||
|
||||
func (dbMgr *DatabaseManager) Open() error {
|
||||
func (dbMgr *Manager) Open() error {
|
||||
db, err := sql.Open("sqlite3", dbMgr.ConnectionString)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -63,7 +66,7 @@ func (dbMgr *DatabaseManager) Open() error {
|
||||
return err
|
||||
}
|
||||
|
||||
func (dbMgr *DatabaseManager) Close() error {
|
||||
func (dbMgr *Manager) Close() error {
|
||||
err := dbMgr.db.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -75,11 +78,43 @@ func (dbMgr *DatabaseManager) Close() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (dbMgr *DatabaseManager) Save() error {
|
||||
func (dbMgr *Manager) Delete(mangaId int) error {
|
||||
db := dbMgr.db
|
||||
fmt.Println("Locking Rw in database.go:84")
|
||||
dbMgr.Rw.Lock()
|
||||
defer func() {
|
||||
fmt.Println("Unlocking Rw in database.go:87")
|
||||
dbMgr.Rw.Unlock()
|
||||
}()
|
||||
|
||||
_, err := db.Exec("DELETE from Chapter where MangaID = ?", mangaId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = db.Exec("DELETE from Manga where ID = ?", mangaId)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for i, chapter := range dbMgr.Chapters {
|
||||
if chapter.Manga.Id == mangaId {
|
||||
delete(dbMgr.Chapters, i)
|
||||
}
|
||||
}
|
||||
delete(dbMgr.Mangas, mangaId)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (dbMgr *Manager) Save() error {
|
||||
db := dbMgr.db
|
||||
|
||||
fmt.Println("Locking Rw in database.go:113")
|
||||
dbMgr.Rw.Lock()
|
||||
defer dbMgr.Rw.Unlock()
|
||||
defer func() {
|
||||
fmt.Println("Unlocking Rw in database.go:116")
|
||||
dbMgr.Rw.Unlock()
|
||||
}()
|
||||
for _, m := range dbMgr.Mangas {
|
||||
count := 0
|
||||
err := db.QueryRow("SELECT COUNT(*) FROM Manga where ID = ?", m.Id).Scan(&count)
|
||||
@@ -88,9 +123,16 @@ func (dbMgr *DatabaseManager) Save() error {
|
||||
}
|
||||
|
||||
if count == 0 {
|
||||
_, err := db.Exec("INSERT INTO Manga(ID, Title, TimeStampUnixEpoch) values(?, ?, ?)", m.Id, m.Title, m.TimeStampUnix)
|
||||
if err != nil {
|
||||
return err
|
||||
if m.Thumbnail != nil {
|
||||
_, err := db.Exec("INSERT INTO Manga(ID, Title, TimeStampUnixEpoch, Thumbnail) values(?, ?, ?, ?)", m.Id, m.Title, m.TimeStampUnix, m.Thumbnail.Bytes())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
_, err := db.Exec("INSERT INTO Manga(ID, Title, TimeStampUnixEpoch ) values(?, ?, ?)", m.Id, m.Title, m.TimeStampUnix)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
_, err := db.Exec("UPDATE Manga set Title = ?, TimeStampUnixEpoch = ? WHERE ID = ?", m.Title, m.TimeStampUnix, m.Id)
|
||||
@@ -126,16 +168,20 @@ func (dbMgr *DatabaseManager) Save() error {
|
||||
//go:embed createDb.sql
|
||||
var createSql string
|
||||
|
||||
func (dbMgr *DatabaseManager) createDatabaseIfNotExists() error {
|
||||
func (dbMgr *Manager) createDatabaseIfNotExists() error {
|
||||
_, err := dbMgr.db.Exec(createSql)
|
||||
return err
|
||||
}
|
||||
|
||||
func (dbMgr *DatabaseManager) load() error {
|
||||
func (dbMgr *Manager) load() error {
|
||||
db := dbMgr.db
|
||||
|
||||
fmt.Println("Locking Rw in database.go:180")
|
||||
dbMgr.Rw.Lock()
|
||||
defer dbMgr.Rw.Unlock()
|
||||
defer func() {
|
||||
fmt.Println("Unlocking Rw in database.go:183")
|
||||
dbMgr.Rw.Unlock()
|
||||
}()
|
||||
|
||||
rows, err := db.Query("SELECT * FROM Manga")
|
||||
if err != nil {
|
||||
@@ -144,7 +190,7 @@ func (dbMgr *DatabaseManager) load() error {
|
||||
|
||||
for rows.Next() {
|
||||
manga := Manga{}
|
||||
if err = rows.Scan(&manga.Id, &manga.Title, &manga.TimeStampUnix); err != nil {
|
||||
if err = rows.Scan(&manga.Id, &manga.Title, &manga.TimeStampUnix, &manga.Thumbnail); err != nil {
|
||||
return err
|
||||
}
|
||||
dbMgr.Mangas[manga.Id] = &manga
|
||||
|
||||
Reference in New Issue
Block a user