diff --git a/src/db.go b/src/db.go index 9407325..5e432a1 100644 --- a/src/db.go +++ b/src/db.go @@ -9,25 +9,33 @@ import ( _ "github.com/mattn/go-sqlite3" ) -func OpenSqliteDB(args ...interface{}) *gorm.DB { +type DB struct { + *gorm.DB +} + +func OpenSqliteDB(args ...interface{}) *DB { var e error db, e := gorm.Open("sqlite3", args...) check_error(e) - return &db + return &DB{&db} } -func InitSchema(db *gorm.DB) { +func (db *DB) InitSchema() { db.AutoMigrate(&Server{}) db.AutoMigrate(&ServerPopulation{}) } -func AllServers(db *gorm.DB) []*Server { +func (db *DB) NewTransaction() *DB { + return &DB{db.Begin()} +} + +func (db *DB) AllServers() []*Server { var tmp []*Server db.Order("players_current desc, last_updated desc, title").Find(&tmp) return tmp } -func GetServer(db *gorm.DB, id int) (*Server, error) { +func (db *DB) GetServer(id int) (*Server, error) { var tmp Server if db.First(&tmp, id).RecordNotFound() { return nil, fmt.Errorf("Server not found") @@ -35,24 +43,24 @@ func GetServer(db *gorm.DB, id int) (*Server, error) { return &tmp, nil } -func GetOldServers(db *gorm.DB, ts time.Time) []*Server { +func (db *DB) GetOldServers(ts time.Time) []*Server { var tmp []*Server db.Where("last_updated < ?", ts).Find(&tmp) return tmp } -func RemoveOldServers(db *gorm.DB, ts time.Time) { +func (db *DB) RemoveOldServers(ts time.Time) { db.Where("last_updated < datetime(?, '-7 days')", ts).Delete(Server{}) } -func GetServerPopulation(db *gorm.DB, id int, d time.Duration) []*ServerPopulation { +func (db *DB) GetServerPopulation(id int, d time.Duration) []*ServerPopulation { var tmp []*ServerPopulation t := time.Now().Add(-d) db.Order("timestamp desc, server_id").Where("server_id = ? and timestamp > ?", id, t).Find(&tmp) return tmp } -func InsertOrSelect(db *gorm.DB, s *RawServerData) int { +func (db *DB) InsertOrSelect(s *RawServerData) int { var tmp Server newserver := Server{ LastUpdated: s.Timestamp, @@ -68,7 +76,7 @@ func InsertOrSelect(db *gorm.DB, s *RawServerData) int { return tmp.ID } -func AddServerPopulation(db *gorm.DB, id int, s *RawServerData) { +func (db *DB) AddServerPopulation(id int, s *RawServerData) { var tmp Server db.Where("id = ?", id).First(&tmp) pop := ServerPopulation{ @@ -79,7 +87,7 @@ func AddServerPopulation(db *gorm.DB, id int, s *RawServerData) { db.Create(&pop) } -func UpdateServerStats(db *gorm.DB, id int, s *RawServerData) { +func (db *DB) UpdateServerStats(id int, s *RawServerData) { var tmp Server period := Now().Add(-time.Duration(30*24) * time.Hour) diff --git a/src/models.go b/src/models.go index 9fa566e..d1fd7c6 100644 --- a/src/models.go +++ b/src/models.go @@ -5,13 +5,12 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/jinzhu/gorm" ) type Instance struct { // Settings required by the user. Debug bool - DB *gorm.DB + DB *DB // Internal stuff addr string diff --git a/src/updater.go b/src/updater.go index d41d34d..4d51af1 100644 --- a/src/updater.go +++ b/src/updater.go @@ -3,8 +3,6 @@ package ss13 import ( "fmt" "time" - - "github.com/jinzhu/gorm" ) var updatedservers []string @@ -22,7 +20,7 @@ type RawServerData struct { func (i *Instance) UpdateServers() { reset() - tx := i.DB.Begin() + tx := i.DB.NewTransaction() config, err := LoadConfig(SERVERS_CONFIG) if err != nil { @@ -46,7 +44,7 @@ func (i *Instance) UpdateServers() { if i.Debug { fmt.Println("\nRemoving old servers...") } - RemoveOldServers(tx, Now()) + tx.RemoveOldServers(Now()) if i.Debug { fmt.Println("\nUpdating inactive servers...") @@ -79,7 +77,7 @@ func isupdated(title string) bool { func (i *Instance) get_old_servers() []*RawServerData { var tmp []*RawServerData - for _, old := range GetOldServers(i.DB, Now()) { + for _, old := range i.DB.GetOldServers(Now()) { s := RawServerData{ Title: old.Title, Game_url: old.GameUrl, @@ -92,7 +90,7 @@ func (i *Instance) get_old_servers() []*RawServerData { return tmp } -func (i *Instance) update_server(tx *gorm.DB, s *RawServerData) { +func (i *Instance) update_server(tx *DB, s *RawServerData) { if isupdated(s.Title) { return } @@ -102,11 +100,11 @@ func (i *Instance) update_server(tx *gorm.DB, s *RawServerData) { } // get server's db id (or create) - id := InsertOrSelect(tx, s) + id := tx.InsertOrSelect(s) // create new player history point - AddServerPopulation(tx, id, s) + tx.AddServerPopulation(id, s) // update server (urls and player stats) - UpdateServerStats(tx, id, s) + tx.UpdateServerStats(id, s) } diff --git a/src/web.go b/src/web.go index 0cd1705..61130dc 100644 --- a/src/web.go +++ b/src/web.go @@ -10,7 +10,7 @@ import ( ) func (i *Instance) Init() { - InitSchema(i.DB) + i.DB.InitSchema() SetDebug(i.Debug) // TODO: get rid of this stupid debug thing } @@ -54,7 +54,7 @@ func (i *Instance) Serve(addr string) error { } func (i *Instance) server_index(c *gin.Context) { - servers := AllServers(i.DB) + servers := i.DB.AllServers() c.HTML(http.StatusOK, "server_index.html", gin.H{ "pagetitle": "Index", "servers": servers, @@ -64,7 +64,7 @@ func (i *Instance) server_index(c *gin.Context) { func (i *Instance) server_detail(c *gin.Context) { id, err := strconv.ParseInt(c.Param("server_id"), 10, 0) check_error(err) - s, err := GetServer(i.DB, int(id)) + s, err := i.DB.GetServer(int(id)) if err != nil { // TODO //c.HTML(http.StatusNotFound, "error_404.html", nil) @@ -87,8 +87,8 @@ func (i *Instance) server_detail(c *gin.Context) { c.HTML(http.StatusOK, "server_detail.html", gin.H{ "pagetitle": s.Title, "server": s, - "weekhistory": GetServerPopulation(i.DB, int(id), time.Duration(7*24+12)*time.Hour), - "monthhistory": GetServerPopulation(i.DB, int(id), time.Duration(31*24)*time.Hour), + "weekhistory": i.DB.GetServerPopulation(int(id), time.Duration(7*24+12)*time.Hour), + "monthhistory": i.DB.GetServerPopulation(int(id), time.Duration(31*24)*time.Hour), "weekdayavg": weekdayavg, }) }