Skip to content

Commit a52d738

Browse files
committed
end to end run
1 parent c28cc25 commit a52d738

File tree

5 files changed

+102
-21
lines changed

5 files changed

+102
-21
lines changed

Diff for: datastore/map.go

+7-10
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
1-
package storage
1+
package datastore
22

33
import (
44
"sync"
5-
"time"
65
)
76

8-
type ConcurrentMap struct{
7+
type ConcurrentMap struct {
98
sync.RWMutex
109
datastore map[string]string
1110
}
1211

1312
func NewKeyValueStore() *ConcurrentMap {
14-
kvStore := ConcurrentMap{
15-
datastore: make(map[string]string)
16-
}
13+
kvStore := ConcurrentMap{datastore: make(map[string]string)}
1714
return &kvStore
1815
}
1916

2017
func (kvStore *ConcurrentMap) Load(key string) (value string, ok bool) {
2118
kvStore.RLock()
2219
defer kvStore.RUnlock()
23-
result, ok := gcm.internal[key]
20+
result, ok := kvStore.datastore[key]
2421
return result, ok
2522
}
2623

@@ -35,13 +32,13 @@ func (kvStore *ConcurrentMap) Delete(key string) bool {
3532
kvStore.RLock()
3633
defer kvStore.RUnlock()
3734

38-
_ , ok := kvStore.datastore[key]
39-
if ok == false{
35+
_, ok := kvStore.datastore[key]
36+
if !ok {
4037
return false
4138
}
4239

4340
delete(kvStore.datastore, key)
4441

4542
return true
4643

47-
}
44+
}

Diff for: main.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"fmt"
55
"log"
6+
"my-redis-go/operations"
67
"my-redis-go/resp"
78
"net"
89
)
@@ -58,32 +59,40 @@ func (server *Server) establishConnection() {
5859

5960
func (server *Server) requestHandler(conn net.Conn) {
6061
defer conn.Close()
61-
buf := make([]byte, 2048)
6262
for {
63+
buf := make([]byte, 2048)
6364
n, err := conn.Read(buf)
6465
if err != nil {
66+
print("hello error")
6567
log.Fatal(err)
6668
}
6769
msg := buf[:n]
68-
69-
// echo := "HTTP/1.1 200 OK\r\n\r\n" + string(msg) + "\r\n"
70-
commands, totalBytes := resp.ParseRequest(msg)
71-
70+
// print("hello")
71+
// print(string(msg))
72+
// echo := "+OK\r\n"
73+
commands, _ := resp.ParseRequest(msg)
7274
for _, command := range commands {
7375
dataType, err := operations.ExecuteCommand(command)
76+
fmt.Println(dataType.ToString())
7477
if err != resp.EmptyRedisError {
78+
fmt.Println("else error")
7579
conn.Write([]byte(err.ToString() + "\n"))
7680
} else {
81+
fmt.Println("else")
7782
if dataType == nil {
83+
fmt.Println("else nil")
7884
conn.Write([]byte("(nil)" + "\n"))
7985
} else {
80-
conn.Write([]byte(dataType.ToString() + "\n"))
86+
fmt.Println("elsewow")
87+
out := fmt.Sprintf("$%d\r\n%s\r\n", len(dataType.ToString()), dataType.ToString())
88+
fmt.Println(out)
89+
conn.Write([]byte(out))
8190
}
8291
}
8392
}
8493

8594
// conn.Write([]byte(echo))
86-
log.Println("Done Writing!")
95+
// log.Println("Done Writing!")
8796
fmt.Println(string(msg))
8897
}
8998
}

Diff for: my-redis-go

-2.6 MB
Binary file not shown.

Diff for: operations/string.go

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package operations
2+
3+
import (
4+
"fmt"
5+
"my-redis-go/datastore"
6+
"my-redis-go/resp"
7+
)
8+
9+
const (
10+
getCommand = "GET"
11+
setCommand = "SET"
12+
command = "COMMAND"
13+
)
14+
15+
var kvStore = datastore.NewKeyValueStore()
16+
17+
func executeGetCommand(array *resp.Array) (resp.IDataType, resp.RedisError) {
18+
numberOfItems := array.GetNumberOfItems()
19+
20+
if numberOfItems == 1 {
21+
return nil, resp.NewDefaultRedisError("wrong number of arguments for (get) command")
22+
} else if numberOfItems > 2 {
23+
fmt.Printf("WARN: GET command acccepts only one argument. But received %d. Other arguments will be ignored\n", numberOfItems-1)
24+
}
25+
26+
key := array.GetItemAtIndex(1)
27+
28+
value, ok := kvStore.Load(key.ToString())
29+
if !ok {
30+
return resp.EmptyBulkString, resp.EmptyRedisError
31+
}
32+
bs, e := resp.NewBulkString(value)
33+
if e != nil {
34+
return nil, resp.NewDefaultRedisError(e.Error())
35+
}
36+
return bs, resp.EmptyRedisError
37+
}
38+
39+
func executeSetCommand(array *resp.Array) (resp.IDataType, resp.RedisError) {
40+
numberOfItems := array.GetNumberOfItems()
41+
42+
if numberOfItems <= 2 {
43+
return nil, resp.NewDefaultRedisError("wrong number of arguments for (get) command")
44+
} else if numberOfItems > 3 {
45+
fmt.Printf("WARN: SET command acccepts only two argument. But received %d. Other arguments will be ignored\n", numberOfItems-1)
46+
}
47+
48+
key := array.GetItemAtIndex(1)
49+
value := array.GetItemAtIndex(2)
50+
kvStore.Store(key.ToString(), value.ToString())
51+
52+
bs, e := resp.NewBulkString("OK")
53+
if e != nil {
54+
return nil, resp.NewDefaultRedisError(e.Error())
55+
}
56+
return bs, resp.EmptyRedisError
57+
}
58+
59+
func ExecuteCommand(array resp.Array) (resp.IDataType, resp.RedisError) {
60+
if array.GetNumberOfItems() == 0 {
61+
return nil, resp.NewDefaultRedisError("No command found")
62+
}
63+
first := array.GetItemAtIndex(0)
64+
switch first.ToString() {
65+
case getCommand:
66+
return executeGetCommand(&array)
67+
case setCommand:
68+
return executeSetCommand(&array)
69+
case command:
70+
fmt.Println("COM")
71+
bs, _ := resp.NewBulkString("OK")
72+
return bs, resp.EmptyRedisError
73+
default:
74+
break
75+
}
76+
return nil, resp.NewDefaultRedisError(fmt.Sprintf("Unknown or disabled command '%s'", first.ToString()))
77+
}

Diff for: resp/parser.go

+2-4
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,6 @@ func parseArray(bytes []byte) (*Array, int) {
215215
return array, arrReadLen + readLen
216216
}
217217

218-
219218
func getNextArrayStartIndex(bytes []byte) int {
220219
for i := 1; i < len(bytes); i++ {
221220
if bytes[i] == arrayStartByte {
@@ -225,9 +224,8 @@ func getNextArrayStartIndex(bytes []byte) int {
225224
return len(bytes)
226225
}
227226

228-
func ParseRequest(bytes []byte) (err RedisError) (command []Array, totalBytes int) {
229-
230-
commands = make([]Array, 0)
227+
func ParseRequest(bytes []byte) (command []Array, totalBytes int) {
228+
commands := make([]Array, 0)
231229
totalBytesRead := 0
232230

233231
for len(bytes) > 0 {

0 commit comments

Comments
 (0)