You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
2.2 KiB

/**
* @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
}