/
database.go
110 lines (96 loc) · 2.13 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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package main
import (
"flag"
r "github.com/dancannon/gorethink"
"log"
)
var session *r.Session = nil
var db = flag.String("db", "test", "Database name in RethinkDB")
var urlTable = flag.String("table", "urls", "Table name to store URLs in")
func setupRethinkDB() {
flag.Parse()
sess, err := r.Connect(r.ConnectOpts{
Address: "localhost:28015",
Database: *db,
})
if err != nil {
log.Fatalf("RethinkDB Connection error: %s\n", err.Error())
}
session = sess
// ensure named urlTable exists in database
createTable(*urlTable)
}
func createTable(name string) error {
ensureSession()
// TODO return the object in a useable format instead of just the error
// object, error
_, err := r.Db(*db).TableCreate(name).Run(session)
return err
}
type UrlMap struct {
Id string `gorethink:"id,omitempty"`
Url string `gorethink:"url"`
Hits int `gorethink:"hits"`
}
func saveShortenedUrl(url string) (string, error) {
ensureSession()
var key string
for {
key = randomString(10)
c, _ := getShortenedUrlCursor(key)
if c.IsNil() {
break
}
}
ins := UrlMap{
Url: url,
Id: key,
}
_, err := r.Table(urlTable).Insert(ins).Run(session)
return key, err
}
func getShortenedUrl(key string) UrlMap {
ensureSession()
c, err := getShortenedUrlCursor(key)
if err != nil {
log.Fatalln(err.Error())
}
urlMap, err2 := packageCursorToUrl(c)
if err2 != nil {
log.Fatalln(err2.Error())
}
err3 := addHitToUrl(urlMap)
if err3 != nil {
log.Fatalln(err3.Error())
}
return urlMap
}
func getShortenedUrlCursor(key string) (*r.Cursor, error) {
cursor, err := r.Table(*urlTable).Get(key).Run(session)
return cursor, err
}
func packageCursorToUrl(c *r.Cursor) (UrlMap, error) {
rows := []UrlMap{}
err := c.All(&rows)
return rows[0], err
}
func addHitToUrl(u UrlMap) error {
u.Hits += 1
_, err := r.Table(urlTable).Get(u.Id).Update(u).Run(session)
return err
}
func getAllUrls() ([]UrlMap, error) {
ensureSession()
c, err := r.Table(urlTable).Run(session)
if err != nil {
log.Fatalln(err.Error())
}
rows := []UrlMap{}
err2 := c.All(&rows)
return rows, err2
}
func ensureSession() {
if session == nil {
setupRethinkDB()
}
}