github.com/nutsdb/nutsdb@v1.0.4/examples/k-v/bit/main.go (about) 1 package main 2 3 import ( 4 "github.com/nutsdb/nutsdb" 5 "io/ioutil" 6 "log" 7 "os" 8 ) 9 10 var ( 11 db *nutsdb.DB 12 bucket string 13 err error 14 ) 15 16 func init() { 17 fileDir := "/tmp/nutsdb_example" 18 19 files, _ := ioutil.ReadDir(fileDir) 20 for _, f := range files { 21 name := f.Name() 22 if name != "" { 23 err := os.RemoveAll(fileDir + "/" + name) 24 if err != nil { 25 panic(err) 26 } 27 } 28 } 29 db, _ = nutsdb.Open( 30 nutsdb.DefaultOptions, 31 nutsdb.WithDir(fileDir), 32 nutsdb.WithSegmentSize(1024*1024), // 1MB 33 ) 34 if err != nil { 35 panic(err) 36 } 37 bucket = "bucketForString" 38 39 if err := db.Update(func(tx *nutsdb.Tx) error { 40 return tx.NewBucket(nutsdb.DataStructureBTree, bucket) 41 }); err != nil { 42 log.Fatal(err) 43 } 44 } 45 46 func main() { 47 // If we use `GetBit` on a key that does not exist, we will get an error with 'key not found' 48 getBit("non-exist", 12) 49 50 // If we `SetBit` on an exist k-v, we will update the corresponding bit of value. 51 put("key1", "value1") 52 setBit("key1", 5, 2) 53 getBit("key1", 5) // get bit: 2 54 55 // If we `SetBit` on a non-exist k-v or length of value is less than given offset, we will expand the value. 56 // The expanded value will be filled with 0. Until we can modify the corresponding bit with given offset. 57 setBit("key2", 5, 1) 58 getBit("key2", 5) // get bit: 1 59 get("key2") // get value: [0, 0, 0, 0, 0, 1] 60 } 61 62 func get(key string) { 63 if err := db.View(func(tx *nutsdb.Tx) error { 64 value, err := tx.Get(bucket, []byte(key)) 65 if err != nil { 66 return err 67 } 68 log.Println("get value: ", value) 69 return nil 70 }); err != nil { 71 log.Println(err) 72 } 73 } 74 75 func put(key, value string) { 76 if err := db.Update(func(tx *nutsdb.Tx) error { 77 return tx.Put(bucket, []byte(key), []byte(value), nutsdb.Persistent) 78 }); err != nil { 79 log.Println(err) 80 } 81 } 82 83 func getBit(key string, offset int) { 84 if err := db.View(func(tx *nutsdb.Tx) error { 85 bit, err := tx.GetBit(bucket, []byte(key), offset) 86 if err != nil { 87 return err 88 } 89 log.Println("get bit:", bit) 90 return nil 91 }); err != nil { 92 log.Println(err) 93 } 94 } 95 96 func setBit(key string, offset int, bit byte) { 97 if err := db.Update(func(tx *nutsdb.Tx) error { 98 return tx.SetBit(bucket, []byte(key), offset, bit) 99 }); err != nil { 100 log.Println(err) 101 } 102 }