forked from MG-RAST/Shock
/
db.go
99 lines (85 loc) · 1.92 KB
/
db.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
package store
import (
"errors"
"fmt"
"github.com/MG-RAST/Shock/conf"
"labix.org/v2/mgo"
"labix.org/v2/mgo/bson"
"os"
"time"
)
const (
DbTimeout = time.Duration(time.Second * 1)
)
func init() {
InitDB()
}
type db struct {
Nodes *mgo.Collection
Session *mgo.Session
}
func InitDB() {
d, err := DBConnect()
defer d.Close()
if err != nil {
fmt.Fprintln(os.Stderr, "ERROR: no reachable mongodb servers")
os.Exit(1)
}
idIdx := mgo.Index{Key: []string{"id"}, Unique: true}
err = d.Nodes.EnsureIndex(idIdx)
if err != nil {
fmt.Fprintf(os.Stderr, "ERROR: fatal mongodb initialization error: %v", err)
os.Exit(1)
}
}
func DBConnect() (d *db, err error) {
session, err := mgo.DialWithTimeout(conf.MONGODB, DbTimeout)
if err != nil {
return
}
d = &db{Nodes: session.DB("ShockDB").C("Nodes"), Session: session}
return
}
func DropDB() (err error) {
d, err := DBConnect()
defer d.Close()
if err != nil {
return err
}
return d.Nodes.DropCollection()
}
func (d *db) Upsert(node *Node) (err error) {
_, err = d.Nodes.Upsert(bson.M{"id": node.Id}, &node)
return
}
func (d *db) FindById(id string, result *Node) (err error) {
err = d.Nodes.Find(bson.M{"id": id}).One(&result)
return
}
func (d *db) FindNodes(ids []string, results *[]*Node) (err error) {
err = d.Nodes.Find(bson.M{"id": bson.M{"$in": ids}}).All(results)
return
}
func (d *db) FindByIdAuth(id string, uuid string, result *Node) (err error) {
err = d.Nodes.Find(bson.M{"id": id}).One(&result)
if err != nil {
return
}
rights := result.Acl.check(uuid)
if !rights["read"] {
err = errors.New("User Unauthorized")
}
return
}
func (d *db) GetAll(q bson.M, results *Nodes) (err error) {
err = d.Nodes.Find(q).All(results)
return
}
func (d *db) GetAllLimitOffset(q bson.M, results *Nodes, limit int, offset int) (err error) {
err = d.Nodes.Find(q).Limit(limit).Skip(offset).All(results)
return
}
func (d *db) Close() {
d.Session.Close()
return
}