Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
hiredis
Commits
af8ba74c
Commit
af8ba74c
authored
Sep 21, 2010
by
Pieter Noordhuis
Browse files
Rename functions to be more consistent, split feed from get reply
parent
b1bedf5c
Changes
3
Hide whitespace changes
Inline
Side-by-side
hiredis.c
View file @
af8ba74c
...
...
@@ -374,7 +374,7 @@ static int processItem(redisReader *r) {
#define READ_BUFFER_SIZE 2048
static
redisReply
*
redisReadReply
(
int
fd
)
{
void
*
reader
=
redis
Create
ReplyReader
(
&
defaultFunctions
);
void
*
reader
=
redisReplyReader
Create
(
&
defaultFunctions
);
redisReply
*
reply
;
char
buf
[
1024
];
int
nread
;
...
...
@@ -384,15 +384,16 @@ static redisReply *redisReadReply(int fd) {
reply
=
createErrorObject
(
reader
,
"I/O error"
);
break
;
}
else
{
reply
=
redisFeedReplyReader
(
reader
,
buf
,
nread
);
redisReplyReaderFeed
(
reader
,
buf
,
nread
);
reply
=
redisReplyReaderGetReply
(
reader
);
}
}
while
(
reply
==
NULL
);
redis
Free
ReplyReader
(
reader
);
redisReplyReader
Free
(
reader
);
return
reply
;
}
void
*
redis
Create
ReplyReader
(
redisReplyFunctions
*
fn
)
{
void
*
redisReplyReader
Create
(
redisReplyFunctions
*
fn
)
{
redisReader
*
r
=
calloc
(
sizeof
(
redisReader
),
1
);
r
->
fn
=
fn
==
NULL
?
&
defaultFunctions
:
fn
;
r
->
buf
=
sdsempty
();
...
...
@@ -404,12 +405,12 @@ void *redisCreateReplyReader(redisReplyFunctions *fn) {
* variable while the reply is built up. When the reader contains an
* object in between receiving some bytes to parse, this object might
* otherwise be free'd by garbage collection. */
void
*
redis
Get
Reply
ObjectFromReplyReader
(
void
*
reader
)
{
void
*
redisReply
ReaderGetObject
(
void
*
reader
)
{
redisReader
*
r
=
reader
;
return
r
->
reply
;
}
void
redis
Free
ReplyReader
(
void
*
reader
)
{
void
redisReplyReader
Free
(
void
*
reader
)
{
redisReader
*
r
=
reader
;
if
(
r
->
reply
!=
NULL
)
r
->
fn
->
freeObject
(
r
->
reply
);
...
...
@@ -420,13 +421,6 @@ void redisFreeReplyReader(void *reader) {
free
(
r
);
}
int
redisIsReplyReaderEmpty
(
void
*
reader
)
{
redisReader
*
r
=
reader
;
if
((
r
->
buf
!=
NULL
&&
sdslen
(
r
->
buf
)
>
0
)
||
(
r
->
rpos
<
r
->
rlen
))
return
0
;
return
1
;
}
static
void
redisSetReplyReaderError
(
redisReader
*
r
,
void
*
obj
)
{
if
(
r
->
reply
!=
NULL
)
r
->
fn
->
freeObject
(
r
->
reply
);
...
...
@@ -441,16 +435,20 @@ static void redisSetReplyReaderError(redisReader *r, void *obj) {
r
->
reply
=
obj
;
}
void
*
redis
Feed
ReplyReader
(
void
*
reader
,
char
*
buf
,
int
len
)
{
void
redisReplyReader
Feed
(
void
*
reader
,
char
*
buf
,
int
len
)
{
redisReader
*
r
=
reader
;
/* Check if we are able to do *something*. */
if
(
sdslen
(
r
->
buf
)
==
0
&&
(
buf
==
NULL
||
len
<=
0
))
return
NULL
;
/* Copy the provided buffer. */
if
(
buf
!=
NULL
&&
len
>=
1
)
r
->
buf
=
sdscatlen
(
r
->
buf
,
buf
,
len
);
}
void
*
redisReplyReaderGetReply
(
void
*
reader
)
{
redisReader
*
r
=
reader
;
/* When the buffer is empty, there will never be a reply. */
if
(
sdslen
(
r
->
buf
)
==
0
)
return
NULL
;
/* Create first item to process when the item list is empty. */
if
(
r
->
rlen
==
0
)
{
...
...
hiredis.h
View file @
af8ba74c
...
...
@@ -66,10 +66,10 @@ typedef struct redisReplyObjectFunctions {
redisReply
*
redisConnect
(
int
*
fd
,
const
char
*
ip
,
int
port
);
void
freeReplyObject
(
void
*
reply
);
redisReply
*
redisCommand
(
int
fd
,
const
char
*
format
,
...);
void
*
redis
Create
ReplyReader
(
redisReplyFunctions
*
fn
);
void
*
redis
Get
Reply
ObjectFromReplyReader
(
void
*
reader
);
void
redis
Free
ReplyReader
(
void
*
ptr
);
int
redis
Is
ReplyReader
Empty
(
void
*
ptr
);
void
*
redis
Feed
ReplyReader
(
void
*
reader
,
char
*
buf
,
int
len
);
void
*
redisReplyReader
Create
(
redisReplyFunctions
*
fn
);
void
*
redisReply
ReaderGetObject
(
void
*
reader
);
void
redisReplyReader
Free
(
void
*
ptr
);
void
redisReplyReader
Feed
(
void
*
reader
,
char
*
buf
,
int
len
);
void
*
redisReplyReader
GetReply
(
void
*
reader
);
#endif
test.c
View file @
af8ba74c
...
...
@@ -124,24 +124,26 @@ int main(void) {
freeReplyObject
(
reply
);
test
(
"Error handling in reply parser: "
);
reader
=
redisCreateReplyReader
(
NULL
);
reply
=
redisFeedReplyReader
(
reader
,(
char
*
)
"@foo
\r\n
"
,
6
);
reader
=
redisReplyReaderCreate
(
NULL
);
redisReplyReaderFeed
(
reader
,(
char
*
)
"@foo
\r\n
"
,
6
);
reply
=
redisReplyReaderGetReply
(
reader
);
test_cond
(
reply
->
type
==
REDIS_PROTOCOL_ERROR
&&
strcasecmp
(
reply
->
reply
,
"protocol error, got
\"
@
\"
as reply type byte"
)
==
0
);
freeReplyObject
(
reply
);
redis
Free
ReplyReader
(
reader
);
redisReplyReader
Free
(
reader
);
/* when the reply already contains multiple items, they must be free'd
* on an error. valgrind will bark when this doesn't happen. */
test
(
"Memory cleanup in reply parser: "
);
reader
=
redisCreateReplyReader
(
NULL
);
redisFeedReplyReader
(
reader
,(
char
*
)
"*2
\r\n
"
,
4
);
redisFeedReplyReader
(
reader
,(
char
*
)
"$5
\r\n
hello
\r\n
"
,
11
);
reply
=
redisFeedReplyReader
(
reader
,(
char
*
)
"@foo
\r\n
"
,
6
);
reader
=
redisReplyReaderCreate
(
NULL
);
redisReplyReaderFeed
(
reader
,(
char
*
)
"*2
\r\n
"
,
4
);
redisReplyReaderFeed
(
reader
,(
char
*
)
"$5
\r\n
hello
\r\n
"
,
11
);
redisReplyReaderFeed
(
reader
,(
char
*
)
"@foo
\r\n
"
,
6
);
reply
=
redisReplyReaderGetReply
(
reader
);
test_cond
(
reply
->
type
==
REDIS_PROTOCOL_ERROR
&&
strcasecmp
(
reply
->
reply
,
"protocol error, got
\"
@
\"
as reply type byte"
)
==
0
);
freeReplyObject
(
reply
);
redis
Free
ReplyReader
(
reader
);
redisReplyReader
Free
(
reader
);
test
(
"Throughput:
\n
"
);
for
(
i
=
0
;
i
<
500
;
i
++
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment