/
repo.go
102 lines (96 loc) · 2.87 KB
/
repo.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
package main
import (
"database/sql"
"fmt"
"os"
"time"
)
func RebuildDB() error {
err := os.Remove(Config.Dbname)
if err != nil {
fmt.Println(err)
}
//sqlite doesn't require autoincrement on id's (integer primary key auto assigns an unused random rowid if empty)
sqlStmt := "create table user (id integer not null primary key, email text, hashword text, rank integer, since text);" +
"create table character (id integer not null primary key, user_id integer, name text, image text, stats_json text, date_modified text);"
_, err = Db.Exec(sqlStmt)
if err != nil {
return err
}
fmt.Println("Database created.")
return nil
}
func PopulateDB(){
users := []User{NewUser("danmondy@gmail.com", "happy", 3), NewUser("josh@gmail.com", "happy", 3)}
for _, u := range users{
err := InsertUser(&u);
if err != nil{
fmt.Println(err)
}
}
}
//COMMON
func TimeToString(t time.Time) string {
return t.Format(time.RFC3339)
}
func StringToTime(s string) (time.Time, error) {
return time.Parse(time.RFC3339, s) //returns both a time and an error so it can be returned directly.
}
//USERS
func GetUserById(id int) (*User, error) {
query := "SELECT * FROM user WHERE Id = ?"
row := Db.QueryRow(query, id)
return MapUser(row)
}
func InsertUser(u *User) error {
_, err := Db.Exec(fmt.Sprintf("INSERT into user (email, hashword, rank, since) VALUES ('%v', '%v', '%v', '%v')", u.Email, u.Hashword, u.Rank, TimeToString(u.Since)))
if err != nil {
return err
}
return nil
}
func GetUserByEmail(email string) (*User, error) {
query := "SELECT * FROM user WHERE EMAIL = ?"
row := Db.QueryRow(query, email)
return MapUser(row)
}
func MapUser(r *sql.Row) (*User, error) {
var u User
var t string
err := r.Scan(&u.Id, &u.Email, &u.Hashword, &u.Rank, &t)
if err != nil {
return nil, err
}
u.Since, err = StringToTime(t)
return &u, err
}
//END USERS
//Characters
func GetCharById(id int) (*Character, error) {
query := "SELECT * FROM character WHERE Id = ?"
row := Db.QueryRow(query, id)
return MapChar(row)
}
func InsertChar(c *Character) (sql.Result, error) {
result, err := Db.Exec(fmt.Sprintf("INSERT into character (user_id, name, stats_json, image, date_modified) VALUES ('%s', '%s', '%s', '%s', '%s')", c.UserId, c.Name, c.StatsJson, c.Image, TimeToString(time.Now())))
if err != nil {
return result, err
}
id, _ := result.LastInsertId()//TODO: uncaught error (not sure best way to handle this guy)
c.Id = id
return result, err
}
func UpdateChar(c Character) (sql.Result, error) {
return Db.Exec(fmt.Sprintf("UPDATE character SET name=%s, stats_json=%s, image=%s, date_modified=%v", c.Name, c.StatsJson, c.Image, c.DateModified))
}
func MapChar(r *sql.Row) (*Character, error) {
var c Character
var t string
err := r.Scan(&c.Id, &c.UserId, &c.Name, &c.Image, &c.StatsJson, &t)
if err != nil {
return nil, err
}
c.DateModified, err = StringToTime(t)
return &c, err
}
//End Characters