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  }