diff --git a/.gitignore b/.gitignore index 13ee724..3cc4f10 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -.env +.env dump.rdb database.aof -zeno-build* \ No newline at end of file +zeno-build* +local diff --git a/main.go b/main.go index cfc9be1..f199d50 100644 --- a/main.go +++ b/main.go @@ -36,18 +36,22 @@ func main() { } hanlderFunc(args) }) - conn, err := l.Accept() - if err != nil { - fmt.Println(err) - return + for { + conn, err := l.Accept() + if err != nil { + fmt.Println(err) + continue + } + go handleConnection(conn, aof) } +} + +func handleConnection(conn net.Conn, aof *aof.Aof) { defer conn.Close() for { response := resp.NewResp(conn) value, err := response.Read() - fmt.Println(value) if err != nil { - fmt.Println(err) return } if value.Type != "array" { @@ -56,23 +60,23 @@ func main() { } if len(value.Array) == 0 { fmt.Println("Invalid Requested expected array len greater than 0") + continue } command := strings.ToUpper(value.Array[0].Bulk) args := value.Array[1:] - writer := writer.NewWriter(conn) + w := writer.NewWriter(conn) handlerResponse, ok := handler.Handlers[command] if !ok { fmt.Println("Invalid Command: ", command) - writer.Write(resp.Value{Type: "string", Str: ""}) + w.Write(resp.Value{Type: "string", Str: ""}) continue - } if command == "SET" || command == "HSET" { aof.Write(value) } result := handlerResponse(args) - writer.Write(result) + w.Write(result) } } diff --git a/src/aof/aof.go b/src/aof/aof.go index be584dc..61bf380 100644 --- a/src/aof/aof.go +++ b/src/aof/aof.go @@ -49,13 +49,13 @@ func (aof *Aof) Read(callback func(value resp.Value)) error { response := resp.NewResp(aof.File) for { value, err := response.Read() - if err == nil { - callback(value) - } if err == io.EOF { break } - return err + if err != nil { + return err + } + callback(value) } return nil } diff --git a/src/handler/handler.go b/src/handler/handler.go index 3a5e2ff..d158f87 100644 --- a/src/handler/handler.go +++ b/src/handler/handler.go @@ -92,9 +92,9 @@ func hget(args []resp.Value) resp.Value { } hash := args[0].Bulk key := args[1].Bulk - HSETsMu.Lock() + HSETsMu.RLock() value, ok := HSETs[hash][key] - HSETsMu.Unlock() + HSETsMu.RUnlock() if !ok { return resp.Value{Type: "null"} } @@ -110,8 +110,8 @@ func hgetall(args []resp.Value) resp.Value { } hash := args[0].Bulk - HSETsMu.Lock() - defer HSETsMu.Unlock() + HSETsMu.RLock() + defer HSETsMu.RUnlock() values, ok := HSETs[hash] if !ok {