2014-05-24 00:39:22 -07:00
|
|
|
// Copyright 2014 Team 254. All Rights Reserved.
|
|
|
|
|
// Author: pat@patfairbank.com (Patrick Fairbank)
|
|
|
|
|
//
|
2021-05-12 18:20:01 -07:00
|
|
|
// Functions for manipulating the per-event Bolt datastore.
|
2014-05-24 00:39:22 -07:00
|
|
|
|
2017-08-23 22:41:56 -07:00
|
|
|
package model
|
2014-05-24 00:39:22 -07:00
|
|
|
|
|
|
|
|
import (
|
2014-08-28 19:32:18 -07:00
|
|
|
"fmt"
|
2021-05-12 17:49:05 -07:00
|
|
|
"github.com/Team254/cheesy-arena-lite/game"
|
2021-05-09 20:46:35 -07:00
|
|
|
"go.etcd.io/bbolt"
|
2014-08-28 19:32:18 -07:00
|
|
|
"io"
|
|
|
|
|
"os"
|
2017-08-23 22:41:56 -07:00
|
|
|
"path/filepath"
|
2014-08-28 19:32:18 -07:00
|
|
|
"strings"
|
|
|
|
|
"time"
|
2014-05-24 00:39:22 -07:00
|
|
|
)
|
|
|
|
|
|
2014-08-28 19:32:18 -07:00
|
|
|
const backupsDir = "db/backups"
|
2014-05-24 00:39:22 -07:00
|
|
|
|
2017-08-28 20:14:32 -07:00
|
|
|
var BaseDir = "." // Mutable for testing
|
|
|
|
|
|
2014-05-24 00:39:22 -07:00
|
|
|
type Database struct {
|
2021-05-12 16:40:07 -07:00
|
|
|
Path string
|
|
|
|
|
bolt *bbolt.DB
|
|
|
|
|
allianceTeamTable *table
|
|
|
|
|
awardTable *table
|
|
|
|
|
eventSettingsTable *table
|
|
|
|
|
lowerThirdTable *table
|
|
|
|
|
matchTable *table
|
|
|
|
|
matchResultTable *table
|
2021-05-12 17:49:05 -07:00
|
|
|
rankingTable *table
|
2021-05-12 18:20:01 -07:00
|
|
|
scheduleBlockTable *table
|
|
|
|
|
sponsorSlideTable *table
|
2021-05-12 17:49:05 -07:00
|
|
|
teamTable *table
|
2021-05-12 18:20:01 -07:00
|
|
|
userSessionTable *table
|
2014-05-24 00:39:22 -07:00
|
|
|
}
|
|
|
|
|
|
2021-05-12 18:20:01 -07:00
|
|
|
// Opens the Bolt database at the given path, creating it if it doesn't exist.
|
2017-08-28 20:14:32 -07:00
|
|
|
func OpenDatabase(filename string) (*Database, error) {
|
2017-08-31 23:26:22 -07:00
|
|
|
database := Database{Path: filename}
|
2021-05-12 18:20:01 -07:00
|
|
|
var err error
|
|
|
|
|
database.bolt, err = bbolt.Open(database.Path, 0644, &bbolt.Options{NoSync: true, Timeout: time.Second})
|
2021-05-09 20:46:35 -07:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Register tables.
|
2021-05-12 16:40:07 -07:00
|
|
|
if database.allianceTeamTable, err = database.newTable(AllianceTeam{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if database.awardTable, err = database.newTable(Award{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if database.eventSettingsTable, err = database.newTable(EventSettings{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if database.lowerThirdTable, err = database.newTable(LowerThird{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if database.matchTable, err = database.newTable(Match{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if database.matchResultTable, err = database.newTable(MatchResult{}); err != nil {
|
|
|
|
|
return nil, err
|
2021-05-09 20:46:35 -07:00
|
|
|
}
|
2021-05-12 17:49:05 -07:00
|
|
|
if database.rankingTable, err = database.newTable(game.Ranking{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2021-05-12 18:20:01 -07:00
|
|
|
if database.scheduleBlockTable, err = database.newTable(ScheduleBlock{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
if database.sponsorSlideTable, err = database.newTable(SponsorSlide{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2021-05-12 17:49:05 -07:00
|
|
|
if database.teamTable, err = database.newTable(Team{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2021-05-12 18:20:01 -07:00
|
|
|
if database.userSessionTable, err = database.newTable(UserSession{}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2021-05-09 20:46:35 -07:00
|
|
|
|
2014-05-24 00:39:22 -07:00
|
|
|
return &database, nil
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-09 21:12:23 -07:00
|
|
|
func (database *Database) Close() error {
|
|
|
|
|
return database.bolt.Close()
|
2014-05-24 00:39:22 -07:00
|
|
|
}
|
|
|
|
|
|
2014-08-28 19:32:18 -07:00
|
|
|
// Creates a copy of the current database and saves it to the backups directory.
|
2017-08-23 22:41:56 -07:00
|
|
|
func (database *Database) Backup(eventName, reason string) error {
|
2017-08-28 20:14:32 -07:00
|
|
|
backupsPath := filepath.Join(BaseDir, backupsDir)
|
2017-08-23 22:41:56 -07:00
|
|
|
err := os.MkdirAll(backupsPath, 0755)
|
2014-08-28 19:32:18 -07:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
2017-08-23 22:41:56 -07:00
|
|
|
filename := fmt.Sprintf("%s/%s_%s_%s.db", backupsPath, strings.Replace(eventName, " ", "_", -1),
|
2014-08-28 21:44:22 -07:00
|
|
|
time.Now().Format("20060102150405"), reason)
|
2017-08-31 23:26:22 -07:00
|
|
|
src, err := os.Open(database.Path)
|
2014-08-28 19:32:18 -07:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer src.Close()
|
|
|
|
|
dest, err := os.Create(filename)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer dest.Close()
|
|
|
|
|
if _, err := io.Copy(dest, src); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|