aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralex <[email protected]>2026-07-04 22:33:25 +0200
committeralex <[email protected]>2026-07-04 22:33:25 +0200
commitced1427b43d68fe0f40cdf3cb304b06eefd6153f (patch)
tree97b5c7b74d4da562b9d52331d4ea78436bf4dd51
parent901e8a7bd85cdb6ba1e610a492aadfbdf5e26a39 (diff)
downloadredis-clone-ced1427b43d68fe0f40cdf3cb304b06eefd6153f.tar.xz
redis-clone-ced1427b43d68fe0f40cdf3cb304b06eefd6153f.zip
added parsing of simple strings and fixed bug in INCR/DECR
-rw-r--r--main.go64
1 files changed, 39 insertions, 25 deletions
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()