g2i/g2i/storage.go
2019-03-16 16:26:56 +03:00

245 lines
4.2 KiB
Go

package g2i
import (
"encoding/json"
"fmt"
"os"
"strconv"
"github.com/boltdb/bolt"
"github.com/google/go-github/github"
log "github.com/sirupsen/logrus"
)
const (
ISSUES_KEY = "issues"
ISSUES_BUCKET = "issues_bucket"
EVENTS_KEY = "events"
EVENTS_BUCKET = "events_bucket"
HELLO_BUCKET = "hello_bucket"
HELLO_KEY = "hello_sended"
)
func (c *Config) isHelloSent() bool {
err := c.Data.db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(HELLO_BUCKET))
if bucket == nil {
return fmt.Errorf("Bucket not created yet")
}
data := bucket.Get([]byte(HELLO_KEY))
if string(data) == "1" {
return nil
}
return fmt.Errorf("Wrong value")
})
if err != nil {
return false
}
return true
}
func (c *Config) storeHello() error {
if err := c.checkDB(); err != nil {
return err
}
err := c.Data.db.Update(func(tx *bolt.Tx) error {
bucket, err := tx.CreateBucketIfNotExists([]byte(HELLO_BUCKET))
if err != nil {
return err
}
err = bucket.Put([]byte(HELLO_KEY), []byte("1"))
if err != nil {
return err
}
return nil
})
return err
}
func (c *Config) storeEvents(events []github.Event) error {
if err := c.checkDB(); err != nil {
return err
}
log.Info("Store events in the DB")
data, err := json.Marshal(events)
if err != nil {
return err
}
err = c.Data.db.Update(func(tx *bolt.Tx) error {
bucket, err := tx.CreateBucketIfNotExists([]byte(EVENTS_BUCKET))
if err != nil {
return err
}
err = bucket.Put([]byte(EVENTS_KEY), data)
if err != nil {
return err
}
// Also store an events list size
err = bucket.Put([]byte(EVENTS_KEY+"_count"), []byte(string(len(events))))
return err
})
return err
}
func (c *Config) getEvents() ([]github.Event, error) {
var events []github.Event
if err := c.checkDB(); err != nil {
return nil, err
}
err := c.Data.db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(EVENTS_BUCKET))
if bucket == nil {
return fmt.Errorf("Events bucket not created yet!")
}
data := bucket.Get([]byte(EVENTS_KEY))
err := json.Unmarshal(data, &events)
return err
})
if err != nil {
return nil, err
}
return events, nil
}
func (c *Config) getEventsCount() int {
if err := c.checkDB(); err != nil {
log.Error(err)
return -1
}
var count int
err := c.Data.db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(EVENTS_BUCKET))
if bucket == nil {
log.Error("Events bucket not created yet!")
return nil
}
data := bucket.Get([]byte(EVENTS_KEY + "_count"))
if data != nil {
c, err := strconv.Atoi(string(data))
if err != nil {
return err
}
count = c
}
return nil
})
if err != nil {
return -1
}
return count
}
func (c *Config) storeIssues(issues []*github.Issue) error {
if err := c.checkDB(); err != nil {
return err
}
log.Info("Store issues in the DB")
data, err := json.Marshal(issues)
if err != nil {
return err
}
err = c.Data.db.Update(func(tx *bolt.Tx) error {
bucket, err := tx.CreateBucketIfNotExists([]byte(ISSUES_BUCKET))
if err != nil {
return err
}
err = bucket.Put([]byte(ISSUES_KEY), data)
return err
})
return err
}
func (c *Config) getIssues() ([]*github.Issue, error) {
var issues []*github.Issue
if err := c.checkDB(); err != nil {
return nil, err
}
err := c.Data.db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket([]byte(ISSUES_BUCKET))
if bucket == nil {
return fmt.Errorf("Issues bucket not created yet!")
}
data := bucket.Get([]byte(ISSUES_KEY))
err := json.Unmarshal(data, &issues)
return err
})
if err != nil {
return nil, err
}
return issues, nil
}
func (c *Config) checkDB() error {
if c.Data.db == nil {
err := c.openDB()
if err != nil {
return err
}
}
return nil
}
func (c *Config) openDB() error {
err := c.createDB()
if err != nil {
return err
}
db, err := bolt.Open(c.Data.Path+"/db.bolt", 0600, nil)
if err != nil {
return err
}
c.Data.db = db
log.Info("Database is open")
return nil
}
func (c *Config) createDB() error {
c.createDataDir()
db, err := bolt.Open(c.Data.Path+"/db.bolt", 0600, nil)
if err != nil {
return err
}
defer db.Close()
return nil
}
func (c *Config) createDataDir() {
_, err := os.Open(c.Data.Path)
if !os.IsExist(err) {
os.Mkdir(c.Data.Path, 0700)
}
}