Fix the stupid DB functions and embed gorm instead.

This commit is contained in:
A. Svensson 2016-02-20 20:46:27 +01:00
parent 3dfee907c1
commit 5a10cdecd9
4 changed files with 32 additions and 27 deletions

View File

@ -9,25 +9,33 @@ import (
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
) )
func OpenSqliteDB(args ...interface{}) *gorm.DB { type DB struct {
*gorm.DB
}
func OpenSqliteDB(args ...interface{}) *DB {
var e error var e error
db, e := gorm.Open("sqlite3", args...) db, e := gorm.Open("sqlite3", args...)
check_error(e) check_error(e)
return &db return &DB{&db}
} }
func InitSchema(db *gorm.DB) { func (db *DB) InitSchema() {
db.AutoMigrate(&Server{}) db.AutoMigrate(&Server{})
db.AutoMigrate(&ServerPopulation{}) 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 var tmp []*Server
db.Order("players_current desc, last_updated desc, title").Find(&tmp) db.Order("players_current desc, last_updated desc, title").Find(&tmp)
return tmp return tmp
} }
func GetServer(db *gorm.DB, id int) (*Server, error) { func (db *DB) GetServer(id int) (*Server, error) {
var tmp Server var tmp Server
if db.First(&tmp, id).RecordNotFound() { if db.First(&tmp, id).RecordNotFound() {
return nil, fmt.Errorf("Server not found") return nil, fmt.Errorf("Server not found")
@ -35,24 +43,24 @@ func GetServer(db *gorm.DB, id int) (*Server, error) {
return &tmp, nil return &tmp, nil
} }
func GetOldServers(db *gorm.DB, ts time.Time) []*Server { func (db *DB) GetOldServers(ts time.Time) []*Server {
var tmp []*Server var tmp []*Server
db.Where("last_updated < ?", ts).Find(&tmp) db.Where("last_updated < ?", ts).Find(&tmp)
return 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{}) 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 var tmp []*ServerPopulation
t := time.Now().Add(-d) t := time.Now().Add(-d)
db.Order("timestamp desc, server_id").Where("server_id = ? and timestamp > ?", id, t).Find(&tmp) db.Order("timestamp desc, server_id").Where("server_id = ? and timestamp > ?", id, t).Find(&tmp)
return tmp return tmp
} }
func InsertOrSelect(db *gorm.DB, s *RawServerData) int { func (db *DB) InsertOrSelect(s *RawServerData) int {
var tmp Server var tmp Server
newserver := Server{ newserver := Server{
LastUpdated: s.Timestamp, LastUpdated: s.Timestamp,
@ -68,7 +76,7 @@ func InsertOrSelect(db *gorm.DB, s *RawServerData) int {
return tmp.ID return tmp.ID
} }
func AddServerPopulation(db *gorm.DB, id int, s *RawServerData) { func (db *DB) AddServerPopulation(id int, s *RawServerData) {
var tmp Server var tmp Server
db.Where("id = ?", id).First(&tmp) db.Where("id = ?", id).First(&tmp)
pop := ServerPopulation{ pop := ServerPopulation{
@ -79,7 +87,7 @@ func AddServerPopulation(db *gorm.DB, id int, s *RawServerData) {
db.Create(&pop) db.Create(&pop)
} }
func UpdateServerStats(db *gorm.DB, id int, s *RawServerData) { func (db *DB) UpdateServerStats(id int, s *RawServerData) {
var tmp Server var tmp Server
period := Now().Add(-time.Duration(30*24) * time.Hour) period := Now().Add(-time.Duration(30*24) * time.Hour)

View File

@ -5,13 +5,12 @@ import (
"time" "time"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
) )
type Instance struct { type Instance struct {
// Settings required by the user. // Settings required by the user.
Debug bool Debug bool
DB *gorm.DB DB *DB
// Internal stuff // Internal stuff
addr string addr string

View File

@ -3,8 +3,6 @@ package ss13
import ( import (
"fmt" "fmt"
"time" "time"
"github.com/jinzhu/gorm"
) )
var updatedservers []string var updatedservers []string
@ -22,7 +20,7 @@ type RawServerData struct {
func (i *Instance) UpdateServers() { func (i *Instance) UpdateServers() {
reset() reset()
tx := i.DB.Begin() tx := i.DB.NewTransaction()
config, err := LoadConfig(SERVERS_CONFIG) config, err := LoadConfig(SERVERS_CONFIG)
if err != nil { if err != nil {
@ -46,7 +44,7 @@ func (i *Instance) UpdateServers() {
if i.Debug { if i.Debug {
fmt.Println("\nRemoving old servers...") fmt.Println("\nRemoving old servers...")
} }
RemoveOldServers(tx, Now()) tx.RemoveOldServers(Now())
if i.Debug { if i.Debug {
fmt.Println("\nUpdating inactive servers...") fmt.Println("\nUpdating inactive servers...")
@ -79,7 +77,7 @@ func isupdated(title string) bool {
func (i *Instance) get_old_servers() []*RawServerData { func (i *Instance) get_old_servers() []*RawServerData {
var tmp []*RawServerData var tmp []*RawServerData
for _, old := range GetOldServers(i.DB, Now()) { for _, old := range i.DB.GetOldServers(Now()) {
s := RawServerData{ s := RawServerData{
Title: old.Title, Title: old.Title,
Game_url: old.GameUrl, Game_url: old.GameUrl,
@ -92,7 +90,7 @@ func (i *Instance) get_old_servers() []*RawServerData {
return tmp 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) { if isupdated(s.Title) {
return return
} }
@ -102,11 +100,11 @@ func (i *Instance) update_server(tx *gorm.DB, s *RawServerData) {
} }
// get server's db id (or create) // get server's db id (or create)
id := InsertOrSelect(tx, s) id := tx.InsertOrSelect(s)
// create new player history point // create new player history point
AddServerPopulation(tx, id, s) tx.AddServerPopulation(id, s)
// update server (urls and player stats) // update server (urls and player stats)
UpdateServerStats(tx, id, s) tx.UpdateServerStats(id, s)
} }

View File

@ -10,7 +10,7 @@ import (
) )
func (i *Instance) Init() { func (i *Instance) Init() {
InitSchema(i.DB) i.DB.InitSchema()
SetDebug(i.Debug) // TODO: get rid of this stupid debug thing 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) { 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{ c.HTML(http.StatusOK, "server_index.html", gin.H{
"pagetitle": "Index", "pagetitle": "Index",
"servers": servers, "servers": servers,
@ -64,7 +64,7 @@ func (i *Instance) server_index(c *gin.Context) {
func (i *Instance) server_detail(c *gin.Context) { func (i *Instance) server_detail(c *gin.Context) {
id, err := strconv.ParseInt(c.Param("server_id"), 10, 0) id, err := strconv.ParseInt(c.Param("server_id"), 10, 0)
check_error(err) check_error(err)
s, err := GetServer(i.DB, int(id)) s, err := i.DB.GetServer(int(id))
if err != nil { if err != nil {
// TODO // TODO
//c.HTML(http.StatusNotFound, "error_404.html", nil) //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{ c.HTML(http.StatusOK, "server_detail.html", gin.H{
"pagetitle": s.Title, "pagetitle": s.Title,
"server": s, "server": s,
"weekhistory": GetServerPopulation(i.DB, int(id), time.Duration(7*24+12)*time.Hour), "weekhistory": i.DB.GetServerPopulation(int(id), time.Duration(7*24+12)*time.Hour),
"monthhistory": GetServerPopulation(i.DB, int(id), time.Duration(31*24)*time.Hour), "monthhistory": i.DB.GetServerPopulation(int(id), time.Duration(31*24)*time.Hour),
"weekdayavg": weekdayavg, "weekdayavg": weekdayavg,
}) })
} }