diff --git a/.gitignore b/.gitignore index fe97be4..5871479 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ _testmain.go *.exe *.test *.db +*.out diff --git a/database.go b/database.go index 1669a65..9c26a00 100644 --- a/database.go +++ b/database.go @@ -15,9 +15,10 @@ import ( const migrationsDir = "db/migrations" type Database struct { - path string - db *sql.DB - teamMap *modl.DbMap + path string + db *sql.DB + eventSettingsMap *modl.DbMap + teamMap *modl.DbMap } // Opens the SQLite database at the given path, creating it if it doesn't exist, and runs any pending @@ -55,4 +56,7 @@ func (database *Database) mapTables() { database.teamMap = modl.NewDbMap(database.db, dialect) database.teamMap.AddTableWithName(Team{}, "teams").SetKeys(false, "Id") + + database.eventSettingsMap = modl.NewDbMap(database.db, dialect) + database.eventSettingsMap.AddTableWithName(EventSettings{}, "event_settings").SetKeys(false, "Id") } diff --git a/database_test.go b/database_test.go index 78aaa34..cc78291 100644 --- a/database_test.go +++ b/database_test.go @@ -4,9 +4,16 @@ package main import ( + "os" "testing" ) +const testDbPath = "test.db" + +func clearDb() { + os.Remove(testDbPath) +} + func TestOpenUnreachableDatabase(t *testing.T) { _, err := OpenDatabase("nonexistentdir/test.db") if err == nil { diff --git a/db/dbconf.yml b/db/dbconf.yml new file mode 100644 index 0000000..ec359db --- /dev/null +++ b/db/dbconf.yml @@ -0,0 +1,4 @@ +# This file must exist to be able to create migration boilerplate with `goose create MigrationName sql`. +development: + driver: sqlite3 + open: placeholder.db # Doesn't matter what this value is; the file won't be created. diff --git a/db/migrations/20140524160241_CreateEventSettings.sql b/db/migrations/20140524160241_CreateEventSettings.sql new file mode 100644 index 0000000..7f6b8f7 --- /dev/null +++ b/db/migrations/20140524160241_CreateEventSettings.sql @@ -0,0 +1,9 @@ +-- +goose Up +CREATE TABLE event_settings ( + id INTEGER PRIMARY KEY, + name VARCHAR(255), + code VARCHAR(16) +); + +-- +goose Down +DROP TABLE event_settings; diff --git a/event_settings.go b/event_settings.go new file mode 100644 index 0000000..dfda084 --- /dev/null +++ b/event_settings.go @@ -0,0 +1,34 @@ +// Copyright 2014 Team 254. All Rights Reserved. +// Author: pat@patfairbank.com (Patrick Fairbank) +// +// Model and datastore read/write methods for event-level configuration. + +package main + +type EventSettings struct { + Id int + Name string + Code string +} + +const eventSettingsId = 0 + +func (database *Database) GetEventSettings() (*EventSettings, error) { + eventSettings := new(EventSettings) + err := database.eventSettingsMap.Get(eventSettings, eventSettingsId) + if err != nil { + // Database record doesn't exist yet; create it now. + err = database.eventSettingsMap.Insert(eventSettings) + if err != nil { + return nil, err + } + return new(EventSettings), nil + } + return eventSettings, nil +} + +func (database *Database) SaveEventSettings(eventSettings *EventSettings) error { + eventSettings.Id = eventSettingsId + _, err := database.eventSettingsMap.Update(eventSettings) + return err +} diff --git a/event_settings_test.go b/event_settings_test.go new file mode 100644 index 0000000..040f9ae --- /dev/null +++ b/event_settings_test.go @@ -0,0 +1,37 @@ +// Copyright 2014 Team 254. All Rights Reserved. +// Author: pat@patfairbank.com (Patrick Fairbank) + +package main + +import ( + "testing" +) + +func TestEventSettingsReadWrite(t *testing.T) { + clearDb() + defer clearDb() + + db, _ := OpenDatabase(testDbPath) + defer db.Close() + eventSettings, err := db.GetEventSettings() + if err != nil { + t.Error("Error:", err) + } + if *eventSettings != *new(EventSettings) { + t.Errorf("Expected blank event settings, got %v", eventSettings) + } + + eventSettings.Name = "Chezy Champs" + eventSettings.Code = "cc" + err = db.SaveEventSettings(eventSettings) + if err != nil { + t.Error("Error:", err) + } + eventSettings2, err := db.GetEventSettings() + if err != nil { + t.Error("Error:", err) + } + if *eventSettings2 != *eventSettings { + t.Errorf("Expected '%v', got '%v'", eventSettings, eventSettings2) + } +} diff --git a/team.go b/team.go index 9068251..8bcbcc1 100644 --- a/team.go +++ b/team.go @@ -5,8 +5,6 @@ package main -import () - type Team struct { Id int Name string diff --git a/team_test.go b/team_test.go index cdad9c3..a3ca91c 100644 --- a/team_test.go +++ b/team_test.go @@ -4,16 +4,9 @@ package main import ( - "os" "testing" ) -const testDbPath = "test.db" - -func clearDb() { - os.Remove(testDbPath) -} - func TestGetNonexistentTeam(t *testing.T) { clearDb() defer clearDb()