mirror of
https://github.com/PeernetOfficial/core.git
synced 2026-07-16 18:37:51 +01:00
90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
/*
|
|
File Name: Pogreb.go
|
|
Copyright: 2021 Peernet s.r.o.
|
|
Author: Peter Kleissner
|
|
*/
|
|
|
|
package store
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"log"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/akrylysov/pogreb"
|
|
)
|
|
|
|
// PogrebStore is a key-value store using Pogreb.
|
|
// Expiration is currently not supported.
|
|
type PogrebStore struct {
|
|
mutex *sync.Mutex
|
|
filename string
|
|
db *pogreb.DB
|
|
}
|
|
|
|
// NewPogrebStore create a properly initialized Pogreb store.
|
|
func NewPogrebStore(filename string) (store *PogrebStore, err error) {
|
|
pogreb.SetLogger(log.New(io.Discard, "", 0))
|
|
|
|
// if the database does not exist, it will be created
|
|
db, err := pogreb.Open(filename, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &PogrebStore{
|
|
mutex: &sync.Mutex{},
|
|
filename: filename,
|
|
db: db,
|
|
}, nil
|
|
}
|
|
|
|
func (store *PogrebStore) ExpireKeys() {
|
|
// Not yet implemented
|
|
}
|
|
|
|
// Store stores the key-value pair.
|
|
func (store *PogrebStore) Set(key []byte, data []byte) error {
|
|
return store.db.Put(key, data)
|
|
}
|
|
|
|
// StoreExpire stores the key-value pair and deletes it after the expiration time.
|
|
func (store *PogrebStore) StoreExpire(key []byte, data []byte, expiration time.Time) error {
|
|
// Not yet implemented
|
|
return errors.New("not yet implemented")
|
|
}
|
|
|
|
// Get returns the value for the key if present.
|
|
func (store *PogrebStore) Get(key []byte) (data []byte, found bool) {
|
|
value, err := store.db.Get(key)
|
|
if err != nil || value == nil {
|
|
return nil, false
|
|
}
|
|
return value, true
|
|
}
|
|
|
|
// Delete deletes a key-value pair.
|
|
func (store *PogrebStore) Delete(key []byte) {
|
|
store.db.Delete(key)
|
|
}
|
|
|
|
// Count returns the count of records stored.
|
|
func (store *PogrebStore) Count() uint64 {
|
|
return uint64(store.db.Count())
|
|
}
|
|
|
|
// Iterate iterates over all records.
|
|
func (store *PogrebStore) Iterate(callback func(key, value []byte)) {
|
|
iterator := store.db.Items()
|
|
for {
|
|
key, value, err := iterator.Next()
|
|
if err != nil {
|
|
break
|
|
}
|
|
|
|
callback(key, value)
|
|
}
|
|
}
|