aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--handlers.go56
-rw-r--r--main.go2
2 files changed, 58 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
diff --git a/main.go b/main.go
index a20db6a..8a73770 100644
--- a/main.go
+++ b/main.go
@@ -32,6 +32,8 @@ var commandRegistry = map[string]handlerFunc{
"HSET": handleHset,
"HGET": handleHget,
"HGETALL": handleHgetall,
+ "HKEYS": handleHkeys,
+ "HVALUES": handleHvalues,
}
func main() {