137 lines
3.1 KiB
Go
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
|
|
}
|