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
redis
Commits
bd79a6bd
Commit
bd79a6bd
authored
Apr 16, 2010
by
Pieter Noordhuis
Browse files
refactor code that retrieves value from object or replies to client
parent
4e8dbaf4
Changes
1
Show whitespace changes
Inline
Side-by-side
redis.c
View file @
bd79a6bd
...
@@ -3104,74 +3104,100 @@ static size_t stringObjectLen(robj *o) {
...
@@ -3104,74 +3104,100 @@ static size_t stringObjectLen(robj *o) {
}
}
}
}
static
int
getDoubleFromObject
(
redisClient
*
c
,
robj
*
o
,
double
*
value
)
{
static int getDoubleFromObject(robj *o, double *
target
) {
double
parsedV
alue
;
double
v
alue;
char *eptr = NULL;
char *eptr = NULL;
if
(
o
&&
o
->
type
!=
REDIS_STRING
)
{
if (o == NULL) {
addReplySds
(
c
,
sdsnew
(
"-ERR value is not a double
\r\n
"
));
value = 0;
} else {
redisAssert(o->type == REDIS_STRING);
if (o->encoding == REDIS_ENCODING_RAW) {
value = strtod(o->ptr, &eptr);
} else if (o->encoding == REDIS_ENCODING_INT) {
value = (long)o->ptr;
} else {
redisAssert(1 != 1);
}
}
if (eptr != NULL && eptr[0] != '\0') {
return REDIS_ERR;
return REDIS_ERR;
}
}
if
(
o
==
NULL
)
*target = value;
parsedValue
=
0
;
return REDIS_OK;
else
if
(
o
->
encoding
==
REDIS_ENCODING_RAW
)
}
parsedValue
=
strtod
(
o
->
ptr
,
&
eptr
);
else
if
(
o
->
encoding
==
REDIS_ENCODING_INT
)
parsedValue
=
(
long
)
o
->
ptr
;
else
redisAssert
(
1
!=
1
);
if
(
eptr
!=
NULL
&&
*
eptr
!=
'\0'
)
{
static int getDoubleFromObjectOrReply(redisClient *c, robj *o, double *target, const char *msg) {
addReplySds
(
c
,
sdsnew
(
"-ERR value is not a double
\r\n
"
));
double value;
if (getDoubleFromObject(o, &value) != REDIS_OK) {
if (msg != NULL) {
addReplySds(c, sdscatprintf(sdsempty(), "-ERR %s\r\n", msg));
} else {
addReplySds(c, sdsnew("-ERR value is not a double\r\n"));
}
return REDIS_ERR;
return REDIS_ERR;
}
}
*
value
=
parsedValue
;
*target = value;
return REDIS_OK;
return REDIS_OK;
}
}
static
int
getLongLongFromObject
(
redisClient
*
c
,
robj
*
o
,
long
long
*
value
)
{
static int getLongLongFromObject(robj *o, long long *
target
) {
long
long
parsedV
alue
;
long long
v
alue;
char *eptr = NULL;
char *eptr = NULL;
if
(
o
&&
o
->
type
!=
REDIS_STRING
)
{
if (o == NULL) {
addReplySds
(
c
,
sdsnew
(
"-ERR value is not an integer
\r\n
"
));
value = 0;
} else {
redisAssert(o->type == REDIS_STRING);
if (o->encoding == REDIS_ENCODING_RAW) {
value = strtoll(o->ptr, &eptr, 10);
} else if (o->encoding == REDIS_ENCODING_INT) {
value = (long)o->ptr;
} else {
redisAssert(1 != 1);
}
}
if (eptr != NULL && eptr[0] != '\0') {
return REDIS_ERR;
return REDIS_ERR;
}
}
if
(
o
==
NULL
)
*target = value;
parsedValue
=
0
;
return REDIS_OK;
else
if
(
o
->
encoding
==
REDIS_ENCODING_RAW
)
}
parsedValue
=
strtoll
(
o
->
ptr
,
&
eptr
,
10
);
else
if
(
o
->
encoding
==
REDIS_ENCODING_INT
)
parsedValue
=
(
long
)
o
->
ptr
;
else
redisAssert
(
1
!=
1
);
if
(
eptr
!=
NULL
&&
*
eptr
!=
'\0'
)
{
static int getLongLongFromObjectOrReply(redisClient *c, robj *o, long long *target, const char *msg) {
addReplySds
(
c
,
sdsnew
(
"-ERR value is not an integer
\r\n
"
));
long long value;
if (getLongLongFromObject(o, &value) != REDIS_OK) {
if (msg != NULL) {
addReplySds(c, sdscatprintf(sdsempty(), "-ERR %s\r\n", msg));
} else {
addReplySds(c, sdsnew("-ERR value is not an integer\r\n"));
}
return REDIS_ERR;
return REDIS_ERR;
}
}
*
value
=
parsedValue
;
*target = value;
return REDIS_OK;
return REDIS_OK;
}
}
static
int
getLongFromObject
(
redisClient
*
c
,
robj
*
o
,
long
*
value
)
{
static int getLongFromObjectOrReply(redisClient *c, robj *o, long *target, const char *msg) {
long
long
actualValue
;
long long value;
if
(
getLongLongFromObject
(
c
,
o
,
&
actualValue
)
!=
REDIS_OK
)
return
REDIS_ERR
;
if
(
actualValue
<
LONG_MIN
||
actualValue
>
LONG_MAX
)
{
if (getLongLongFromObjectOrReply(c, o, &value, msg) != REDIS_OK) return REDIS_ERR;
addReplySds
(
c
,
sdsnew
(
"-ERR value is out of range
\r\n
"
));
if (value < LONG_MIN || value > LONG_MAX) {
if (msg != NULL) {
addReplySds(c, sdscatprintf(sdsempty(), "-ERR %s\r\n", msg));
} else {
addReplySds(c, sdsnew("-ERR value is out of range\r\n"));
}
return REDIS_ERR;
return REDIS_ERR;
}
}
*
value
=
actualValue
;
*target = value;
return REDIS_OK;
return REDIS_OK;
}
}
...
@@ -4061,7 +4087,7 @@ static void incrDecrCommand(redisClient *c, long long incr) {
...
@@ -4061,7 +4087,7 @@ static void incrDecrCommand(redisClient *c, long long incr) {
o = lookupKeyWrite(c->db,c->argv[1]);
o = lookupKeyWrite(c->db,c->argv[1]);
if
(
getLongLongFromObject
(
c
,
o
,
&
value
)
!=
REDIS_OK
)
return
;
if (getLongLongFromObject
OrReply
(c, o, &value
, NULL
) != REDIS_OK) return;
value += incr;
value += incr;
o = createObject(REDIS_STRING,sdscatprintf(sdsempty(),"%lld",value));
o = createObject(REDIS_STRING,sdscatprintf(sdsempty(),"%lld",value));
...
@@ -4090,16 +4116,14 @@ static void decrCommand(redisClient *c) {
...
@@ -4090,16 +4116,14 @@ static void decrCommand(redisClient *c) {
static void incrbyCommand(redisClient *c) {
static void incrbyCommand(redisClient *c) {
long long incr;
long long incr;
if
(
getLongLongFromObject
(
c
,
c
->
argv
[
2
],
&
incr
)
!=
REDIS_OK
)
return
;
if (getLongLongFromObjectOrReply(c, c->argv[2], &incr, NULL) != REDIS_OK) return;
incrDecrCommand(c,incr);
incrDecrCommand(c,incr);
}
}
static void decrbyCommand(redisClient *c) {
static void decrbyCommand(redisClient *c) {
long long incr;
long long incr;
if
(
getLongLongFromObject
(
c
,
c
->
argv
[
2
],
&
incr
)
!=
REDIS_OK
)
return
;
if (getLongLongFromObjectOrReply(c, c->argv[2], &incr, NULL) != REDIS_OK) return;
incrDecrCommand(c,-incr);
incrDecrCommand(c,-incr);
}
}
...
@@ -5497,16 +5521,14 @@ static void zaddGenericCommand(redisClient *c, robj *key, robj *ele, double scor
...
@@ -5497,16 +5521,14 @@ static void zaddGenericCommand(redisClient *c, robj *key, robj *ele, double scor
static void zaddCommand(redisClient *c) {
static void zaddCommand(redisClient *c) {
double scoreval;
double scoreval;
if
(
getDoubleFromObject
(
c
,
c
->
argv
[
2
],
&
scoreval
)
!=
REDIS_OK
)
return
;
if (getDoubleFromObjectOrReply(c, c->argv[2], &scoreval, NULL) != REDIS_OK) return;
zaddGenericCommand(c,c->argv[1],c->argv[3],scoreval,0);
zaddGenericCommand(c,c->argv[1],c->argv[3],scoreval,0);
}
}
static void zincrbyCommand(redisClient *c) {
static void zincrbyCommand(redisClient *c) {
double scoreval;
double scoreval;
if
(
getDoubleFromObject
(
c
,
c
->
argv
[
2
],
&
scoreval
)
!=
REDIS_OK
)
return
;
if (getDoubleFromObjectOrReply(c, c->argv[2], &scoreval, NULL) != REDIS_OK) return;
zaddGenericCommand(c,c->argv[1],c->argv[3],scoreval,1);
zaddGenericCommand(c,c->argv[1],c->argv[3],scoreval,1);
}
}
...
@@ -5546,8 +5568,8 @@ static void zremrangebyscoreCommand(redisClient *c) {
...
@@ -5546,8 +5568,8 @@ static void zremrangebyscoreCommand(redisClient *c) {
robj *zsetobj;
robj *zsetobj;
zset *zs;
zset *zs;
if
((
getDoubleFromObject
(
c
,
c
->
argv
[
2
],
&
min
)
!=
REDIS_OK
)
||
if ((getDoubleFromObject
OrReply
(c, c->argv[2], &min
, NULL
) != REDIS_OK) ||
(
getDoubleFromObject
(
c
,
c
->
argv
[
3
],
&
max
)
!=
REDIS_OK
))
return
;
(getDoubleFromObject
OrReply
(c, c->argv[3], &max
, NULL
) != REDIS_OK)) return;
if ((zsetobj = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL ||
if ((zsetobj = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,zsetobj,REDIS_ZSET)) return;
checkType(c,zsetobj,REDIS_ZSET)) return;
...
@@ -5568,8 +5590,8 @@ static void zremrangebyrankCommand(redisClient *c) {
...
@@ -5568,8 +5590,8 @@ static void zremrangebyrankCommand(redisClient *c) {
robj *zsetobj;
robj *zsetobj;
zset *zs;
zset *zs;
if
((
getLongFromObject
(
c
,
c
->
argv
[
2
],
&
start
)
!=
REDIS_OK
)
||
if ((getLongFromObject
OrReply
(c, c->argv[2], &start
, NULL
) != REDIS_OK) ||
(
getLongFromObject
(
c
,
c
->
argv
[
3
],
&
end
)
!=
REDIS_OK
))
return
;
(getLongFromObject
OrReply
(c, c->argv[3], &end
, NULL
) != REDIS_OK)) return;
if ((zsetobj = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL ||
if ((zsetobj = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,zsetobj,REDIS_ZSET)) return;
checkType(c,zsetobj,REDIS_ZSET)) return;
...
@@ -5677,7 +5699,7 @@ static void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
...
@@ -5677,7 +5699,7 @@ static void zunionInterGenericCommand(redisClient *c, robj *dstkey, int op) {
if (remaining >= (zsetnum + 1) && !strcasecmp(c->argv[j]->ptr,"weights")) {
if (remaining >= (zsetnum + 1) && !strcasecmp(c->argv[j]->ptr,"weights")) {
j++; remaining--;
j++; remaining--;
for (i = 0; i < zsetnum; i++, j++, remaining--) {
for (i = 0; i < zsetnum; i++, j++, remaining--) {
if
(
getDoubleFromObject
(
c
,
c
->
argv
[
j
],
&
src
[
i
].
weight
)
!=
REDIS_OK
)
if (getDoubleFromObject
OrReply
(c, c->argv[j], &src[i].weight
, NULL
) != REDIS_OK)
return;
return;
}
}
} else if (remaining >= 2 && !strcasecmp(c->argv[j]->ptr,"aggregate")) {
} else if (remaining >= 2 && !strcasecmp(c->argv[j]->ptr,"aggregate")) {
...
@@ -5810,8 +5832,8 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
...
@@ -5810,8 +5832,8 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
zskiplistNode *ln;
zskiplistNode *ln;
robj *ele;
robj *ele;
if
((
getLongFromObject
(
c
,
c
->
argv
[
2
],
&
start
)
!=
REDIS_OK
)
||
if ((getLongFromObject
OrReply
(c, c->argv[2], &start
, NULL
) != REDIS_OK) ||
(
getLongFromObject
(
c
,
c
->
argv
[
3
],
&
end
)
!=
REDIS_OK
))
return
;
(getLongFromObject
OrReply
(c, c->argv[3], &end
, NULL
) != REDIS_OK)) return;
if (c->argc == 5 && !strcasecmp(c->argv[4]->ptr,"withscores")) {
if (c->argc == 5 && !strcasecmp(c->argv[4]->ptr,"withscores")) {
withscores = 1;
withscores = 1;
...
@@ -6318,7 +6340,7 @@ static void hincrbyCommand(redisClient *c) {
...
@@ -6318,7 +6340,7 @@ static void hincrbyCommand(redisClient *c) {
long long value, incr;
long long value, incr;
robj *o, *current, *new;
robj *o, *current, *new;
if
(
getLongLongFromObject
(
c
,
c
->
argv
[
3
],
&
incr
)
!=
REDIS_OK
)
return
;
if (getLongLongFromObject
OrReply
(c,c->argv[3],&incr
,NULL
) != REDIS_OK) return;
if ((o = hashLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
if ((o = hashLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
if ((current = hashGet(o,c->argv[2])) != NULL) {
if ((current = hashGet(o,c->argv[2])) != NULL) {
if (current->encoding == REDIS_ENCODING_RAW)
if (current->encoding == REDIS_ENCODING_RAW)
...
@@ -7096,7 +7118,7 @@ static void expireGenericCommand(redisClient *c, robj *key, robj *param, long of
...
@@ -7096,7 +7118,7 @@ static void expireGenericCommand(redisClient *c, robj *key, robj *param, long of
dictEntry *de;
dictEntry *de;
time_t seconds;
time_t seconds;
if
(
getLongFromObject
(
c
,
param
,
&
seconds
)
!=
REDIS_OK
)
return
;
if (getLongFromObject
OrReply
(c, param, &seconds
, NULL
) != REDIS_OK) return;
seconds -= offset;
seconds -= offset;
...
...
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