Skip to content

Instantly share code, notes, and snippets.

@marshyon
Last active March 4, 2018 02:25
Show Gist options
  • Save marshyon/92f7927721be476dfcaec255b73ca0fb to your computer and use it in GitHub Desktop.
Save marshyon/92f7927721be476dfcaec255b73ca0fb to your computer and use it in GitHub Desktop.
Golang boltdb usage - store and retrieve key value pairs
package main
import (
"fmt"
"log"
"time"
"github.com/boltdb/bolt"
)
var (
db *bolt.DB
)
func init() {
var err error
// Open the my.db data file in the current directory.
// It will be created if it doesn't exist.
db, err = bolt.Open("my.db", 0600, &bolt.Options{Timeout: 1 * time.Second})
if err != nil {
log.Fatal(err)
}
}
func main() {
defer db.Close()
bucketName := []byte("authCacheDB")
key := []byte("nobody")
value, length := queryDB(bucketName, key)
fmt.Printf("---->%s [%d]\n", string(value), length)
if string(value) == "" {
fmt.Println("blanko")
}
fmt.Printf("key [%s] => [%#v]\n", key, value)
key = []byte("jon")
value = []byte("1484083883")
updateDB(bucketName, key, value)
value, length = queryDB(bucketName, key)
fmt.Printf("key [%s] => [%s][%d]\n", key, value, length)
key = []byte("joe")
value = []byte("1484083895")
updateDB(bucketName, key, value)
value, length = queryDB(bucketName, key)
fmt.Printf("key [%s] => [%s][%d]\n", key, value, length)
key = []byte("arkrite")
value = []byte("1484083901")
updateDB(bucketName, key, value)
value, length = queryDB(bucketName, key)
fmt.Printf("key [%s] => [%s] [%d]\n", key, value, length)
deleteKey(bucketName, []byte("arkrite"))
deleteKey(bucketName, []byte("jon"))
//key = []byte("nada")
//value = queryDB(bucketName, key)
//fmt.Printf("key [%s] => [%s]\n", key, value)
iterateDB(bucketName)
}
// updateDB : store data
func updateDB(bucketName, key, value []byte) {
err := db.Update(func(tx *bolt.Tx) error {
bkt, err := tx.CreateBucketIfNotExists(bucketName)
if err != nil {
return err
}
err = bkt.Put(key, value)
if err != nil {
return err
}
return nil
})
if err != nil {
log.Fatal(err)
}
}
// queryDB : retrieve data
func queryDB(bucketName, key []byte) (val []byte, length int) {
err := db.View(func(tx *bolt.Tx) error {
bkt := tx.Bucket(bucketName)
if bkt == nil {
return fmt.Errorf("Bucket %q not found!", bucketName)
}
val = bkt.Get(key)
return nil
})
if err != nil {
log.Fatal(err)
}
return val, len(string(val))
}
// iterateDB : iterate data
func iterateDB(bucketName []byte) {
err := db.View(func(tx *bolt.Tx) error {
b := tx.Bucket(bucketName)
c := b.Cursor()
for k, v := c.First(); k != nil; k, v = c.Next() {
fmt.Printf("key=>[%s], value=[%s]\n", k, v)
}
return nil
})
if err != nil {
log.Fatalf("failure : %s\n", err)
}
}
// deleteKey : delete data
func deleteKey(bucketName, keyName []byte) {
err := db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket(bucketName)
err := b.Delete(keyName)
return err
})
if err != nil {
log.Fatalf("failure : %s\n", err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment