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}