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
Hide 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