/
database.go
93 lines (77 loc) · 1.91 KB
/
database.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package main
import (
"log"
"os"
r "github.com/dancannon/gorethink"
)
// TODO load configuration instead of hard coding constants
const (
dbAddressEnv = "DBADDRESS"
dbNameEnv = "DBNAME"
gameTableEnv = "GAMETABLE"
)
type DBConfig struct {
Address string
Name string
GameTable string
Indexes []string
}
type DBSession struct {
S *r.Session
Config DBConfig
}
func defaultDBConfig() DBConfig {
return DBConfig{
Address: "localhost:28015",
Name: "test",
GameTable: "games",
Indexes: []string{"timestamp", "match_id"},
}
}
func (c *DBConfig) Setup() *DBSession {
if addr := os.Getenv(dbAddressEnv); addr != "" {
c.Address = addr
}
if name := os.Getenv(dbNameEnv); name != "" {
c.Name = name
}
if table := os.Getenv(gameTableEnv); table != "" {
c.GameTable = table
}
sess, err := r.Connect(r.ConnectOpts{
Address: c.Address,
Database: c.Name,
})
if err != nil {
log.Fatalf("RethinkDB Connection error: %s\n", err.Error())
}
// set session in DBConfig
dbs := &DBSession{S: sess, Config: *c}
// ensure named gameTable exists in database ...
dbs.CreateTable(c.GameTable)
// ... with the correct indexes
dbs.CreateIndexes(c.GameTable, c.Indexes)
return dbs
}
func (s *DBSession) CreateTable(name string, tableOpts ...r.TableCreateOpts) error {
opts := r.TableCreateOpts{}
if len(tableOpts) > 1 {
log.Fatalln("createTable only takes 0 or 1 arguments")
} else if len(tableOpts) == 1 {
opts = tableOpts[0]
}
return r.Db(s.Config.Name).TableCreate(name, opts).Exec(s.S)
}
func (s *DBSession) CreateIndexes(name string, indexes []string) []error {
errs := []error{}
for _, index := range indexes {
err := r.Table(s.Config.GameTable).IndexCreate(index, r.IndexCreateOpts{}).Exec(s.S)
if err != nil {
errs = append(errs, err)
}
}
return errs
}
func (s *DBSession) SaveGame(game Game) error {
return r.Table(s.Config.GameTable).Insert(game).Exec(s.S)
}