Skip to content

Commit

Permalink
implement sets and gets commands
Browse files Browse the repository at this point in the history
  • Loading branch information
Vadim Kilibaba committed Aug 20, 2019
1 parent 3f22f7a commit c2001fc
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 1 deletion.
50 changes: 50 additions & 0 deletions api.go
Expand Up @@ -385,6 +385,30 @@ func Set(f string, key, value interface{}) error {
return db.Set(key, value)
}

// Sets store vals and keys
// Sync will called only at end of insertion
// Use it for mass insertion
// every pair must contain key and value
func Sets(file string, pairs []interface{}) (err error) {
db, err := Open(file, nil)
if err != nil {
return err
}
for i := range pairs {
if i%2 != 0 {
// on odd - append val and store key
if pairs[i] == nil || pairs[i-1] == nil {
break
}
err = db.Set(pairs[i-1], pairs[i])
if err != nil {
break
}
}
}
return err
}

// Get return value by key with opening if needed
// Return error if any.
func Get(f string, key, value interface{}) error {
Expand All @@ -395,6 +419,32 @@ func Get(f string, key, value interface{}) error {
return db.Get(key, value)
}

// Gets return key/value pairs in random order
// result contains key and value
// Gets not return error if key not found
// If no keys found return empty result
func Gets(file string, keys []interface{}) (result [][]byte) {
db, err := Open(file, nil)
if err != nil {
return nil
}
for _, key := range keys {
var v []byte
err := db.Get(key, &v)
if err == nil {
k, err := KeyToBinary(key)
if err == nil {
val, err := ValToBinary(v)
if err == nil {
result = append(result, k)
result = append(result, val)
}
}
}
}
return result
}

// Counter return int64 incremented on incr with lazy open
func Counter(f string, key interface{}, incr int) (int64, error) {
db, err := Open(f, nil)
Expand Down
53 changes: 52 additions & 1 deletion pudge_test.go
Expand Up @@ -585,8 +585,59 @@ func Test42(t *testing.T) {
if err != nil {
t.Error(err)
}
if len(keys) != 22 {
if len(keys) != 21 {
t.Error("not 21", len(keys))
}
DeleteFile(f)
}

func TestSetsGets(t *testing.T) {
f := "test/setsgets"
DeleteFile(f)
var pairs []interface{}

for i := 1; i < 64; i++ {
pairs = append(pairs, i)
pairs = append(pairs, i+1)
}
err := Sets(f, pairs)
if err != nil {
t.Error("Sets err", err)
}
var v int
err = Get(f, 63, &v)
if err != nil || v != 64 {
t.Error("Sets err", err, v)
}
//Sets
var pairsBin []interface{}
for i := 0; i < 100; i++ {
k := []byte(fmt.Sprintf("%04d", i))
pairsBin = append(pairsBin, k)
pairsBin = append(pairsBin, k)
}
err = Sets(f, pairsBin)
if err != nil {
t.Error("Sets err", err)
}
var s []byte
err = Get(f, []byte("0063"), &s)
if err != nil || string(s) != "0063" {
t.Error("Sets err", err, s)
}
var keys []interface{}
for i := 2; i < 4; i++ {
k := []byte(fmt.Sprintf("%04d", i))
keys = append(keys, k)
}
err = Get(f, []byte("0068"), &s)
if err != nil {
t.Error("Sets err", err)
}

result := Gets(f, keys)
if len(result) != 4 {
t.Error("Sets err not 4")
}
DeleteFile(f)
}

0 comments on commit c2001fc

Please sign in to comment.