aboutsummaryrefslogtreecommitdiff
path: root/handlers.go
diff options
context:
space:
mode:
Diffstat (limited to 'handlers.go')
-rw-r--r--handlers.go56
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