forked from facesea/banshee
/
db.go
117 lines (108 loc) · 2.4 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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright 2015 Eleme Inc. All rights reserved.
package storage
import (
"os"
"path"
"github.com/eleme/banshee/storage/admindb"
"github.com/eleme/banshee/storage/eventdb"
"github.com/eleme/banshee/storage/indexdb"
"github.com/eleme/banshee/storage/metricdb"
"github.com/eleme/banshee/util/log"
)
// DB file mode.
const filemode = 0755
// Child db filename.
const (
admindbFileName = "admin"
indexdbFileName = "index"
metricdbFileName = "metric"
eventdbFileName = "event"
)
// Options is to open DB.
type Options struct {
Period uint32
Expiration uint32
FilterOffset float64
}
// DB handles the storage on leveldb.
type DB struct {
// Child db
Admin *admindb.DB
Index *indexdb.DB
Metric *metricdb.DB
Event *eventdb.DB
}
// Open a DB by fileName and options.
func Open(fileName string, opts *Options) (*DB, error) {
// Create if not exist
_, err := os.Stat(fileName)
if os.IsNotExist(err) {
log.Debugf("create dir %s", fileName)
err := os.Mkdir(fileName, filemode)
if err != nil {
return nil, err
}
}
// Admindb.
db := new(DB)
db.Admin, err = admindb.Open(path.Join(fileName, admindbFileName))
if err != nil {
return nil, err
}
// Indexdb.
var indexdbOpts *indexdb.Options
if opts != nil {
indexdbOpts = &indexdb.Options{Expiration: opts.Expiration}
}
db.Index, err = indexdb.Open(path.Join(fileName, indexdbFileName), indexdbOpts)
if err != nil {
return nil, err
}
// Metricdb.
var options *metricdb.Options
if opts != nil {
options = &metricdb.Options{
Period: opts.Period,
Expiration: opts.Expiration,
FilterOffset: opts.FilterOffset,
}
}
db.Metric, err = metricdb.Open(path.Join(fileName, metricdbFileName), options)
if err != nil {
return nil, err
}
// Eventdb.
var eventdbOpts *eventdb.Options
if opts != nil {
eventdbOpts = &eventdb.Options{
Period: opts.Period,
Expiration: opts.Expiration,
}
}
db.Event, err = eventdb.Open(path.Join(fileName, eventdbFileName), eventdbOpts)
if err != nil {
return nil, err
}
log.Debugf("storage is opened successfully")
return db, nil
}
// Close a DB.
func (db *DB) Close() error {
// Admindb.
if err := db.Admin.Close(); err != nil {
return err
}
// Indexdb.
if err := db.Index.Close(); err != nil {
return err
}
// Metricdb.
if err := db.Metric.Close(); err != nil {
return err
}
// Eventdb.
if err := db.Event.Close(); err != nil {
return err
}
return nil
}