2024-08-30 18:02:07 +07:00
package main
import (
"context"
"database/sql"
"log"
2024-08-31 15:10:25 +07:00
"time"
2024-08-30 18:02:07 +07:00
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 ,
2024-08-31 15:10:25 +07:00
"torrent_name" TEXT NOT NULL ,
2024-08-30 18:02:07 +07:00
"category" TEXT ,
"indexer" TEXT ,
"type" TEXT ,
"title" TEXT ,
"season" TEXT ,
"episode" TEXT ,
"year" TEXT ,
"resolution" TEXT ,
"source" TEXT ,
2024-08-31 15:10:25 +07:00
"torrent_url" TEXT ,
"torrent_file" TEXT ,
"nfo_file" TEXT ,
"original_path" TEXT ,
2024-08-30 18:02:07 +07:00
"won" INTEGER ,
"prerace" INTEGER ,
2024-08-31 15:10:25 +07:00
"prerace_added_at" INTEGER ,
"race_started_at" INTEGER ,
"race_ended_at" INTEGER ,
2024-08-30 18:02:07 +07:00
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 {
2024-08-31 15:10:25 +07:00
// 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 != "" {
2024-08-30 18:02:07 +07:00
queryBuilder := sq .
Insert ( "races" ) .
2024-08-31 15:10:25 +07:00
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 ( ) ) ) .
2024-08-30 18:02:07 +07:00
Suffix ( "RETURNING id" ) . RunWith ( s . Db )
err := queryBuilder . QueryRow ( ) . Scan ( & r . ID )
if err != nil {
return err
}
2024-08-31 15:10:25 +07:00
log . Printf ( "Prerace [%s] from [%s] added to the database" , r . TorrentName , r . Indexer )
2024-08-30 18:02:07 +07:00
}
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
}
2024-08-31 15:10:25 +07:00
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
}