diff options
| -rw-r--r-- | handlers.go | 53 | ||||
| -rw-r--r-- | main.go | 1 |
2 files changed, 47 insertions, 7 deletions
diff --git a/handlers.go b/handlers.go index 8a667de..f298379 100644 --- a/handlers.go +++ b/handlers.go @@ -3,6 +3,7 @@ package main import ( "errors" "net" + "path/filepath" "strconv" "time" ) @@ -418,7 +419,7 @@ func handleExpire(conn net.Conn, args []string){ key := args[1] seconds, err := strconv.Atoi(args[2]) if err != nil { - conn.Write(serializeRESP(errors.New("ERR value is not an integer"))) + conn.Write(serializeRESP(errors.New("value is not an integer"))) return } db.mu.Lock() @@ -472,7 +473,7 @@ func handleHset(conn net.Conn, args []string){ func handleHget(conn net.Conn, args []string) { if len(args) != 3 { - conn.Write(serializeRESP(errors.New("ERR wrong number of arguments for 'HGET'"))) + conn.Write(serializeRESP(errors.New("wrong number of arguments for 'HGET'"))) return } @@ -505,7 +506,7 @@ func handleHget(conn net.Conn, args []string) { func handleHgetall(conn net.Conn, args []string){ if len(args) != 2 { - conn.Write(serializeRESP(errors.New("ERR wrong number of arguments for 'HGETALL'"))) + conn.Write(serializeRESP(errors.New("wrong number of arguments for 'HGETALL'"))) return } key := args[1] @@ -529,7 +530,7 @@ func handleHgetall(conn net.Conn, args []string){ func handleHkeys(conn net.Conn, args []string){ if len(args) != 2 { - conn.Write(serializeRESP(errors.New("ERR wrong number of arguments for 'HKEYS'"))) + conn.Write(serializeRESP(errors.New("wrong number of arguments for 'HKEYS'"))) return } key := args[1] @@ -557,7 +558,7 @@ func handleHkeys(conn net.Conn, args []string){ func handleHvalues(conn net.Conn, args []string){ if len(args) != 2 { - conn.Write(serializeRESP(errors.New("ERR wrong number of arguments for 'HVALUES'"))) + conn.Write(serializeRESP(errors.New("wrong number of arguments for 'HVALUES'"))) return } key := args[1] @@ -585,7 +586,7 @@ func handleHvalues(conn net.Conn, args []string){ func handleType(conn net.Conn, args []string){ if len(args) != 2 { - conn.Write(serializeRESP(errors.New("ERR wrong number of arguments for 'TYPE'"))) + conn.Write(serializeRESP(errors.New("wrong number of arguments for 'TYPE'"))) return } key := args[1] @@ -613,10 +614,48 @@ func handleType(conn net.Conn, args []string){ func handleDbsize(conn net.Conn, args []string){ if len(args) != 1 { - conn.Write(serializeRESP(errors.New("ERR wrong number of arguments for 'DBSIZE'"))) + conn.Write(serializeRESP(errors.New("wrong number of arguments for 'DBSIZE'"))) return } db.mu.Lock() defer db.mu.Unlock() conn.Write(serializeRESP(len(db.data))) +} +func handleKeys(conn net.Conn, args []string) { + if len(args) < 2 || len(args) > 3 { + conn.Write(serializeRESP(errors.New("wrong number of arguments for 'DBSIZE'"))) + return + } + limit := -1 + pattern := args[1] + var matches []string + if len(args) == 3 { + val, err := strconv.Atoi(args[2]) + if err != nil { + conn.Write(serializeRESP(errors.New("ERR value is not an integer"))) + return + } + limit = val + } + i := 0 + db.mu.Lock() + for key := range db.data { + matched, err := filepath.Match(pattern, key) + if err != nil { + conn.Write(serializeRESP(errors.New("illegal glob pattern"))) + db.mu.Unlock() + return + } + + if matched { + matches = append(matches, key) + i+=1 + } + if i == limit{ + break + } + } + db.mu.Unlock() + + conn.Write(serializeRESP(matches)) }
\ No newline at end of file @@ -37,6 +37,7 @@ var commandRegistry = map[string]handlerFunc{ "HVALUES": handleHvalues, "TYPE": handleType, "DBSIZE": handleDbsize, + "KEYS": handleKeys, } func main() { |
