arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
slowlorisdb/db/leveldb.go
db/leveldb.goRaw
 1package db
 2
 3import (
 4	"github.com/syndtr/goleveldb/leveldb"
 5)
 6
 7// Db is the database with the specified prefix
 8type Db struct {
 9	ldb    *leveldb.DB
10	prefix []byte
11}
12
13// New creates a new Db database
14func New(path string) (*Db, error) {
15	ldb, err := leveldb.OpenFile(path, nil)
16	if err != nil {
17		return nil, err
18	}
19	return &Db{ldb, []byte{}}, nil
20}
21
22// WithPrefix returns a subdatabase with the specified prefix
23func (db *Db) WithPrefix(prefix []byte) *Db {
24	return &Db{db.ldb, append(db.prefix, prefix...)}
25}
26
27// Put adds the key value to the database
28func (db *Db) Put(key, value []byte) error {
29	err := db.ldb.Put(append(db.prefix, key[:]...), value, nil)
30	return err
31}
32
33// Get retreives a value from the database for a given key
34func (db *Db) Get(key []byte) ([]byte, error) {
35	v, err := db.ldb.Get(append(db.prefix, key[:]...), nil)
36	if err != nil {
37		return nil, err
38	}
39	return v, nil
40}
41
42// Iterate iterates over the database
43func (db *Db) Iterate(f func([]byte, []byte)) error {
44	snapshot, err := db.ldb.GetSnapshot()
45	if err != nil {
46		return err
47	}
48	iter := snapshot.NewIterator(nil, nil)
49	for iter.Next() {
50		f(iter.Key(), iter.Value())
51	}
52	iter.Release()
53	err = iter.Error()
54	return err
55}