Skip to content

Commit 3f93498

Browse files
committed
Cleans up parseByPrefix code - helps speed
1 parent a2c2e52 commit 3f93498

File tree

1 file changed

+23
-37
lines changed

1 file changed

+23
-37
lines changed

Sources/SwiftRedis/RedisResp.swift

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -114,54 +114,40 @@ class RedisResp {
114114
private func parseByPrefix(_ buffer: inout Data, from: Int) throws -> (RedisResponse, Int) {
115115
var response: RedisResponse
116116

117-
var (matched, offset) = try compare(&buffer, at: from, with: RedisResp.plus)
118-
119-
if matched {
120-
(response, offset) = try parseSimpleString(&buffer, offset: offset)
121-
} else {
122-
(matched, offset) = try compare(&buffer, at: from, with: RedisResp.colon)
123-
if matched {
124-
(response, offset) = try parseInteger(&buffer, offset: offset)
125-
} else {
126-
(matched, offset) = try compare(&buffer, at: from, with: RedisResp.dollar)
127-
if matched {
128-
(response, offset) = try parseBulkString(&buffer, offset: offset)
129-
} else {
130-
(matched, offset) = try compare(&buffer, at: from, with: RedisResp.asterisk)
131-
if matched {
132-
(response, offset) = try parseArray(&buffer, offset: offset)
133-
} else {
134-
(matched, offset) = try compare(&buffer, at: from, with: RedisResp.minus)
135-
if matched {
136-
(response, offset) = try parseError(&buffer, offset: offset)
137-
} else {
138-
response = RedisResponse.Error("Unknown response type")
139-
}
140-
}
141-
}
117+
var offset = from
118+
119+
while offset+1 >= buffer.count {
120+
let length = try socket?.read(into: &buffer)
121+
122+
if length == 0 {
123+
throw RedisRespError(code: .EOF)
142124
}
143125
}
126+
127+
switch (buffer[offset..<offset+1]){
128+
case RedisResp.plus:
129+
(response, offset) = try parseSimpleString(&buffer, offset: offset+1)
130+
case RedisResp.colon:
131+
(response, offset) = try parseInteger(&buffer, offset: offset+1)
132+
case RedisResp.dollar:
133+
(response, offset) = try parseBulkString(&buffer, offset: offset+1)
134+
case RedisResp.asterisk:
135+
(response, offset) = try parseArray(&buffer, offset: offset+1)
136+
case RedisResp.minus:
137+
(response, offset) = try parseError(&buffer, offset: offset+1)
138+
default:
139+
response = RedisResponse.Error("Unknown response type")
140+
}
144141
return (response, offset)
145142
}
146143

147-
/*
148-
Arrays usually need to parse bulk strings. And the longer the array, the more optimization is needed. So to save processing
149-
time, check the $ first. (https://redis.io/topics/protocol)
150-
*/
151-
private func parseByPrefixArrayOptimization(_ buffer: inout Data, from: Int) throws -> (RedisResponse, Int) {
152-
let (matched, offset) = try compare(&buffer, at: from, with: RedisResp.dollar)
153-
if matched {
154-
return try parseBulkString(&buffer, offset: offset)
155-
}
156-
return try parseByPrefix(&buffer, from: offset)
157-
}
158144
private func parseArray(_ buffer: inout Data, offset: Int) throws -> (RedisResponse, Int) {
159145
var (arrayLength, newOffset) = try parseIntegerValue(&buffer, offset: offset)
160146
var responses = [RedisResponse]()
161147
var response: RedisResponse
162148
if arrayLength >= 0 {
163149
for _ in 0 ..< Int(arrayLength) {
164-
(response, newOffset) = try parseByPrefixArrayOptimization(&buffer, from: newOffset)
150+
(response, newOffset) = try parseByPrefix(&buffer, from: newOffset)
165151
responses.append(response)
166152
}
167153
return (RedisResponse.Array(responses), newOffset)

0 commit comments

Comments
 (0)