diff options
| author | alex <[email protected]> | 2026-07-04 22:33:25 +0200 |
|---|---|---|
| committer | alex <[email protected]> | 2026-07-04 22:33:25 +0200 |
| commit | ced1427b43d68fe0f40cdf3cb304b06eefd6153f (patch) | |
| tree | 97b5c7b74d4da562b9d52331d4ea78436bf4dd51 /main.go | |
| parent | 901e8a7bd85cdb6ba1e610a492aadfbdf5e26a39 (diff) | |
| download | redis-clone-ced1427b43d68fe0f40cdf3cb304b06eefd6153f.tar.xz redis-clone-ced1427b43d68fe0f40cdf3cb304b06eefd6153f.zip | |
added parsing of simple strings and fixed bug in INCR/DECR
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 64 |
1 files changed, 39 insertions, 25 deletions
@@ -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() |
