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 }