diff --git a/0102/kv.go b/0102/kv.go new file mode 100644 index 0000000..e359c4d --- /dev/null +++ b/0102/kv.go @@ -0,0 +1,36 @@ +package db0102 + +import ( + "bytes" +) + +type KV struct { + mem map[string][]byte +} + +func (kv *KV) Open() error { + kv.mem = map[string][]byte{} // empty + return nil +} + +func (kv *KV) Close() error { return nil } + +func (kv *KV) Get(key []byte) (val []byte, ok bool, err error) { + val, ok = kv.mem[string(key)] + return +} + +func (kv *KV) Set(key []byte, val []byte) (updated bool, err error) { + prev, exist := kv.mem[string(key)] + kv.mem[string(key)] = val + updated = !exist || !bytes.Equal(prev, val) + return +} + +func (kv *KV) Del(key []byte) (deleted bool, err error) { + _, deleted = kv.mem[string(key)] + delete(kv.mem, string(key)) + return +} + +// QzBQWVJJOUhU https://trialofcode.org/ diff --git a/0102/kv_entry.go b/0102/kv_entry.go new file mode 100644 index 0000000..bd356fd --- /dev/null +++ b/0102/kv_entry.go @@ -0,0 +1,16 @@ +package db0102 + +import ( + "io" +) + +type Entry struct { + key []byte + val []byte +} + +func (ent *Entry) Encode() []byte + +func (ent *Entry) Decode(r io.Reader) error + +// QzBQWVJJOUhU https://trialofcode.org/ diff --git a/0102/kv_test.go b/0102/kv_test.go new file mode 100644 index 0000000..450125d --- /dev/null +++ b/0102/kv_test.go @@ -0,0 +1,47 @@ +package db0102 + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestKVBasic(t *testing.T) { + kv := KV{} + err := kv.Open() + assert.Nil(t, err) + defer kv.Close() + + updated, err := kv.Set([]byte("k1"), []byte("v1")) + assert.True(t, updated && err == nil) + + val, ok, err := kv.Get([]byte("k1")) + assert.True(t, string(val) == "v1" && ok && err == nil) + + _, ok, err = kv.Get([]byte("xxx")) + assert.True(t, !ok && err == nil) + + updated, err = kv.Del([]byte("xxx")) + assert.True(t, !updated && err == nil) + + updated, err = kv.Del([]byte("k1")) + assert.True(t, updated && err == nil) + + _, ok, err = kv.Get([]byte("xxx")) + assert.True(t, !ok && err == nil) +} + +func TestEntryEncode(t *testing.T) { + ent := Entry{key: []byte("k1"), val: []byte("xxx")} + data := []byte{2, 0, 0, 0, 3, 0, 0, 0, 'k', '1', 'x', 'x', 'x'} + + assert.Equal(t, data, ent.Encode()) + + decoded := Entry{} + err := decoded.Decode(bytes.NewBuffer(data)) + assert.Nil(t, err) + assert.Equal(t, ent, decoded) +} + +// QzBQWVJJOUhU https://trialofcode.org/