245 lines
4.2 KiB
Go
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)
|
|
}
|
|
}
|