Skip to content

Commit 94f2d64

Browse files
refactor: use bufio to do reading and writing
1 parent f626262 commit 94f2d64

File tree

12 files changed

+374
-115
lines changed

12 files changed

+374
-115
lines changed

command/command.go

Lines changed: 6 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ import (
44
"bytes"
55
"fmt"
66
"github.com/medusar/lucas/protocol"
7-
"log"
8-
"sort"
97
"strings"
108
"time"
119
)
@@ -27,49 +25,24 @@ type RedisCmdInfo struct {
2725
Step int
2826
}
2927

30-
//
31-
//func (r RedisCmdInfo) Encode() *protocol.RespArray {
32-
// resp := &protocol.RespArray{
33-
// Data: []protocol.RespData{
34-
// &protocol.RespSimpleString{Data: r.Name},
35-
// &protocol.RespInteger{Data: r.Arity},
36-
// &protocol.RespArray{
37-
// Data: encodeFlags(r.Flags),
38-
// },
39-
// &protocol.RespInteger{Data: r.FirstKey},
40-
// &protocol.RespInteger{Data: r.LastKey},
41-
// &protocol.RespInteger{Data: r.Step},
42-
// },
43-
// }
44-
// return resp
45-
//}
46-
//
47-
//func encodeFlags(flags []string) []protocol.RespData {
48-
// var resp []protocol.RespData
49-
// for _, f := range flags {
50-
// resp = append(resp, &protocol.RespSimpleString{Data: f})
51-
// }
52-
// return resp
53-
//}
54-
5528
type RedisCmd struct {
5629
Name string
5730
Args []string
5831
}
5932

6033
type invoker struct {
6134
rc *RedisCmd
62-
con *protocol.RedisConn
35+
con protocol.RedisRW
6336
}
6437

65-
type cmdFunc func(args []string, r *protocol.RedisConn) error
38+
type cmdFunc func(args []string, r protocol.RedisRW) error
6639

6740
var (
6841
cmdFuncMap = make(map[string]cmdFunc)
6942
)
7043

71-
var commandFunc = func(args []string, r *protocol.RedisConn) error {
72-
return r.WriteString("OK") //TODO
44+
var commandFunc = func(args []string, r protocol.RedisRW) error {
45+
return r.WriteString("OK") //TODO: implement COMMAND
7346
}
7447

7548
func init() {
@@ -162,13 +135,6 @@ func init() {
162135
cmdFuncMap["zrem"] = WithTime(zremFunc)
163136
cmdFuncMap["zscore"] = WithTime(zscoreFunc)
164137
cmdFuncMap["zrevrank"] = WithTime(zrevrankFunc)
165-
166-
keys := make([]string, 0)
167-
for key := range cmdFuncMap {
168-
keys = append(keys, key)
169-
}
170-
sort.Strings(keys)
171-
log.Printf("supported commands: %s \r\n", strings.Join(keys, ", "))
172138
}
173139

174140
func LoopAndInvoke() {
@@ -182,7 +148,7 @@ func LoopAndInvoke() {
182148
}
183149
}
184150

185-
func Execute(r *protocol.RedisConn, c *RedisCmd) error {
151+
func Execute(r protocol.RedisRW, c *RedisCmd) error {
186152
select {
187153
case invokerChan <- &invoker{rc: c, con: r}:
188154
return nil
@@ -213,7 +179,7 @@ func ParseRequest(reqs []string) (*RedisCmd, error) {
213179
return &RedisCmd{Name: name}, nil
214180
}
215181

216-
func execCmd(r *protocol.RedisConn, c *RedisCmd) error {
182+
func execCmd(r protocol.RedisRW, c *RedisCmd) error {
217183
name := strings.ToLower(c.Name)
218184
f, ok := cmdFuncMap[name]
219185
if !ok {

command/connection.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package command
22

33
import "github.com/medusar/lucas/protocol"
44

5-
var pingFunc = func(args []string, r *protocol.RedisConn) error {
5+
var pingFunc = func(args []string, r protocol.RedisRW) error {
66
if len(args) != 0 && len(args) != 1 {
77
return r.WriteError("ERR wrong number of arguments for 'ping' command")
88
}

command/hashes.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
)
77

88
// https://redis.io/commands/hset
9-
var hsetFunc = func(args []string, r *protocol.RedisConn) error {
9+
var hsetFunc = func(args []string,r protocol.RedisRW) error {
1010
if len(args) < 3 || len(args)%2 != 1 {
1111
return r.WriteError("ERR wrong number of arguments for 'hset' command")
1212
}
@@ -25,7 +25,7 @@ var hsetFunc = func(args []string, r *protocol.RedisConn) error {
2525
}
2626

2727
//https://redis.io/commands/hget
28-
var hgetFunc = func(args []string, r *protocol.RedisConn) error {
28+
var hgetFunc = func(args []string,r protocol.RedisRW) error {
2929
if len(args) != 2 {
3030
return r.WriteError("ERR wrong number of arguments for 'hget' command")
3131
}
@@ -41,7 +41,7 @@ var hgetFunc = func(args []string, r *protocol.RedisConn) error {
4141
}
4242

4343
//https://redis.io/commands/hgetall
44-
var hgetAllFunc = func(args []string, r *protocol.RedisConn) error {
44+
var hgetAllFunc = func(args []string,r protocol.RedisRW) error {
4545
if len(args) != 1 {
4646
return r.WriteError("ERR wrong number of arguments for 'hgetall' command")
4747
}
@@ -57,7 +57,7 @@ var hgetAllFunc = func(args []string, r *protocol.RedisConn) error {
5757
}
5858

5959
//https://redis.io/commands/hkeys
60-
var hkeysFunc = func(args []string, r *protocol.RedisConn) error {
60+
var hkeysFunc = func(args []string,r protocol.RedisRW) error {
6161
if len(args) != 1 {
6262
return r.WriteError("ERR wrong number of arguments for 'hkeys' command")
6363
}
@@ -73,7 +73,7 @@ var hkeysFunc = func(args []string, r *protocol.RedisConn) error {
7373
}
7474

7575
//https://redis.io/commands/hlen
76-
var hlenFunc = func(args []string, r *protocol.RedisConn) error {
76+
var hlenFunc = func(args []string,r protocol.RedisRW) error {
7777
if len(args) != 1 {
7878
return r.WriteError("ERR wrong number of arguments for 'hlen' command")
7979
}
@@ -85,7 +85,7 @@ var hlenFunc = func(args []string, r *protocol.RedisConn) error {
8585
}
8686

8787
//https://redis.io/commands/hexists
88-
var hexistsFunc = func(args []string, r *protocol.RedisConn) error {
88+
var hexistsFunc = func(args []string,r protocol.RedisRW) error {
8989
if len(args) != 2 {
9090
return r.WriteError("ERR wrong number of arguments for 'hexists' command")
9191
}
@@ -97,7 +97,7 @@ var hexistsFunc = func(args []string, r *protocol.RedisConn) error {
9797
}
9898

9999
//https://redis.io/commands/hdel
100-
var hdelFunc = func(args []string, r *protocol.RedisConn) error {
100+
var hdelFunc = func(args []string,r protocol.RedisRW) error {
101101
if len(args) < 2 {
102102
return r.WriteError("ERR wrong number of arguments for 'hdel' command")
103103
}
@@ -109,7 +109,7 @@ var hdelFunc = func(args []string, r *protocol.RedisConn) error {
109109
}
110110

111111
//https://redis.io/commands/hmget
112-
var hmgetFunc = func(args []string, r *protocol.RedisConn) error {
112+
var hmgetFunc = func(args []string,r protocol.RedisRW) error {
113113
if len(args) < 2 {
114114
return r.WriteError("ERR wrong number of arguments for 'hmget' command")
115115
}
@@ -129,12 +129,12 @@ var hmgetFunc = func(args []string, r *protocol.RedisConn) error {
129129
}
130130

131131
//https://redis.io/commands/hmset
132-
var hmsetFunc = func(args []string, r *protocol.RedisConn) error {
132+
var hmsetFunc = func(args []string,r protocol.RedisRW) error {
133133
return r.WriteError("ERR 'hmset' is considered deprecated, please use 'hset' instead")
134134
}
135135

136136
//https://redis.io/commands/hsetnx
137-
var hsetnxFunc = func(args []string, r *protocol.RedisConn) error {
137+
var hsetnxFunc = func(args []string,r protocol.RedisRW) error {
138138
if len(args) != 3 {
139139
return r.WriteError("ERR wrong number of arguments for 'hsetnx' command")
140140
}
@@ -146,7 +146,7 @@ var hsetnxFunc = func(args []string, r *protocol.RedisConn) error {
146146
}
147147

148148
//https://redis.io/commands/hstrlen
149-
var hstrlenFunc = func(args []string, r *protocol.RedisConn) error {
149+
var hstrlenFunc = func(args []string,r protocol.RedisRW) error {
150150
if len(args) != 2 {
151151
return r.WriteError("ERR wrong number of arguments for 'hstrlen' command")
152152
}
@@ -158,7 +158,7 @@ var hstrlenFunc = func(args []string, r *protocol.RedisConn) error {
158158
}
159159

160160
//https://redis.io/commands/hvals
161-
var hvalsFunc = func(args []string, r *protocol.RedisConn) error {
161+
var hvalsFunc = func(args []string,r protocol.RedisRW) error {
162162
if len(args) != 1 {
163163
return r.WriteError("ERR wrong number of arguments for 'hvals' command")
164164
}
@@ -170,7 +170,7 @@ var hvalsFunc = func(args []string, r *protocol.RedisConn) error {
170170
}
171171

172172
//https://redis.io/commands/hincrby
173-
var hincrByFunc = func(args []string, r *protocol.RedisConn) error {
173+
var hincrByFunc = func(args []string,r protocol.RedisRW) error {
174174
if len(args) != 3 {
175175
return r.WriteError("ERR wrong number of arguments for 'hincrby' command")
176176
}
@@ -182,7 +182,7 @@ var hincrByFunc = func(args []string, r *protocol.RedisConn) error {
182182
}
183183

184184
//https://redis.io/commands/hincrbyfloat
185-
var hincrByFloatFunc = func(args []string, r *protocol.RedisConn) error {
185+
var hincrByFloatFunc = func(args []string,r protocol.RedisRW) error {
186186
if len(args) != 3 {
187187
return r.WriteError("ERR wrong number of arguments for 'hincrbyfloat' command")
188188
}

command/keys.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
"strconv"
77
)
88

9-
var ttlFunc = func(args []string, r *protocol.RedisConn) error {
9+
var ttlFunc = func(args []string,r protocol.RedisRW) error {
1010
var err error
1111
if len(args) != 1 {
1212
err = r.WriteError("ERR wrong number of arguments for 'ttl' command")
@@ -16,7 +16,7 @@ var ttlFunc = func(args []string, r *protocol.RedisConn) error {
1616
return r.WriteInteger(ttl)
1717
}
1818

19-
var expireFunc = func(args []string, r *protocol.RedisConn) error {
19+
var expireFunc = func(args []string,r protocol.RedisRW) error {
2020
if len(args) != 2 {
2121
return r.WriteError("ERR wrong number of arguments for 'expire' command")
2222
}
@@ -31,7 +31,7 @@ var expireFunc = func(args []string, r *protocol.RedisConn) error {
3131
return r.WriteInteger(0)
3232
}
3333

34-
var expireAtFunc = func(args []string, r *protocol.RedisConn) error {
34+
var expireAtFunc = func(args []string,r protocol.RedisRW) error {
3535
if len(args) != 2 {
3636
return r.WriteError("ERR wrong number of arguments for 'expire' command")
3737
}
@@ -48,7 +48,7 @@ var expireAtFunc = func(args []string, r *protocol.RedisConn) error {
4848
return r.WriteInteger(0)
4949
}
5050

51-
var keysFunc = func(args []string, r *protocol.RedisConn) error {
51+
var keysFunc = func(args []string,r protocol.RedisRW) error {
5252
if len(args) != 1 {
5353
return r.WriteError("ERR wrong number of arguments for 'keys' command")
5454
}
@@ -59,7 +59,7 @@ var keysFunc = func(args []string, r *protocol.RedisConn) error {
5959
return r.WriteArray(toBulkArray(keys))
6060
}
6161

62-
var existsFunc = func(args []string, r *protocol.RedisConn) error {
62+
var existsFunc = func(args []string,r protocol.RedisRW) error {
6363
if len(args) == 0 {
6464
return r.WriteError("ERR wrong number of arguments for 'exists' command")
6565
}
@@ -74,7 +74,7 @@ var existsFunc = func(args []string, r *protocol.RedisConn) error {
7474
return r.WriteInteger(total)
7575
}
7676

77-
var delFunc = func(args []string, r *protocol.RedisConn) error {
77+
var delFunc = func(args []string,r protocol.RedisRW) error {
7878
if len(args) == 0 {
7979
return r.WriteError("ERR wrong number of arguments for 'del' command")
8080
}
@@ -87,7 +87,7 @@ var delFunc = func(args []string, r *protocol.RedisConn) error {
8787
return r.WriteInteger(total)
8888
}
8989

90-
var typeFunc = func(args []string, r *protocol.RedisConn) error {
90+
var typeFunc = func(args []string,r protocol.RedisRW) error {
9191
if len(args) != 1 {
9292
return r.WriteError("ERR wrong number of arguments for 'type' command")
9393
}

command/lists.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
// https://redis.io/commands/lpush
10-
var lpushFunc = func(args []string, r *protocol.RedisConn) error {
10+
var lpushFunc = func(args []string,r protocol.RedisRW) error {
1111
if len(args) < 2 {
1212
return r.WriteError("ERR wrong number of arguments for 'lpush' command")
1313
}
@@ -19,7 +19,7 @@ var lpushFunc = func(args []string, r *protocol.RedisConn) error {
1919
}
2020

2121
//https://redis.io/commands/rpush
22-
var rpushFunc = func(args []string, r *protocol.RedisConn) error {
22+
var rpushFunc = func(args []string,r protocol.RedisRW) error {
2323
if len(args) < 2 {
2424
return r.WriteError("ERR wrong number of arguments for 'rpush' command")
2525
}
@@ -31,7 +31,7 @@ var rpushFunc = func(args []string, r *protocol.RedisConn) error {
3131
}
3232

3333
//https://redis.io/commands/llen
34-
var llenFunc = func(args []string, r *protocol.RedisConn) error {
34+
var llenFunc = func(args []string,r protocol.RedisRW) error {
3535
if len(args) != 1 {
3636
return r.WriteError("ERR wrong number of arguments for 'llen' command")
3737
}
@@ -43,7 +43,7 @@ var llenFunc = func(args []string, r *protocol.RedisConn) error {
4343
}
4444

4545
//https://redis.io/commands/lpop
46-
var lpopFunc = func(args []string, r *protocol.RedisConn) error {
46+
var lpopFunc = func(args []string,r protocol.RedisRW) error {
4747
if len(args) != 1 {
4848
return r.WriteError("ERR wrong number of arguments for 'lpop' command")
4949
}
@@ -58,7 +58,7 @@ var lpopFunc = func(args []string, r *protocol.RedisConn) error {
5858
}
5959

6060
//https://redis.io/commands/rpop
61-
var rpopFunc = func(args []string, r *protocol.RedisConn) error {
61+
var rpopFunc = func(args []string,r protocol.RedisRW) error {
6262
if len(args) != 1 {
6363
return r.WriteError("ERR wrong number of arguments for 'rpop' command")
6464
}
@@ -73,7 +73,7 @@ var rpopFunc = func(args []string, r *protocol.RedisConn) error {
7373
}
7474

7575
//https://redis.io/commands/lindex
76-
var lindexFunc = func(args []string, r *protocol.RedisConn) error {
76+
var lindexFunc = func(args []string,r protocol.RedisRW) error {
7777
if len(args) != 2 {
7878
return r.WriteError("ERR wrong number of arguments for 'lindex' command")
7979
}
@@ -94,7 +94,7 @@ var lindexFunc = func(args []string, r *protocol.RedisConn) error {
9494
}
9595

9696
//https://redis.io/commands/lrem
97-
var lremFunc = func(args []string, r *protocol.RedisConn) error {
97+
var lremFunc = func(args []string,r protocol.RedisRW) error {
9898
if len(args) != 3 {
9999
return r.WriteError("ERR wrong number of arguments for 'lrem' command")
100100
}
@@ -113,7 +113,7 @@ var lremFunc = func(args []string, r *protocol.RedisConn) error {
113113
}
114114

115115
//https://redis.io/commands/lset
116-
var lsetFunc = func(args []string, r *protocol.RedisConn) error {
116+
var lsetFunc = func(args []string,r protocol.RedisRW) error {
117117
if len(args) != 3 {
118118
return r.WriteError("ERR wrong number of arguments for 'lrem' command")
119119
}
@@ -132,7 +132,7 @@ var lsetFunc = func(args []string, r *protocol.RedisConn) error {
132132
}
133133

134134
//https://redis.io/commands/rpushx
135-
var rpushXFunc = func(args []string, r *protocol.RedisConn) error {
135+
var rpushXFunc = func(args []string,r protocol.RedisRW) error {
136136
if len(args) < 2 {
137137
return r.WriteError("ERR wrong number of arguments for 'rpushx' command")
138138
}
@@ -144,7 +144,7 @@ var rpushXFunc = func(args []string, r *protocol.RedisConn) error {
144144
}
145145

146146
//https://redis.io/commands/lpushx
147-
var lpushXFunc = func(args []string, r *protocol.RedisConn) error {
147+
var lpushXFunc = func(args []string,r protocol.RedisRW) error {
148148
if len(args) < 2 {
149149
return r.WriteError("ERR wrong number of arguments for 'lpushx' command")
150150
}
@@ -156,7 +156,7 @@ var lpushXFunc = func(args []string, r *protocol.RedisConn) error {
156156
}
157157

158158
//https://redis.io/commands/lrange
159-
var lrangeFunc = func(args []string, r *protocol.RedisConn) error {
159+
var lrangeFunc = func(args []string,r protocol.RedisRW) error {
160160
if len(args) != 3 {
161161
return r.WriteError("ERR wrong number of arguments for 'lrange' command")
162162
}

0 commit comments

Comments
 (0)