GoRacerr/database.go
2024-08-31 15:10:25 +07:00

137 lines
3.1 KiB
Go

package main
import (
"context"
"database/sql"
"log"
"time"
sq "github.com/Masterminds/squirrel"
_ "github.com/mattn/go-sqlite3"
)
type Database interface {
CreatePreRace(*Race) error
DeletePreRace(int) error
UpdatePreRace(int) error
GetPreRaceByID(int) (*Race, error)
GetPreRaces() ([]*Race, error)
}
type SQLiteDatabase struct {
Db *sql.DB
}
func NewSQLiteDatabase(cfg Config) (*SQLiteDatabase, error) {
db, err := sql.Open("sqlite3", cfg.DBName)
if err != nil {
return nil, err
}
log.Println("Opening SQLite database")
_, err = db.ExecContext(
context.Background(),
`CREATE TABLE IF NOT EXISTS "races" (
"id" INTEGER NOT NULL UNIQUE,
"torrent_name" TEXT NOT NULL,
"category" TEXT,
"indexer" TEXT,
"type" TEXT,
"title" TEXT,
"season" TEXT,
"episode" TEXT,
"year" TEXT,
"resolution" TEXT,
"source" TEXT,
"torrent_url" TEXT,
"torrent_file" TEXT,
"nfo_file" TEXT,
"original_path" TEXT,
"won" INTEGER,
"prerace" INTEGER,
"prerace_added_at" INTEGER,
"race_started_at" INTEGER,
"race_ended_at" INTEGER,
PRIMARY KEY("ID" AUTOINCREMENT)
)`,
)
if err != nil {
log.Panicln("Cannot create table", err)
}
return &SQLiteDatabase{
Db: db,
}, nil
}
func (s *SQLiteDatabase) CreatePreRace(r *Race) error {
// Search if release has been raced already
prevRace := s.FindRelease(r.TorrentName, r.Indexer)
if len(prevRace.TorrentName) > 0 {
log.Printf("Found a race for %s on %s", prevRace.TorrentName, prevRace.Indexer)
}
if r.Type == "movie" || r.Type == "episode" && prevRace.TorrentName != "" {
queryBuilder := sq.
Insert("races").
Columns("torrent_name", "category", "indexer", "type", "title", "season", "episode", "year", "resolution", "source", "torrent_url", "won", "prerace", "prerace_added_at").
Values(r.TorrentName, r.Category, r.Indexer, r.Type, r.Title, r.Season, r.Episode, r.Year, r.Resolution, r.Source, r.TorrentURL, r.Won, r.PreRace, time.Time.Unix(time.Now())).
Suffix("RETURNING id").RunWith(s.Db)
err := queryBuilder.QueryRow().Scan(&r.ID)
if err != nil {
return err
}
log.Printf("Prerace [%s] from [%s] added to the database", r.TorrentName, r.Indexer)
}
return nil
}
func (s *SQLiteDatabase) DeletePreRace(*Race) error {
return nil
}
func (s *SQLiteDatabase) UpdatePreRace(*Race) error {
return nil
}
func (s *SQLiteDatabase) GetPreRaceByID(*Race) error {
return nil
}
func (s *SQLiteDatabase) GetPreRaces(*Race) error {
return nil
}
func (s *SQLiteDatabase) FindReleases(releaseName string) ([]Race, error) {
var races []Race
rows, err := s.Db.Query("SELECT ID, torrent_name, indexer FROM races WHERE torrent_name=?", releaseName)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var race Race
if err := rows.Scan(
&race.ID, &race.TorrentName, &race.Indexer,
); err != nil {
return nil, err
}
races = append(races, race)
}
return races, err
}
func (s *SQLiteDatabase) FindRelease(releaseName string, indexer string) Race {
var race Race
s.Db.QueryRow("SELECT ID, torrent_name, indexer FROM races WHERE torrent_name=? AND indexer=?", releaseName, indexer).Scan(&race.ID, &race.TorrentName, &race.Indexer)
return race
}