dbbolt.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package dbbolt
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/boltdb/bolt"
  6. )
  7. type Database struct {
  8. Db interface{} //This is the bolt database object
  9. }
  10. func NewBoltDatabase(dbfile string) (*Database, error) {
  11. db, err := bolt.Open(dbfile, 0600, nil)
  12. if err != nil {
  13. return nil, err
  14. }
  15. return &Database{
  16. Db: db,
  17. }, err
  18. }
  19. // Create a new table
  20. func (d *Database) NewTable(tableName string) error {
  21. err := d.Db.(*bolt.DB).Update(func(tx *bolt.Tx) error {
  22. _, err := tx.CreateBucketIfNotExists([]byte(tableName))
  23. if err != nil {
  24. return err
  25. }
  26. return nil
  27. })
  28. return err
  29. }
  30. // Check is table exists
  31. func (d *Database) TableExists(tableName string) bool {
  32. return d.Db.(*bolt.DB).View(func(tx *bolt.Tx) error {
  33. b := tx.Bucket([]byte(tableName))
  34. if b == nil {
  35. return errors.New("table not exists")
  36. }
  37. return nil
  38. }) == nil
  39. }
  40. // Drop the given table
  41. func (d *Database) DropTable(tableName string) error {
  42. err := d.Db.(*bolt.DB).Update(func(tx *bolt.Tx) error {
  43. err := tx.DeleteBucket([]byte(tableName))
  44. if err != nil {
  45. return err
  46. }
  47. return nil
  48. })
  49. return err
  50. }
  51. // Write to table
  52. func (d *Database) Write(tableName string, key string, value interface{}) error {
  53. jsonString, err := json.Marshal(value)
  54. if err != nil {
  55. return err
  56. }
  57. err = d.Db.(*bolt.DB).Update(func(tx *bolt.Tx) error {
  58. _, err := tx.CreateBucketIfNotExists([]byte(tableName))
  59. if err != nil {
  60. return err
  61. }
  62. b := tx.Bucket([]byte(tableName))
  63. err = b.Put([]byte(key), jsonString)
  64. return err
  65. })
  66. return err
  67. }
  68. func (d *Database) Read(tableName string, key string, assignee interface{}) error {
  69. err := d.Db.(*bolt.DB).View(func(tx *bolt.Tx) error {
  70. b := tx.Bucket([]byte(tableName))
  71. v := b.Get([]byte(key))
  72. json.Unmarshal(v, &assignee)
  73. return nil
  74. })
  75. return err
  76. }
  77. func (d *Database) KeyExists(tableName string, key string) bool {
  78. resultIsNil := false
  79. if !d.TableExists(tableName) {
  80. //Table not exists. Do not proceed accessing key
  81. //log.Println("[DB] ERROR: Requesting key from table that didn't exist!!!")
  82. return false
  83. }
  84. err := d.Db.(*bolt.DB).View(func(tx *bolt.Tx) error {
  85. b := tx.Bucket([]byte(tableName))
  86. v := b.Get([]byte(key))
  87. if v == nil {
  88. resultIsNil = true
  89. }
  90. return nil
  91. })
  92. if err != nil {
  93. return false
  94. } else {
  95. if resultIsNil {
  96. return false
  97. } else {
  98. return true
  99. }
  100. }
  101. }
  102. func (d *Database) Delete(tableName string, key string) error {
  103. err := d.Db.(*bolt.DB).Update(func(tx *bolt.Tx) error {
  104. tx.Bucket([]byte(tableName)).Delete([]byte(key))
  105. return nil
  106. })
  107. return err
  108. }
  109. func (d *Database) ListTable(tableName string) ([][][]byte, error) {
  110. var results [][][]byte
  111. err := d.Db.(*bolt.DB).View(func(tx *bolt.Tx) error {
  112. b := tx.Bucket([]byte(tableName))
  113. c := b.Cursor()
  114. for k, v := c.First(); k != nil; k, v = c.Next() {
  115. results = append(results, [][]byte{k, v})
  116. }
  117. return nil
  118. })
  119. return results, err
  120. }
  121. func (d *Database) Close() {
  122. d.Db.(*bolt.DB).Close()
  123. }