-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpsqlstorage.go
151 lines (119 loc) · 2.72 KB
/
psqlstorage.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package poker
import (
"database/sql"
"errors"
"fmt"
"log"
_ "github.com/lib/pq"
)
const (
host = "localhost"
port = 5432
user = "postgres"
password = "passwd"
dbname = "gotestdb"
)
func ConnectDB() (*sql.DB, error) {
connString := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable", user, password, host, port, dbname)
db, err := sql.Open("postgres", connString)
if err != nil {
return nil, err
}
if err := db.Ping(); err != nil {
return nil, err
}
return db, nil
}
func CreateTable(db *sql.DB, temp bool) error {
var temptable string
if temp {
temptable = "temp"
}
query := fmt.Sprintf(`Create %s table if not exists League (
name varchar(25) PRIMARY KEY,
wins integer DEFAULT 0
);`, temptable)
_, err := db.Exec(query)
if err != nil {
return err
}
return nil
}
func InsertPlayer(db *sql.DB, player Player) error {
query := `INSERT INTO League (name, wins) values ($1, $2)`
_, err := db.Exec(query, player.Name, player.Wins)
if err != nil {
return err
}
return nil
}
func ReadLeague(db *sql.DB) ([]Player, error) {
query := `SELECT name, wins from League ORDER BY wins desc`
rows, err := db.Query(query)
if err != nil {
return []Player{}, nil
}
defer rows.Close()
var name string
var wins int
res := []Player{}
for rows.Next() {
err := rows.Scan(&name, &wins)
if err != nil {
return []Player{}, nil
}
res = append(res, Player{Name: name, Wins: wins})
}
return res, nil
}
func UpdateValues(db *sql.DB, playerName string) error {
score, _ := GetScore(db, playerName)
if score == 0 {
InsertPlayer(db, Player{
Name: playerName,
Wins: 0,
})
}
query := "UPDATE League SET wins=wins+1 where name=$1"
_, err := db.Exec(query, playerName)
return err
}
func GetScore(db *sql.DB, playerName string) (int, error) {
query := "SELECT wins from League where name=$1"
row := db.QueryRow(query, playerName)
var score int
row.Scan(&score)
if score == 0 {
return 0, errors.New("Player Does not Exist")
}
return score, nil
}
type DBStorage struct {
db *sql.DB
}
func (storage *DBStorage) GetScore(player string) (int, error) {
return GetScore(storage.db, player)
}
func (storage *DBStorage) RecordWin(player string) error {
return UpdateValues(storage.db, player)
}
func (storage *DBStorage) GetLeague() []Player {
res, _ := ReadLeague(storage.db)
return res
}
func NewDBStorage(test bool) (*DBStorage, func(str *DBStorage), error) {
db, err := ConnectDB()
if err != nil {
return nil, func(str *DBStorage) {}, err
}
if err := CreateTable(db, test); err != nil {
return nil, func(str *DBStorage) {}, err
}
disconnect := func(str *DBStorage) {
log.Println("Closing DB")
str.db.Close()
}
return &DBStorage{
db: db,
}, disconnect, nil
}