This repository has been archived by the owner on Oct 17, 2019. It is now read-only.
/
configurable.go
114 lines (99 loc) · 2.26 KB
/
configurable.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
package tcb
import (
"errors"
"github.com/couchbase/gocb"
)
var (
// ErrBucketMissing Constant error for Missing bucket
ErrBucketMissing error = errors.New("bucket is missing")
)
// Configure struct for config
type Configure struct {
ConnectString string
User string
Password string
BucketConfigs []BucketConfig
}
// Cluster to connect couchbase
type Cluster struct {
Configure
Logger
cluster *gocb.Cluster
bucketMap map[string]*gocb.Bucket
}
// BucketConfig tuple for bucket connection
type BucketConfig struct {
Name string
Password string
}
// NewCluster return new instance
func NewCluster(c Configure) *Cluster {
bm := make(map[string]*gocb.Bucket)
return &Cluster{Configure: c, Logger: NewDefaultActiveLogger(), bucketMap: bm}
}
// Open call this to open cluster connection
func (a *Cluster) Open() error {
cluster, err := gocb.Connect(a.ConnectString)
if err != nil {
return err
}
if a.User != "" {
_ = cluster.Authenticate(gocb.PasswordAuthenticator{
Username: a.User,
Password: a.Password,
})
}
a.cluster = cluster
for _, b := range a.BucketConfigs {
if _, err := a.AddBucket(b.Name, b.Password); err != nil {
return err
}
}
return nil
}
// Close closes specified bucket
func (a *Cluster) Close(bucket string) error {
b := a.Bucket(bucket)
if b == nil {
return ErrBucketMissing
}
return b.Close()
}
// CloseAll closes all buckets
func (a *Cluster) CloseAll() error {
for name := range a.bucketMap {
if err := a.Close(name); err != nil {
return err
}
}
return nil
}
// Cluster return inner cluster instance
func (a *Cluster) Cluster() *gocb.Cluster {
return a.cluster
}
// AddBucket add a bucket to
func (a *Cluster) AddBucket(bucket, password string) (*gocb.Bucket, error) {
if b, ok := a.bucketMap[bucket]; ok {
return b, nil
}
b, err := a.cluster.OpenBucket(bucket, password)
if err != nil {
return nil, err
}
a.bucketMap[bucket] = b
return b, nil
}
// Bucket return from bucketmap
func (a *Cluster) Bucket(bucket string) *gocb.Bucket {
b, _ := a.bucketMap[bucket]
return b
}
// Operator return operator instance
func (a *Cluster) Operator(bucket string) (Operator, error) {
b := a.Bucket(bucket)
if b == nil {
return nil, ErrBucketMissing
}
return NewBucketOperator(b, a.Logger), nil
}