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"
)
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)

View File

@ -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

View File

@ -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)
}

View File

@ -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,
})
}