ictgj-voting/model.go

136 lines
2.9 KiB
Go

package main
import (
"errors"
"github.com/br0xen/boltease"
)
// model stores the current jam in memory, and has the ability to access archived dbs
type model struct {
bolt *boltease.DB
dbOpened int
dbFileName string
site *siteData // Configuration data for the site
jam *Gamejam // The currently active gamejam
clients []Client // Web clients that have connected to the server
clientsUpdated bool
}
// Update Flags: Which parts of the model need to be updated
const (
UpdateSiteData = iota
UpdateJamData
)
func NewModel() (*model, error) {
var err error
m := new(model)
m.dbFileName = DbName
if err = m.openDB(); err != nil {
return nil, errors.New("Unable to open DB: " + err.Error())
}
defer m.closeDB()
// Initialize the DB
if err = m.initDB(); err != nil {
return nil, errors.New("Unable to initialize DB: " + err.Error())
}
// Load the site data
m.site = NewSiteData(m)
if err = m.site.LoadFromDB(); err != nil {
// Error loading from the DB, set to defaults
def := NewSiteData(m)
m.site = def
}
// Load the jam data
if m.jam, err = m.LoadCurrentJam(); err != nil {
return nil, errors.New("Unable to load current jam: " + err.Error())
}
// Load web clients
m.clients = m.LoadAllClients()
return m, nil
}
func (m *model) openDB() error {
m.dbOpened += 1
if m.dbOpened == 1 {
var err error
m.bolt, err = boltease.Create(m.dbFileName, 0600, nil)
if err != nil {
return err
}
}
return nil
}
func (m *model) closeDB() error {
m.dbOpened -= 1
if m.dbOpened == 0 {
return m.bolt.CloseDB()
}
return nil
}
func (m *model) initDB() error {
var err error
if err = m.openDB(); err != nil {
return err
}
defer m.closeDB()
// Create the path to the bucket to store admin users
if err = m.bolt.MkBucketPath([]string{"users"}); err != nil {
return err
}
// Create the path to the bucket to store the web clients
if err = m.bolt.MkBucketPath([]string{"clients"}); err != nil {
return err
}
// Create the path to the bucket to store the current jam & teams
if err = m.bolt.MkBucketPath([]string{"jam", "teams"}); err != nil {
return err
}
// Create the path to the bucket to store the list of archived jams
if err = m.bolt.MkBucketPath([]string{"archive"}); err != nil {
return err
}
// Create the path to the bucket to store site config data
return m.bolt.MkBucketPath([]string{"site"})
}
// saveChanges saves any parts of the model that have been flagged as changed to the database
func (m *model) saveChanges() error {
var err error
if err = m.openDB(); err != nil {
return err
}
defer m.closeDB()
if m.site.NeedsSave() {
if err = m.site.SaveToDB(); err != nil {
return err
}
}
if m.jam.IsChanged {
if err = m.jam.SaveToDB(); err != nil {
return err
}
m.jam.IsChanged = false
}
if m.clientsUpdated {
if err = m.SaveAllClients(); err != nil {
return err
}
m.clientsUpdated = false
}
return nil
}