/** * @file * @copyright defined in aergo/LICENSE.txt */ /* Package db is an wrapper of key-value database implementations. Currently, this supports badgerdb (https://github.com/dgraph-io/badger). Basic Usage You can create database using a newdb func like this database := NewDB(BadgerImpl, "./test") A first argument is a backend db type to use, and a second is a root directory to store db files. After creating db, you can write, read or delete single key-value using funcs in DB interface. // write data database.Set([]byte("key"), []byte("val")) // read data read := Get([]byte("key")) // delete data database.Delete([]byte("key")) Transaction A Transaction is a bulk set of operations to ensure atomic success or fail. // create a new transaction tx := database.NewTX(true) // reserve writing tx.Set([]byte("keyA"), []byte("valA")) tx.Set([]byte("keyB"), []byte("valB")) // Get will return a value reserved to write in this transaction mustBeValA := tx.Get([]byte("keyA")) // Perform writing tx.Commit() If you want to cancel and discard operations in tx, then you must call Discard() func to prevent a memory leack // If you create a tx, but do not commit, than you have to call this tx.Discard() Iterator An iteractor provides a way to get all keys sequentially. // create an iterator that covers all range for iter := database.Iterator(nil, nil); iter.Valid(); iter.Next() { // print each key-value pair fmt.Printf("%s = %s", string(iter.Key()), string(iter.Value())) } You can find more detail usages at a db_test.go file */ package db import ( "fmt" "github.com/aergoio/aergo-lib/log" ) var dbImpls = map[ImplType]dbConstructor{} var logger *extendedLog func registorDBConstructor(dbimpl ImplType, constructor dbConstructor) { dbImpls[dbimpl] = constructor } // NewDB creates new database or load existing database in the directory func NewDB(dbimpltype ImplType, dir string) DB { logger = &extendedLog{Logger: log.NewLogger("db")} db, err := dbImpls[dbimpltype](dir) if err != nil { panic(fmt.Sprintf("Fail to Create New DB: %v", err)) } return db } func convNilToBytes(byteArray []byte) []byte { if byteArray == nil { return []byte{} } return byteArray }