diff options
Diffstat (limited to 'handlers.go')
| -rw-r--r-- | handlers.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/handlers.go b/handlers.go index a6ae6ef..aacabe5 100644 --- a/handlers.go +++ b/handlers.go @@ -487,4 +487,60 @@ func handleHgetall(conn net.Conn, args []string){ return } conn.Write(serializeRESP(hash)) +} + +func handleHkeys(conn net.Conn, args []string){ + if len(args) != 2 { + conn.Write(serializeRESP(errors.New("ERR wrong number of arguments for 'HKEYS'"))) + return + } + key := args[1] + + db.mu.Lock() + defer db.mu.Unlock() + + item, exists := db.data[key] + if !exists { + conn.Write(serializeRESP(nil)) + return + } + + hash, ok := item.Value.(map[string]string) + if !ok { + conn.Write(serializeRESP(errors.New("WRONGTYPE Operation against a key holding the wrong kind of value"))) + return + } + result := make([]string, 0, len(hash)) + for key := range hash { + result = append(result, key) + } + conn.Write(serializeRESP(result)) +} + +func handleHvalues(conn net.Conn, args []string){ + if len(args) != 2 { + conn.Write(serializeRESP(errors.New("ERR wrong number of arguments for 'HVALUES'"))) + return + } + key := args[1] + + db.mu.Lock() + defer db.mu.Unlock() + + item, exists := db.data[key] + if !exists { + conn.Write(serializeRESP(nil)) + return + } + + hash, ok := item.Value.(map[string]string) + if !ok { + conn.Write(serializeRESP(errors.New("WRONGTYPE Operation against a key holding the wrong kind of value"))) + return + } + result := make([]string, 0, len(hash)) + for _, value := range hash { + result = append(result, value) + } + conn.Write(serializeRESP(result)) }
\ No newline at end of file |
