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) {
...
@@ -374,7 +374,7 @@ static int processItem(redisReader *r) {
#define READ_BUFFER_SIZE 2048
#define READ_BUFFER_SIZE 2048
static
redisReply
*
redisReadReply
(
int
fd
)
{
static
redisReply
*
redisReadReply
(
int
fd
)
{
void
*
reader
=
redis
Create
ReplyReader
(
&
defaultFunctions
);
void
*
reader
=
redisReplyReader
Create
(
&
defaultFunctions
);
redisReply
*
reply
;
redisReply
*
reply
;
char
buf
[
1024
];
char
buf
[
1024
];
int
nread
;
int
nread
;
...
@@ -384,15 +384,16 @@ static redisReply *redisReadReply(int fd) {
...
@@ -384,15 +384,16 @@ static redisReply *redisReadReply(int fd) {
reply
=
createErrorObject
(
reader
,
"I/O error"
);
reply
=
createErrorObject
(
reader
,
"I/O error"
);
break
;
break
;
}
else
{
}
else
{
reply
=
redisFeedReplyReader
(
reader
,
buf
,
nread
);
redisReplyReaderFeed
(
reader
,
buf
,
nread
);
reply
=
redisReplyReaderGetReply
(
reader
);
}
}
}
while
(
reply
==
NULL
);
}
while
(
reply
==
NULL
);
redis
Free
ReplyReader
(
reader
);
redisReplyReader
Free
(
reader
);
return
reply
;
return
reply
;
}
}
void
*
redis
Create
ReplyReader
(
redisReplyFunctions
*
fn
)
{
void
*
redisReplyReader
Create
(
redisReplyFunctions
*
fn
)
{
redisReader
*
r
=
calloc
(
sizeof
(
redisReader
),
1
);
redisReader
*
r
=
calloc
(
sizeof
(
redisReader
),
1
);
r
->
fn
=
fn
==
NULL
?
&
defaultFunctions
:
fn
;
r
->
fn
=
fn
==
NULL
?
&
defaultFunctions
:
fn
;
r
->
buf
=
sdsempty
();
r
->
buf
=
sdsempty
();
...
@@ -404,12 +405,12 @@ void *redisCreateReplyReader(redisReplyFunctions *fn) {
...
@@ -404,12 +405,12 @@ void *redisCreateReplyReader(redisReplyFunctions *fn) {
* variable while the reply is built up. When the reader contains an
* variable while the reply is built up. When the reader contains an
* object in between receiving some bytes to parse, this object might
* object in between receiving some bytes to parse, this object might
* otherwise be free'd by garbage collection. */
* otherwise be free'd by garbage collection. */
void
*
redis
Get
Reply
ObjectFromReplyReader
(
void
*
reader
)
{
void
*
redisReply
ReaderGetObject
(
void
*
reader
)
{
redisReader
*
r
=
reader
;
redisReader
*
r
=
reader
;
return
r
->
reply
;
return
r
->
reply
;
}
}
void
redis
Free
ReplyReader
(
void
*
reader
)
{
void
redisReplyReader
Free
(
void
*
reader
)
{
redisReader
*
r
=
reader
;
redisReader
*
r
=
reader
;
if
(
r
->
reply
!=
NULL
)
if
(
r
->
reply
!=
NULL
)
r
->
fn
->
freeObject
(
r
->
reply
);
r
->
fn
->
freeObject
(
r
->
reply
);
...
@@ -420,13 +421,6 @@ void redisFreeReplyReader(void *reader) {
...
@@ -420,13 +421,6 @@ void redisFreeReplyReader(void *reader) {
free
(
r
);
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
)
{
static
void
redisSetReplyReaderError
(
redisReader
*
r
,
void
*
obj
)
{
if
(
r
->
reply
!=
NULL
)
if
(
r
->
reply
!=
NULL
)
r
->
fn
->
freeObject
(
r
->
reply
);
r
->
fn
->
freeObject
(
r
->
reply
);
...
@@ -441,16 +435,20 @@ static void redisSetReplyReaderError(redisReader *r, void *obj) {
...
@@ -441,16 +435,20 @@ static void redisSetReplyReaderError(redisReader *r, void *obj) {
r
->
reply
=
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
;
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. */
/* Copy the provided buffer. */
if
(
buf
!=
NULL
&&
len
>=
1
)
if
(
buf
!=
NULL
&&
len
>=
1
)
r
->
buf
=
sdscatlen
(
r
->
buf
,
buf
,
len
);
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. */
/* Create first item to process when the item list is empty. */
if
(
r
->
rlen
==
0
)
{
if
(
r
->
rlen
==
0
)
{
...
...
hiredis.h
View file @
af8ba74c
...
@@ -66,10 +66,10 @@ typedef struct redisReplyObjectFunctions {
...
@@ -66,10 +66,10 @@ typedef struct redisReplyObjectFunctions {
redisReply
*
redisConnect
(
int
*
fd
,
const
char
*
ip
,
int
port
);
redisReply
*
redisConnect
(
int
*
fd
,
const
char
*
ip
,
int
port
);
void
freeReplyObject
(
void
*
reply
);
void
freeReplyObject
(
void
*
reply
);
redisReply
*
redisCommand
(
int
fd
,
const
char
*
format
,
...);
redisReply
*
redisCommand
(
int
fd
,
const
char
*
format
,
...);
void
*
redis
Create
ReplyReader
(
redisReplyFunctions
*
fn
);
void
*
redisReplyReader
Create
(
redisReplyFunctions
*
fn
);
void
*
redis
Get
Reply
ObjectFromReplyReader
(
void
*
reader
);
void
*
redisReply
ReaderGetObject
(
void
*
reader
);
void
redis
Free
ReplyReader
(
void
*
ptr
);
void
redisReplyReader
Free
(
void
*
ptr
);
int
redis
Is
ReplyReader
Empty
(
void
*
ptr
);
void
redisReplyReader
Feed
(
void
*
reader
,
char
*
buf
,
int
len
);
void
*
redis
Feed
ReplyReader
(
void
*
reader
,
char
*
buf
,
int
len
);
void
*
redisReplyReader
GetReply
(
void
*
reader
);
#endif
#endif
test.c
View file @
af8ba74c
...
@@ -124,24 +124,26 @@ int main(void) {
...
@@ -124,24 +124,26 @@ int main(void) {
freeReplyObject
(
reply
);
freeReplyObject
(
reply
);
test
(
"Error handling in reply parser: "
);
test
(
"Error handling in reply parser: "
);
reader
=
redisCreateReplyReader
(
NULL
);
reader
=
redisReplyReaderCreate
(
NULL
);
reply
=
redisFeedReplyReader
(
reader
,(
char
*
)
"@foo
\r\n
"
,
6
);
redisReplyReaderFeed
(
reader
,(
char
*
)
"@foo
\r\n
"
,
6
);
reply
=
redisReplyReaderGetReply
(
reader
);
test_cond
(
reply
->
type
==
REDIS_PROTOCOL_ERROR
&&
test_cond
(
reply
->
type
==
REDIS_PROTOCOL_ERROR
&&
strcasecmp
(
reply
->
reply
,
"protocol error, got
\"
@
\"
as reply type byte"
)
==
0
);
strcasecmp
(
reply
->
reply
,
"protocol error, got
\"
@
\"
as reply type byte"
)
==
0
);
freeReplyObject
(
reply
);
freeReplyObject
(
reply
);
redis
Free
ReplyReader
(
reader
);
redisReplyReader
Free
(
reader
);
/* when the reply already contains multiple items, they must be free'd
/* when the reply already contains multiple items, they must be free'd
* on an error. valgrind will bark when this doesn't happen. */
* on an error. valgrind will bark when this doesn't happen. */
test
(
"Memory cleanup in reply parser: "
);
test
(
"Memory cleanup in reply parser: "
);
reader
=
redisCreateReplyReader
(
NULL
);
reader
=
redisReplyReaderCreate
(
NULL
);
redisFeedReplyReader
(
reader
,(
char
*
)
"*2
\r\n
"
,
4
);
redisReplyReaderFeed
(
reader
,(
char
*
)
"*2
\r\n
"
,
4
);
redisFeedReplyReader
(
reader
,(
char
*
)
"$5
\r\n
hello
\r\n
"
,
11
);
redisReplyReaderFeed
(
reader
,(
char
*
)
"$5
\r\n
hello
\r\n
"
,
11
);
reply
=
redisFeedReplyReader
(
reader
,(
char
*
)
"@foo
\r\n
"
,
6
);
redisReplyReaderFeed
(
reader
,(
char
*
)
"@foo
\r\n
"
,
6
);
reply
=
redisReplyReaderGetReply
(
reader
);
test_cond
(
reply
->
type
==
REDIS_PROTOCOL_ERROR
&&
test_cond
(
reply
->
type
==
REDIS_PROTOCOL_ERROR
&&
strcasecmp
(
reply
->
reply
,
"protocol error, got
\"
@
\"
as reply type byte"
)
==
0
);
strcasecmp
(
reply
->
reply
,
"protocol error, got
\"
@
\"
as reply type byte"
)
==
0
);
freeReplyObject
(
reply
);
freeReplyObject
(
reply
);
redis
Free
ReplyReader
(
reader
);
redisReplyReader
Free
(
reader
);
test
(
"Throughput:
\n
"
);
test
(
"Throughput:
\n
"
);
for
(
i
=
0
;
i
<
500
;
i
++
)
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