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