123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- package dbbolt
- import (
- "encoding/json"
- "errors"
- "github.com/boltdb/bolt"
- )
- type Database struct {
- Db interface{} //This is the bolt database object
- }
- func NewBoltDatabase(dbfile string) (*Database, error) {
- db, err := bolt.Open(dbfile, 0600, nil)
- if err != nil {
- return nil, err
- }
- return &Database{
- Db: db,
- }, err
- }
- // Create a new table
- func (d *Database) NewTable(tableName string) error {
- err := d.Db.(*bolt.DB).Update(func(tx *bolt.Tx) error {
- _, err := tx.CreateBucketIfNotExists([]byte(tableName))
- if err != nil {
- return err
- }
- return nil
- })
- return err
- }
- // Check is table exists
- func (d *Database) TableExists(tableName string) bool {
- return d.Db.(*bolt.DB).View(func(tx *bolt.Tx) error {
- b := tx.Bucket([]byte(tableName))
- if b == nil {
- return errors.New("table not exists")
- }
- return nil
- }) == nil
- }
- // Drop the given table
- func (d *Database) DropTable(tableName string) error {
- err := d.Db.(*bolt.DB).Update(func(tx *bolt.Tx) error {
- err := tx.DeleteBucket([]byte(tableName))
- if err != nil {
- return err
- }
- return nil
- })
- return err
- }
- // Write to table
- func (d *Database) Write(tableName string, key string, value interface{}) error {
- jsonString, err := json.Marshal(value)
- if err != nil {
- return err
- }
- err = d.Db.(*bolt.DB).Update(func(tx *bolt.Tx) error {
- _, err := tx.CreateBucketIfNotExists([]byte(tableName))
- if err != nil {
- return err
- }
- b := tx.Bucket([]byte(tableName))
- err = b.Put([]byte(key), jsonString)
- return err
- })
- return err
- }
- func (d *Database) Read(tableName string, key string, assignee interface{}) error {
- err := d.Db.(*bolt.DB).View(func(tx *bolt.Tx) error {
- b := tx.Bucket([]byte(tableName))
- v := b.Get([]byte(key))
- json.Unmarshal(v, &assignee)
- return nil
- })
- return err
- }
- func (d *Database) KeyExists(tableName string, key string) bool {
- resultIsNil := false
- if !d.TableExists(tableName) {
- //Table not exists. Do not proceed accessing key
- //log.Println("[DB] ERROR: Requesting key from table that didn't exist!!!")
- return false
- }
- err := d.Db.(*bolt.DB).View(func(tx *bolt.Tx) error {
- b := tx.Bucket([]byte(tableName))
- v := b.Get([]byte(key))
- if v == nil {
- resultIsNil = true
- }
- return nil
- })
- if err != nil {
- return false
- } else {
- if resultIsNil {
- return false
- } else {
- return true
- }
- }
- }
- func (d *Database) Delete(tableName string, key string) error {
- err := d.Db.(*bolt.DB).Update(func(tx *bolt.Tx) error {
- tx.Bucket([]byte(tableName)).Delete([]byte(key))
- return nil
- })
- return err
- }
- func (d *Database) ListTable(tableName string) ([][][]byte, error) {
- var results [][][]byte
- err := d.Db.(*bolt.DB).View(func(tx *bolt.Tx) error {
- b := tx.Bucket([]byte(tableName))
- c := b.Cursor()
- for k, v := c.First(); k != nil; k, v = c.Next() {
- results = append(results, [][]byte{k, v})
- }
- return nil
- })
- return results, err
- }
- func (d *Database) Close() {
- d.Db.(*bolt.DB).Close()
- }
|