-
Notifications
You must be signed in to change notification settings - Fork 4
/
dbapi.go
163 lines (151 loc) · 4.11 KB
/
dbapi.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
152
153
154
155
156
157
158
159
160
161
162
163
package main
import (
"errors"
"log"
"strconv"
"strings"
"time"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)
// AddSchedule 함수는 DB에 Schedule 을 추가한다.
func AddSchedule(session *mgo.Session, s Schedule) error {
// DB에 추가되는 모든 시간은 UTC 시간을 가진다.
err := s.ToUTC()
if err != nil {
return err
}
// 데이터를 넣기전 Excel시간도 셋팅한다.
err = s.SetTimeNum()
if err != nil {
return err
}
session.SetMode(mgo.Monotonic, true)
c := session.DB(*flagDBName).C(s.Collection)
err = c.Insert(s)
if err != nil {
return err
}
return nil
}
// RmSchedule 함수는 DB에서 id가 일치하는 Schedule을 삭제한다.
func RmSchedule(session *mgo.Session, collection string, id bson.ObjectId) error {
session.SetMode(mgo.Monotonic, true)
c := session.DB(*flagDBName).C(collection)
err := c.RemoveId(id)
if err != nil {
return err
}
return nil
}
// allSchedules는 DB에서 전체 스케쥴 정보를 가져오는 함수입니다.
func allSchedules(session *mgo.Session, collection string) ([]Schedule, error) {
session.SetMode(mgo.Monotonic, true)
c := session.DB(*flagDBName).C(collection)
var result []Schedule
err := c.Find(bson.M{}).All(&result)
if err != nil {
return result, err
}
return result, nil
}
// SearchMonth 함수는 Collection, Year, Month을 입력받아 해당 월의 스케쥴을 반환한다.
func SearchMonth(session *mgo.Session, collection, year, month string) ([]Schedule, error) {
session.SetMode(mgo.Monotonic, true)
c := session.DB(*flagDBName).C(collection)
var results []Schedule
y, err := strconv.Atoi(year)
if err != nil {
return nil, err
}
m, err := strconv.Atoi(month)
if err != nil {
return nil, err
}
start, err := BeginningOfMonth(y, m)
if err != nil {
return nil, err
}
end, err := EndOfMonth(y, m)
if err != nil {
return nil, err
}
s, err := TimeToNum(start.Format(time.RFC3339))
if err != nil {
return nil, err
}
e, err := TimeToNum(end.Format(time.RFC3339))
if err != nil {
return nil, err
}
query := []bson.M{}
query = append(query, bson.M{"startnum": bson.M{"$gt": e}})
query = append(query, bson.M{"endnum": bson.M{"$lt": s}})
q := bson.M{"$nor": query}
err = c.Find(q).All(&results)
if err != nil {
return nil, err
}
return results, nil
}
//GetCollections 는 mongoDB의 모든 Collection 값을 가져온다.
func GetCollections(session *mgo.Session) ([]string, error) {
session.SetMode(mgo.Monotonic, true)
collections, err := session.DB(*flagDBName).CollectionNames()
if err != nil {
log.Println(err)
return nil, err
}
var results []string
for _, c := range collections {
if c == "system.indexs" { //mongodb의 기본 컬렉션. 제외한다.
continue
}
if strings.Contains(c, ".layers") { //collectionName.layers는 layer 정보를 담은 subdocument이다. 제외한다.
continue
}
results = append(results, c)
}
return results, nil
}
// GetLayers 함수는 DB Collection 에서 사용되는 모든 layer값을 반환한다.
func GetLayers(session *mgo.Session, collection string) ([]Layer, error) {
session.SetMode(mgo.Monotonic, true)
c := session.DB(*flagDBName).C(collection + ".layers")
var layers []Layer
err := c.Find(bson.M{}).All(&layers)
if err != nil {
return layers, err
}
return layers, nil
}
// AddLayer 함수는 Collection 에 layer를 추가한다.
func AddLayer(session *mgo.Session, collection string, l Layer) error {
session.SetMode(mgo.Monotonic, true)
c := session.DB(*flagDBName).C(collection + ".layers")
num, err := c.Find(bson.M{"name": l.Name}).Count()
if err != nil {
return err
}
if num > 0 {
return errors.New(l.Name + " layer가 존재합니다")
}
if !regexWebColor.MatchString(l.Color) {
return errors.New("#FFFFFF 형식의 컬러가 아닙니다")
}
err = c.Insert(l)
if err != nil {
return err
}
return nil
}
// RmLayer 는 이름이 name과 일치하는 layer를 삭제한다.
func RmLayer(session *mgo.Session, collection, name string) error {
session.SetMode(mgo.Monotonic, true)
c := session.DB(*flagDBName).C(collection + ".layers")
err := c.Remove(bson.M{"name": name})
if err != nil {
return nil
}
return nil
}