From ced1427b43d68fe0f40cdf3cb304b06eefd6153f Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 4 Jul 2026 22:33:25 +0200 Subject: added parsing of simple strings and fixed bug in INCR/DECR --- main.go | 64 +++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 25 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index 7e8c13e..5db75f3 100644 --- a/main.go +++ b/main.go @@ -83,11 +83,14 @@ func handleDel(conn net.Conn, key string){ func handleIncr(conn net.Conn, key string){ db.mu.Lock() + defer db.mu.Unlock() + value, exists := db.data[key] if exists { currentInt, err := strconv.Atoi(value) if err != nil { conn.Write([]byte("-ERR value is not an integer or out of range\r\n")) + return } newValueStr := strconv.Itoa(currentInt+1) @@ -97,18 +100,18 @@ func handleIncr(conn net.Conn, key string){ db.data[key] = "1" conn.Write([]byte(":1\r\n")) } - - db.mu.Unlock() - } func handleDecr(conn net.Conn, key string){ db.mu.Lock() + defer db.mu.Unlock() + value, exists := db.data[key] if exists { currentInt, err := strconv.Atoi(value) if err != nil { conn.Write([]byte("-ERR value is not an integer or out of range\r\n")) + return } newValueStr := strconv.Itoa(currentInt-1) @@ -118,9 +121,6 @@ func handleDecr(conn net.Conn, key string){ db.data[key] = "-1" conn.Write([]byte(":-1\r\n")) } - - db.mu.Unlock() - } func handlePing(conn net.Conn) { @@ -138,34 +138,48 @@ func parseRESP(reader *bufio.Reader) ([]string, error) { if err != nil { return nil, err } - var args []string - argC, _ := strconv.Atoi(strings.TrimSpace(line[1:])) + if len(line) == 0 { + return nil, fmt.Errorf("empty line") + } - for i := 0; i < argC; i++ { - lengthLine, err := reader.ReadString('\n') - - if err != nil { - return nil, err - } + switch line[0] { + case '*': + var args []string + argC, _ := strconv.Atoi(strings.TrimSpace(line[1:])) - strLen, _ := strconv.Atoi(strings.TrimSpace(lengthLine[1:])) + for i := 0; i < argC; i++ { + lengthLine, err := reader.ReadString('\n') + + if err != nil { + return nil, err + } - buf := make([]byte, strLen) + strLen, _ := strconv.Atoi(strings.TrimSpace(lengthLine[1:])) - _, err = io.ReadFull(reader, buf) - if err != nil { - return nil, err - } + buf := make([]byte, strLen) - _, err = reader.Discard(2) - if err != nil { - return nil, err + _, err = io.ReadFull(reader, buf) + if err != nil { + return nil, err + } + + _, err = reader.Discard(2) + if err != nil { + return nil, err + } + + args = append(args, string(buf)) } + return args, nil + + case '+': + cleanStr := strings.TrimSpace(line[1:]) + return []string{cleanStr}, nil - args = append(args, string(buf)) + default: + return nil, fmt.Errorf("unknown command type: %c", line[0]) } - return args, nil } func handleConnection(conn net.Conn) { defer conn.Close() -- cgit v1.2.3