From 5eab1adf6ab994fadb5599ce6b2642f90a75010b Mon Sep 17 00:00:00 2001 From: Emmanuel Di Pretoro Date: Fri, 7 Aug 2026 14:14:36 +0200 Subject: [PATCH] Solving the challenge 0103 --- 0103/kv.go | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/0103/kv.go b/0103/kv.go index f4bcdcb..2b1c85c 100644 --- a/0103/kv.go +++ b/0103/kv.go @@ -1,11 +1,34 @@ package db0103 +import "bytes" + type KV struct { log Log mem map[string][]byte } -func (kv *KV) Open() error +func (kv *KV) Open() error { + if err := kv.log.Open(); err != nil { + return err + } + kv.mem = map[string][]byte{} + for { + entry := Entry{} + eof, err := kv.log.Read(&entry) + if err != nil { + return err + } else if eof { + break + } + + if entry.deleted { + delete(kv.mem, string(entry.key)) + } else { + kv.mem[string(entry.key)] = entry.val + } + } + return nil +} func (kv *KV) Close() error { return kv.log.Close() } @@ -14,8 +37,27 @@ func (kv *KV) Get(key []byte) (val []byte, ok bool, err error) { return } -func (kv *KV) Set(key []byte, val []byte) (updated bool, err error) +func (kv *KV) Set(key []byte, val []byte) (updated bool, err error) { + prev, exist := kv.mem[string(key)] + updated = !exist || !bytes.Equal(prev, val) + if updated { + if err = kv.log.Write(&Entry{key: key, val: val, deleted: false}); err != nil { + return false, err + } + kv.mem[string(key)] = val + } + return +} -func (kv *KV) Del(key []byte) (deleted bool, err error) +func (kv *KV) Del(key []byte) (deleted bool, err error) { + _, deleted = kv.mem[string(key)] + if deleted { + if err = kv.log.Write(&Entry{key: key, val: nil, deleted: true}); err != nil { + return false, err + } + delete(kv.mem, string(key)) + } + return +} // QzBQWVJJOUhU https://trialofcode.org/