diff options
| author | alex <[email protected]> | 2026-07-05 22:56:44 +0200 |
|---|---|---|
| committer | alex <[email protected]> | 2026-07-05 22:56:44 +0200 |
| commit | 8c49e03997128de4761acaaa6606d58f87d92c6c (patch) | |
| tree | dedca76c358800eeeeb17d602bb400746bbf3fb1 /main.go | |
| parent | efa1c05885a10ed5e2f3260bb7d1e96fdae39554 (diff) | |
| download | redis-clone-8c49e03997128de4761acaaa6606d58f87d92c6c.tar.xz redis-clone-8c49e03997128de4761acaaa6606d58f87d92c6c.zip | |
added LPOP and RPOP keywords
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 66 |
1 files changed, 66 insertions, 0 deletions
@@ -238,6 +238,72 @@ func handleLrange(conn net.Conn, key string, start, stop int) { conn.Write(serializeRESP(resultList)) } +func handleLpop(conn net.Conn, key string){ + db.mu.Lock() + defer db.mu.Unlock() + + value, exists := db.data[key] + if !exists { + conn.Write(serializeRESP(nil)) + return + } + + typedList, ok := value.([]string) + if !ok { + err := errors.New("WRONGTYPE Operation against a key holding the wrong kind of value") + conn.Write(serializeRESP(err)) + return + } + + if len(typedList) == 0 { + conn.Write(serializeRESP(nil)) + return + } + + item := typedList[0] + newList := typedList[1:] + if len(newList) <= 0 { + delete(db.data, key) + }else{ + db.data[key] = newList + } + conn.Write(serializeRESP(item)) + +} + +func handleRpop(conn net.Conn, key string){ + db.mu.Lock() + defer db.mu.Unlock() + + value, exists := db.data[key] + if !exists { + conn.Write(serializeRESP(nil)) + return + } + + typedList, ok := value.([]string) + if !ok { + err := errors.New("WRONGTYPE Operation against a key holding the wrong kind of value") + conn.Write(serializeRESP(err)) + return + } + + if len(typedList) == 0 { + conn.Write(serializeRESP(nil)) + return + } + + item := typedList[len(typedList)-1] + newList := typedList[:len(typedList)-1] + if len(newList) <= 0 { + delete(db.data, key) + }else{ + db.data[key] = newList + } + conn.Write(serializeRESP(item)) + +} + func serializeRESP(v any) []byte { switch val := v.(type) { case string: |
