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
14ff5724
Commit
14ff5724
authored
Jul 26, 2015
by
antirez
Browse files
RDMF: OBJ_ macros for object related stuff.
parent
554bd0e7
Changes
23
Hide whitespace changes
Inline
Side-by-side
src/aof.c
View file @
14ff5724
...
...
@@ -666,7 +666,7 @@ int loadAppendOnlyFile(char *filename) {
freeFakeClientArgv
(
fakeClient
);
goto
readerr
;
}
argv
[
j
]
=
createObject
(
REDIS
_STRING
,
argsds
);
argv
[
j
]
=
createObject
(
OBJ
_STRING
,
argsds
);
if
(
fread
(
buf
,
2
,
1
,
fp
)
==
0
)
{
fakeClient
->
argc
=
j
+
1
;
/* Free up to j. */
freeFakeClientArgv
(
fakeClient
);
...
...
@@ -756,7 +756,7 @@ fmterr: /* Format error. */
int
rioWriteBulkObject
(
rio
*
r
,
robj
*
obj
)
{
/* Avoid using getDecodedObject to help copy-on-write (we are often
* in a child process when this function is called). */
if
(
obj
->
encoding
==
REDIS
_ENCODING_INT
)
{
if
(
obj
->
encoding
==
OBJ
_ENCODING_INT
)
{
return
rioWriteBulkLongLong
(
r
,(
long
)
obj
->
ptr
);
}
else
if
(
sdsEncodedObject
(
obj
))
{
return
rioWriteBulkString
(
r
,
obj
->
ptr
,
sdslen
(
obj
->
ptr
));
...
...
@@ -770,7 +770,7 @@ int rioWriteBulkObject(rio *r, robj *obj) {
int
rewriteListObject
(
rio
*
r
,
robj
*
key
,
robj
*
o
)
{
long
long
count
=
0
,
items
=
listTypeLength
(
o
);
if
(
o
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
quicklist
*
list
=
o
->
ptr
;
quicklistIter
*
li
=
quicklistGetIterator
(
list
,
AL_START_HEAD
);
quicklistEntry
entry
;
...
...
@@ -804,7 +804,7 @@ int rewriteListObject(rio *r, robj *key, robj *o) {
int
rewriteSetObject
(
rio
*
r
,
robj
*
key
,
robj
*
o
)
{
long
long
count
=
0
,
items
=
setTypeSize
(
o
);
if
(
o
->
encoding
==
REDIS
_ENCODING_INTSET
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_INTSET
)
{
int
ii
=
0
;
int64_t
llval
;
...
...
@@ -821,7 +821,7 @@ int rewriteSetObject(rio *r, robj *key, robj *o) {
if
(
++
count
==
REDIS_AOF_REWRITE_ITEMS_PER_CMD
)
count
=
0
;
items
--
;
}
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
dictIterator
*
di
=
dictGetIterator
(
o
->
ptr
);
dictEntry
*
de
;
...
...
@@ -851,7 +851,7 @@ int rewriteSetObject(rio *r, robj *key, robj *o) {
int
rewriteSortedSetObject
(
rio
*
r
,
robj
*
key
,
robj
*
o
)
{
long
long
count
=
0
,
items
=
zsetLength
(
o
);
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
zl
=
o
->
ptr
;
unsigned
char
*
eptr
,
*
sptr
;
unsigned
char
*
vstr
;
...
...
@@ -886,7 +886,7 @@ int rewriteSortedSetObject(rio *r, robj *key, robj *o) {
if
(
++
count
==
REDIS_AOF_REWRITE_ITEMS_PER_CMD
)
count
=
0
;
items
--
;
}
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_SKIPLIST
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_SKIPLIST
)
{
zset
*
zs
=
o
->
ptr
;
dictIterator
*
di
=
dictGetIterator
(
zs
->
dict
);
dictEntry
*
de
;
...
...
@@ -918,11 +918,11 @@ int rewriteSortedSetObject(rio *r, robj *key, robj *o) {
/* Write either the key or the value of the currently selected item of a hash.
* The 'hi' argument passes a valid Redis hash iterator.
* The 'what' filed specifies if to write a key or a value and can be
* either
REDIS
_HASH_KEY or
REDIS
_HASH_VALUE.
* either
OBJ
_HASH_KEY or
OBJ
_HASH_VALUE.
*
* The function returns 0 on error, non-zero on success. */
static
int
rioWriteHashIteratorCursor
(
rio
*
r
,
hashTypeIterator
*
hi
,
int
what
)
{
if
(
hi
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
hi
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
vstr
=
NULL
;
unsigned
int
vlen
=
UINT_MAX
;
long
long
vll
=
LLONG_MAX
;
...
...
@@ -934,7 +934,7 @@ static int rioWriteHashIteratorCursor(rio *r, hashTypeIterator *hi, int what) {
return
rioWriteBulkLongLong
(
r
,
vll
);
}
}
else
if
(
hi
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
hi
->
encoding
==
OBJ
_ENCODING_HT
)
{
robj
*
value
;
hashTypeCurrentFromHashTable
(
hi
,
what
,
&
value
);
...
...
@@ -962,8 +962,8 @@ int rewriteHashObject(rio *r, robj *key, robj *o) {
if
(
rioWriteBulkObject
(
r
,
key
)
==
0
)
return
0
;
}
if
(
rioWriteHashIteratorCursor
(
r
,
hi
,
REDIS
_HASH_KEY
)
==
0
)
return
0
;
if
(
rioWriteHashIteratorCursor
(
r
,
hi
,
REDIS
_HASH_VALUE
)
==
0
)
return
0
;
if
(
rioWriteHashIteratorCursor
(
r
,
hi
,
OBJ
_HASH_KEY
)
==
0
)
return
0
;
if
(
rioWriteHashIteratorCursor
(
r
,
hi
,
OBJ
_HASH_VALUE
)
==
0
)
return
0
;
if
(
++
count
==
REDIS_AOF_REWRITE_ITEMS_PER_CMD
)
count
=
0
;
items
--
;
}
...
...
@@ -1050,20 +1050,20 @@ int rewriteAppendOnlyFile(char *filename) {
if
(
expiretime
!=
-
1
&&
expiretime
<
now
)
continue
;
/* Save the key and associated value */
if
(
o
->
type
==
REDIS
_STRING
)
{
if
(
o
->
type
==
OBJ
_STRING
)
{
/* Emit a SET command */
char
cmd
[]
=
"*3
\r\n
$3
\r\n
SET
\r\n
"
;
if
(
rioWrite
(
&
aof
,
cmd
,
sizeof
(
cmd
)
-
1
)
==
0
)
goto
werr
;
/* Key and value */
if
(
rioWriteBulkObject
(
&
aof
,
&
key
)
==
0
)
goto
werr
;
if
(
rioWriteBulkObject
(
&
aof
,
o
)
==
0
)
goto
werr
;
}
else
if
(
o
->
type
==
REDIS
_LIST
)
{
}
else
if
(
o
->
type
==
OBJ
_LIST
)
{
if
(
rewriteListObject
(
&
aof
,
&
key
,
o
)
==
0
)
goto
werr
;
}
else
if
(
o
->
type
==
REDIS
_SET
)
{
}
else
if
(
o
->
type
==
OBJ
_SET
)
{
if
(
rewriteSetObject
(
&
aof
,
&
key
,
o
)
==
0
)
goto
werr
;
}
else
if
(
o
->
type
==
REDIS
_ZSET
)
{
}
else
if
(
o
->
type
==
OBJ
_ZSET
)
{
if
(
rewriteSortedSetObject
(
&
aof
,
&
key
,
o
)
==
0
)
goto
werr
;
}
else
if
(
o
->
type
==
REDIS
_HASH
)
{
}
else
if
(
o
->
type
==
OBJ
_HASH
)
{
if
(
rewriteHashObject
(
&
aof
,
&
key
,
o
)
==
0
)
goto
werr
;
}
else
{
redisPanic
(
"Unknown object type"
);
...
...
src/bitops.c
View file @
14ff5724
...
...
@@ -232,10 +232,10 @@ void setbitCommand(client *c) {
byte
=
bitoffset
>>
3
;
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
o
=
createObject
(
REDIS
_STRING
,
sdsnewlen
(
NULL
,
byte
+
1
));
o
=
createObject
(
OBJ
_STRING
,
sdsnewlen
(
NULL
,
byte
+
1
));
dbAdd
(
c
->
db
,
c
->
argv
[
1
],
o
);
}
else
{
if
(
checkType
(
c
,
o
,
REDIS
_STRING
))
return
;
if
(
checkType
(
c
,
o
,
OBJ
_STRING
))
return
;
o
=
dbUnshareStringValue
(
c
->
db
,
c
->
argv
[
1
],
o
);
o
->
ptr
=
sdsgrowzero
(
o
->
ptr
,
byte
+
1
);
}
...
...
@@ -267,7 +267,7 @@ void getbitCommand(client *c) {
return
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_STRING
))
return
;
checkType
(
c
,
o
,
OBJ
_STRING
))
return
;
byte
=
bitoffset
>>
3
;
bit
=
7
-
(
bitoffset
&
0x7
);
...
...
@@ -330,7 +330,7 @@ void bitopCommand(client *c) {
continue
;
}
/* Return an error if one of the keys is not a string. */
if
(
checkType
(
c
,
o
,
REDIS
_STRING
))
{
if
(
checkType
(
c
,
o
,
OBJ
_STRING
))
{
unsigned
long
i
;
for
(
i
=
0
;
i
<
j
;
i
++
)
{
if
(
objects
[
i
])
...
...
@@ -444,7 +444,7 @@ void bitopCommand(client *c) {
/* Store the computed value into the target key */
if
(
maxlen
)
{
o
=
createObject
(
REDIS
_STRING
,
res
);
o
=
createObject
(
OBJ
_STRING
,
res
);
setKey
(
c
->
db
,
targetkey
,
o
);
notifyKeyspaceEvent
(
REDIS_NOTIFY_STRING
,
"set"
,
targetkey
,
c
->
db
->
id
);
decrRefCount
(
o
);
...
...
@@ -465,11 +465,11 @@ void bitcountCommand(client *c) {
/* Lookup, check for type, and return 0 for non existing keys. */
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_STRING
))
return
;
checkType
(
c
,
o
,
OBJ
_STRING
))
return
;
/* Set the 'p' pointer to the string, that can be just a stack allocated
* array if our string was integer encoded. */
if
(
o
->
encoding
==
REDIS
_ENCODING_INT
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_INT
)
{
p
=
(
unsigned
char
*
)
llbuf
;
strlen
=
ll2string
(
llbuf
,
sizeof
(
llbuf
),(
long
)
o
->
ptr
);
}
else
{
...
...
@@ -534,11 +534,11 @@ void bitposCommand(client *c) {
addReplyLongLong
(
c
,
bit
?
-
1
:
0
);
return
;
}
if
(
checkType
(
c
,
o
,
REDIS
_STRING
))
return
;
if
(
checkType
(
c
,
o
,
OBJ
_STRING
))
return
;
/* Set the 'p' pointer to the string, that can be just a stack allocated
* array if our string was integer encoded. */
if
(
o
->
encoding
==
REDIS
_ENCODING_INT
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_INT
)
{
p
=
(
unsigned
char
*
)
llbuf
;
strlen
=
ll2string
(
llbuf
,
sizeof
(
llbuf
),(
long
)
o
->
ptr
);
}
else
{
...
...
src/cluster.c
View file @
14ff5724
...
...
@@ -3832,7 +3832,7 @@ void clusterCommand(client *c) {
robj
*
o
;
sds
ci
=
clusterGenNodesDescription
(
0
);
o
=
createObject
(
REDIS
_STRING
,
ci
);
o
=
createObject
(
OBJ
_STRING
,
ci
);
addReplyBulk
(
c
,
o
);
decrRefCount
(
o
);
}
else
if
(
!
strcasecmp
(
c
->
argv
[
1
]
->
ptr
,
"myid"
)
&&
c
->
argc
==
2
)
{
...
...
@@ -4377,7 +4377,7 @@ void dumpCommand(client *c) {
createDumpPayload
(
&
payload
,
o
);
/* Transfer to the client */
dumpobj
=
createObject
(
REDIS
_STRING
,
payload
.
io
.
buffer
.
ptr
);
dumpobj
=
createObject
(
OBJ
_STRING
,
payload
.
io
.
buffer
.
ptr
);
addReplyBulk
(
c
,
dumpobj
);
decrRefCount
(
dumpobj
);
return
;
...
...
src/config.c
View file @
14ff5724
...
...
@@ -1197,7 +1197,7 @@ void configGetCommand(client *c) {
matches
++
;
}
if
(
stringmatch
(
pattern
,
"notify-keyspace-events"
,
0
))
{
robj
*
flagsobj
=
createObject
(
REDIS
_STRING
,
robj
*
flagsobj
=
createObject
(
OBJ
_STRING
,
keyspaceEventsFlagsToString
(
server
.
notify_keyspace_events
));
addReplyBulkCString
(
c
,
"notify-keyspace-events"
);
...
...
@@ -1806,13 +1806,13 @@ int rewriteConfig(char *path) {
rewriteConfigNumericalOption
(
state
,
"latency-monitor-threshold"
,
server
.
latency_monitor_threshold
,
CONFIG_DEFAULT_LATENCY_MONITOR_THRESHOLD
);
rewriteConfigNumericalOption
(
state
,
"slowlog-max-len"
,
server
.
slowlog_max_len
,
REDIS_SLOWLOG_MAX_LEN
);
rewriteConfigNotifykeyspaceeventsOption
(
state
);
rewriteConfigNumericalOption
(
state
,
"hash-max-ziplist-entries"
,
server
.
hash_max_ziplist_entries
,
REDIS
_HASH_MAX_ZIPLIST_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"hash-max-ziplist-value"
,
server
.
hash_max_ziplist_value
,
REDIS
_HASH_MAX_ZIPLIST_VALUE
);
rewriteConfigNumericalOption
(
state
,
"list-max-ziplist-size"
,
server
.
list_max_ziplist_size
,
REDIS
_LIST_MAX_ZIPLIST_SIZE
);
rewriteConfigNumericalOption
(
state
,
"list-compress-depth"
,
server
.
list_compress_depth
,
REDIS
_LIST_COMPRESS_DEPTH
);
rewriteConfigNumericalOption
(
state
,
"set-max-intset-entries"
,
server
.
set_max_intset_entries
,
REDIS
_SET_MAX_INTSET_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"zset-max-ziplist-entries"
,
server
.
zset_max_ziplist_entries
,
REDIS
_ZSET_MAX_ZIPLIST_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"zset-max-ziplist-value"
,
server
.
zset_max_ziplist_value
,
REDIS
_ZSET_MAX_ZIPLIST_VALUE
);
rewriteConfigNumericalOption
(
state
,
"hash-max-ziplist-entries"
,
server
.
hash_max_ziplist_entries
,
OBJ
_HASH_MAX_ZIPLIST_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"hash-max-ziplist-value"
,
server
.
hash_max_ziplist_value
,
OBJ
_HASH_MAX_ZIPLIST_VALUE
);
rewriteConfigNumericalOption
(
state
,
"list-max-ziplist-size"
,
server
.
list_max_ziplist_size
,
OBJ
_LIST_MAX_ZIPLIST_SIZE
);
rewriteConfigNumericalOption
(
state
,
"list-compress-depth"
,
server
.
list_compress_depth
,
OBJ
_LIST_COMPRESS_DEPTH
);
rewriteConfigNumericalOption
(
state
,
"set-max-intset-entries"
,
server
.
set_max_intset_entries
,
OBJ
_SET_MAX_INTSET_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"zset-max-ziplist-entries"
,
server
.
zset_max_ziplist_entries
,
OBJ
_ZSET_MAX_ZIPLIST_ENTRIES
);
rewriteConfigNumericalOption
(
state
,
"zset-max-ziplist-value"
,
server
.
zset_max_ziplist_value
,
OBJ
_ZSET_MAX_ZIPLIST_VALUE
);
rewriteConfigNumericalOption
(
state
,
"hll-sparse-max-bytes"
,
server
.
hll_sparse_max_bytes
,
CONFIG_DEFAULT_HLL_SPARSE_MAX_BYTES
);
rewriteConfigYesNoOption
(
state
,
"activerehashing"
,
server
.
activerehashing
,
CONFIG_DEFAULT_ACTIVE_REHASHING
);
rewriteConfigClientoutputbufferlimitOption
(
state
);
...
...
src/db.c
View file @
14ff5724
...
...
@@ -120,7 +120,7 @@ void dbAdd(redisDb *db, robj *key, robj *val) {
int
retval
=
dictAdd
(
db
->
dict
,
copy
,
val
);
redisAssertWithInfo
(
NULL
,
key
,
retval
==
REDIS_OK
);
if
(
val
->
type
==
REDIS
_LIST
)
signalListAsReady
(
db
,
key
);
if
(
val
->
type
==
OBJ
_LIST
)
signalListAsReady
(
db
,
key
);
if
(
server
.
cluster_enabled
)
slotToKeyAdd
(
key
);
}
...
...
@@ -217,15 +217,15 @@ int dbDelete(redisDb *db, robj *key) {
* in 'db', the usage pattern looks like this:
*
* o = lookupKeyWrite(db,key);
* if (checkType(c,o,
REDIS
_STRING)) return;
* if (checkType(c,o,
OBJ
_STRING)) return;
* o = dbUnshareStringValue(db,key,o);
*
* At this point the caller is ready to modify the object, for example
* using an sdscat() call to append some data, or anything else.
*/
robj
*
dbUnshareStringValue
(
redisDb
*
db
,
robj
*
key
,
robj
*
o
)
{
redisAssert
(
o
->
type
==
REDIS
_STRING
);
if
(
o
->
refcount
!=
1
||
o
->
encoding
!=
REDIS
_ENCODING_RAW
)
{
redisAssert
(
o
->
type
==
OBJ
_STRING
);
if
(
o
->
refcount
!=
1
||
o
->
encoding
!=
OBJ
_ENCODING_RAW
)
{
robj
*
decoded
=
getDecodedObject
(
o
);
o
=
createRawStringObject
(
decoded
->
ptr
,
sdslen
(
decoded
->
ptr
));
decrRefCount
(
decoded
);
...
...
@@ -399,15 +399,15 @@ void scanCallback(void *privdata, const dictEntry *de) {
if
(
o
==
NULL
)
{
sds
sdskey
=
dictGetKey
(
de
);
key
=
createStringObject
(
sdskey
,
sdslen
(
sdskey
));
}
else
if
(
o
->
type
==
REDIS
_SET
)
{
}
else
if
(
o
->
type
==
OBJ
_SET
)
{
key
=
dictGetKey
(
de
);
incrRefCount
(
key
);
}
else
if
(
o
->
type
==
REDIS
_HASH
)
{
}
else
if
(
o
->
type
==
OBJ
_HASH
)
{
key
=
dictGetKey
(
de
);
incrRefCount
(
key
);
val
=
dictGetVal
(
de
);
incrRefCount
(
val
);
}
else
if
(
o
->
type
==
REDIS
_ZSET
)
{
}
else
if
(
o
->
type
==
OBJ
_ZSET
)
{
key
=
dictGetKey
(
de
);
incrRefCount
(
key
);
val
=
createStringObjectFromLongDouble
(
*
(
double
*
)
dictGetVal
(
de
),
0
);
...
...
@@ -460,8 +460,8 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
/* Object must be NULL (to iterate keys names), or the type of the object
* must be Set, Sorted Set, or Hash. */
redisAssert
(
o
==
NULL
||
o
->
type
==
REDIS
_SET
||
o
->
type
==
REDIS
_HASH
||
o
->
type
==
REDIS
_ZSET
);
redisAssert
(
o
==
NULL
||
o
->
type
==
OBJ
_SET
||
o
->
type
==
OBJ
_HASH
||
o
->
type
==
OBJ
_ZSET
);
/* Set i to the first option argument. The previous one is the cursor. */
i
=
(
o
==
NULL
)
?
2
:
3
;
/* Skip the key argument if needed. */
...
...
@@ -509,12 +509,12 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
ht
=
NULL
;
if
(
o
==
NULL
)
{
ht
=
c
->
db
->
dict
;
}
else
if
(
o
->
type
==
REDIS
_SET
&&
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
type
==
OBJ
_SET
&&
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
ht
=
o
->
ptr
;
}
else
if
(
o
->
type
==
REDIS
_HASH
&&
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
type
==
OBJ
_HASH
&&
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
ht
=
o
->
ptr
;
count
*=
2
;
/* We return key / value for this type. */
}
else
if
(
o
->
type
==
REDIS
_ZSET
&&
o
->
encoding
==
REDIS
_ENCODING_SKIPLIST
)
{
}
else
if
(
o
->
type
==
OBJ
_ZSET
&&
o
->
encoding
==
OBJ
_ENCODING_SKIPLIST
)
{
zset
*
zs
=
o
->
ptr
;
ht
=
zs
->
dict
;
count
*=
2
;
/* We return key / value for this type. */
...
...
@@ -538,14 +538,14 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
}
while
(
cursor
&&
maxiterations
--
&&
listLength
(
keys
)
<
(
unsigned
long
)
count
);
}
else
if
(
o
->
type
==
REDIS
_SET
)
{
}
else
if
(
o
->
type
==
OBJ
_SET
)
{
int
pos
=
0
;
int64_t
ll
;
while
(
intsetGet
(
o
->
ptr
,
pos
++
,
&
ll
))
listAddNodeTail
(
keys
,
createStringObjectFromLongLong
(
ll
));
cursor
=
0
;
}
else
if
(
o
->
type
==
REDIS
_HASH
||
o
->
type
==
REDIS
_ZSET
)
{
}
else
if
(
o
->
type
==
OBJ
_HASH
||
o
->
type
==
OBJ
_ZSET
)
{
unsigned
char
*
p
=
ziplistIndex
(
o
->
ptr
,
0
);
unsigned
char
*
vstr
;
unsigned
int
vlen
;
...
...
@@ -579,7 +579,7 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
char
buf
[
REDIS_LONGSTR_SIZE
];
int
len
;
redisAssert
(
kobj
->
encoding
==
REDIS
_ENCODING_INT
);
redisAssert
(
kobj
->
encoding
==
OBJ
_ENCODING_INT
);
len
=
ll2string
(
buf
,
sizeof
(
buf
),(
long
)
kobj
->
ptr
);
if
(
!
stringmatchlen
(
pat
,
patlen
,
buf
,
len
,
0
))
filter
=
1
;
}
...
...
@@ -597,7 +597,7 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
/* If this is a hash or a sorted set, we have a flat list of
* key-value elements, so if this element was filtered, remove the
* value, or skip it if it was not filtered: we only match keys. */
if
(
o
&&
(
o
->
type
==
REDIS
_ZSET
||
o
->
type
==
REDIS
_HASH
))
{
if
(
o
&&
(
o
->
type
==
OBJ
_ZSET
||
o
->
type
==
OBJ
_HASH
))
{
node
=
nextnode
;
nextnode
=
listNextNode
(
node
);
if
(
filter
)
{
...
...
@@ -650,11 +650,11 @@ void typeCommand(client *c) {
type
=
"none"
;
}
else
{
switch
(
o
->
type
)
{
case
REDIS
_STRING
:
type
=
"string"
;
break
;
case
REDIS
_LIST
:
type
=
"list"
;
break
;
case
REDIS
_SET
:
type
=
"set"
;
break
;
case
REDIS
_ZSET
:
type
=
"zset"
;
break
;
case
REDIS
_HASH
:
type
=
"hash"
;
break
;
case
OBJ
_STRING
:
type
=
"string"
;
break
;
case
OBJ
_LIST
:
type
=
"list"
;
break
;
case
OBJ
_SET
:
type
=
"set"
;
break
;
case
OBJ
_ZSET
:
type
=
"zset"
;
break
;
case
OBJ
_HASH
:
type
=
"hash"
;
break
;
default:
type
=
"unknown"
;
break
;
}
}
...
...
src/debug.c
View file @
14ff5724
...
...
@@ -150,9 +150,9 @@ void computeDatasetDigest(unsigned char *final) {
expiretime
=
getExpire
(
db
,
keyobj
);
/* Save the key and associated value */
if
(
o
->
type
==
REDIS
_STRING
)
{
if
(
o
->
type
==
OBJ
_STRING
)
{
mixObjectDigest
(
digest
,
o
);
}
else
if
(
o
->
type
==
REDIS
_LIST
)
{
}
else
if
(
o
->
type
==
OBJ
_LIST
)
{
listTypeIterator
*
li
=
listTypeInitIterator
(
o
,
0
,
REDIS_TAIL
);
listTypeEntry
entry
;
while
(
listTypeNext
(
li
,
&
entry
))
{
...
...
@@ -161,7 +161,7 @@ void computeDatasetDigest(unsigned char *final) {
decrRefCount
(
eleobj
);
}
listTypeReleaseIterator
(
li
);
}
else
if
(
o
->
type
==
REDIS
_SET
)
{
}
else
if
(
o
->
type
==
OBJ
_SET
)
{
setTypeIterator
*
si
=
setTypeInitIterator
(
o
);
robj
*
ele
;
while
((
ele
=
setTypeNextObject
(
si
))
!=
NULL
)
{
...
...
@@ -169,10 +169,10 @@ void computeDatasetDigest(unsigned char *final) {
decrRefCount
(
ele
);
}
setTypeReleaseIterator
(
si
);
}
else
if
(
o
->
type
==
REDIS
_ZSET
)
{
}
else
if
(
o
->
type
==
OBJ
_ZSET
)
{
unsigned
char
eledigest
[
20
];
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
zl
=
o
->
ptr
;
unsigned
char
*
eptr
,
*
sptr
;
unsigned
char
*
vstr
;
...
...
@@ -202,7 +202,7 @@ void computeDatasetDigest(unsigned char *final) {
xorDigest
(
digest
,
eledigest
,
20
);
zzlNext
(
zl
,
&
eptr
,
&
sptr
);
}
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_SKIPLIST
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_SKIPLIST
)
{
zset
*
zs
=
o
->
ptr
;
dictIterator
*
di
=
dictGetIterator
(
zs
->
dict
);
dictEntry
*
de
;
...
...
@@ -221,7 +221,7 @@ void computeDatasetDigest(unsigned char *final) {
}
else
{
redisPanic
(
"Unknown sorted set encoding"
);
}
}
else
if
(
o
->
type
==
REDIS
_HASH
)
{
}
else
if
(
o
->
type
==
OBJ
_HASH
)
{
hashTypeIterator
*
hi
;
robj
*
obj
;
...
...
@@ -230,10 +230,10 @@ void computeDatasetDigest(unsigned char *final) {
unsigned
char
eledigest
[
20
];
memset
(
eledigest
,
0
,
20
);
obj
=
hashTypeCurrentObject
(
hi
,
REDIS
_HASH_KEY
);
obj
=
hashTypeCurrentObject
(
hi
,
OBJ
_HASH_KEY
);
mixObjectDigest
(
eledigest
,
obj
);
decrRefCount
(
obj
);
obj
=
hashTypeCurrentObject
(
hi
,
REDIS
_HASH_VALUE
);
obj
=
hashTypeCurrentObject
(
hi
,
OBJ
_HASH_VALUE
);
mixObjectDigest
(
eledigest
,
obj
);
decrRefCount
(
obj
);
xorDigest
(
digest
,
eledigest
,
20
);
...
...
@@ -302,7 +302,7 @@ void debugCommand(client *c) {
strenc
=
strEncoding
(
val
->
encoding
);
char
extra
[
128
]
=
{
0
};
if
(
val
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
val
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
char
*
nextra
=
extra
;
int
remaining
=
sizeof
(
extra
);
quicklist
*
ql
=
val
->
ptr
;
...
...
@@ -353,7 +353,7 @@ void debugCommand(client *c) {
val
=
dictGetVal
(
de
);
key
=
dictGetKey
(
de
);
if
(
val
->
type
!=
REDIS
_STRING
||
!
sdsEncodedObject
(
val
))
{
if
(
val
->
type
!=
OBJ
_STRING
||
!
sdsEncodedObject
(
val
))
{
addReplyError
(
c
,
"Not an sds encoded string."
);
}
else
{
addReplyStatusFormat
(
c
,
...
...
@@ -495,7 +495,7 @@ void _redisAssertPrintClientInfo(client *c) {
char
buf
[
128
];
char
*
arg
;
if
(
c
->
argv
[
j
]
->
type
==
REDIS
_STRING
&&
sdsEncodedObject
(
c
->
argv
[
j
]))
{
if
(
c
->
argv
[
j
]
->
type
==
OBJ
_STRING
&&
sdsEncodedObject
(
c
->
argv
[
j
]))
{
arg
=
(
char
*
)
c
->
argv
[
j
]
->
ptr
;
}
else
{
snprintf
(
buf
,
sizeof
(
buf
),
"Object type: %d, encoding: %d"
,
...
...
@@ -511,22 +511,22 @@ void serverLogObjectDebugInfo(robj *o) {
serverLog
(
REDIS_WARNING
,
"Object type: %d"
,
o
->
type
);
serverLog
(
REDIS_WARNING
,
"Object encoding: %d"
,
o
->
encoding
);
serverLog
(
REDIS_WARNING
,
"Object refcount: %d"
,
o
->
refcount
);
if
(
o
->
type
==
REDIS
_STRING
&&
sdsEncodedObject
(
o
))
{
if
(
o
->
type
==
OBJ
_STRING
&&
sdsEncodedObject
(
o
))
{
serverLog
(
REDIS_WARNING
,
"Object raw string len: %zu"
,
sdslen
(
o
->
ptr
));
if
(
sdslen
(
o
->
ptr
)
<
4096
)
{
sds
repr
=
sdscatrepr
(
sdsempty
(),
o
->
ptr
,
sdslen
(
o
->
ptr
));
serverLog
(
REDIS_WARNING
,
"Object raw string content: %s"
,
repr
);
sdsfree
(
repr
);
}
}
else
if
(
o
->
type
==
REDIS
_LIST
)
{
}
else
if
(
o
->
type
==
OBJ
_LIST
)
{
serverLog
(
REDIS_WARNING
,
"List length: %d"
,
(
int
)
listTypeLength
(
o
));
}
else
if
(
o
->
type
==
REDIS
_SET
)
{
}
else
if
(
o
->
type
==
OBJ
_SET
)
{
serverLog
(
REDIS_WARNING
,
"Set size: %d"
,
(
int
)
setTypeSize
(
o
));
}
else
if
(
o
->
type
==
REDIS
_HASH
)
{
}
else
if
(
o
->
type
==
OBJ
_HASH
)
{
serverLog
(
REDIS_WARNING
,
"Hash size: %d"
,
(
int
)
hashTypeLength
(
o
));
}
else
if
(
o
->
type
==
REDIS
_ZSET
)
{
}
else
if
(
o
->
type
==
OBJ
_ZSET
)
{
serverLog
(
REDIS_WARNING
,
"Sorted set size: %d"
,
(
int
)
zsetLength
(
o
));
if
(
o
->
encoding
==
REDIS
_ENCODING_SKIPLIST
)
if
(
o
->
encoding
==
OBJ
_ENCODING_SKIPLIST
)
serverLog
(
REDIS_WARNING
,
"Skiplist level: %d"
,
(
int
)
((
zset
*
)
o
->
ptr
)
->
zsl
->
level
);
}
}
...
...
src/geo.c
View file @
14ff5724
...
...
@@ -221,7 +221,7 @@ int geoGetPointsInRange(robj *zobj, double min, double max, double lon, double l
size_t
origincount
=
ga
->
used
;
sds
member
;
if
(
zobj
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
zobj
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
zl
=
zobj
->
ptr
;
unsigned
char
*
eptr
,
*
sptr
;
unsigned
char
*
vstr
=
NULL
;
...
...
@@ -250,7 +250,7 @@ int geoGetPointsInRange(robj *zobj, double min, double max, double lon, double l
==
REDIS_ERR
)
sdsfree
(
member
);
zzlNext
(
zl
,
&
eptr
,
&
sptr
);
}
}
else
if
(
zobj
->
encoding
==
REDIS
_ENCODING_SKIPLIST
)
{
}
else
if
(
zobj
->
encoding
==
OBJ
_ENCODING_SKIPLIST
)
{
zset
*
zs
=
zobj
->
ptr
;
zskiplist
*
zsl
=
zs
->
zsl
;
zskiplistNode
*
ln
;
...
...
@@ -266,7 +266,7 @@ int geoGetPointsInRange(robj *zobj, double min, double max, double lon, double l
if
(
!
zslValueLteMax
(
ln
->
score
,
&
range
))
break
;
member
=
(
o
->
encoding
==
REDIS
_ENCODING_INT
)
?
member
=
(
o
->
encoding
==
OBJ
_ENCODING_INT
)
?
sdsfromlonglong
((
long
)
o
->
ptr
)
:
sdsdup
(
o
->
ptr
);
if
(
geoAppendIfWithinRadius
(
ga
,
lon
,
lat
,
radius
,
ln
->
score
,
member
)
...
...
@@ -397,7 +397,7 @@ void geoaddCommand(client *c) {
GeoHashBits
hash
;
geohashEncodeWGS84
(
xy
[
0
],
xy
[
1
],
GEO_STEP_MAX
,
&
hash
);
GeoHashFix52Bits
bits
=
geohashAlign52Bits
(
hash
);
robj
*
score
=
createObject
(
REDIS
_STRING
,
sdsfromlonglong
(
bits
));
robj
*
score
=
createObject
(
OBJ
_STRING
,
sdsfromlonglong
(
bits
));
robj
*
val
=
c
->
argv
[
2
+
i
*
3
+
2
];
argv
[
2
+
i
*
2
]
=
score
;
argv
[
3
+
i
*
2
]
=
val
;
...
...
@@ -425,7 +425,7 @@ void georadiusGeneric(client *c, int type) {
/* Look up the requested zset */
robj
*
zobj
=
NULL
;
if
((
zobj
=
lookupKeyReadOrReply
(
c
,
key
,
shared
.
emptymultibulk
))
==
NULL
||
checkType
(
c
,
zobj
,
REDIS
_ZSET
))
{
checkType
(
c
,
zobj
,
OBJ
_ZSET
))
{
return
;
}
...
...
@@ -589,7 +589,7 @@ void geohashCommand(client *c) {
/* Look up the requested zset */
robj
*
zobj
=
NULL
;
if
((
zobj
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
emptymultibulk
))
==
NULL
||
checkType
(
c
,
zobj
,
REDIS
_ZSET
))
return
;
==
NULL
||
checkType
(
c
,
zobj
,
OBJ
_ZSET
))
return
;
/* Geohash elements one after the other, using a null bulk reply for
* missing elements. */
...
...
@@ -643,7 +643,7 @@ void geoposCommand(client *c) {
/* Look up the requested zset */
robj
*
zobj
=
NULL
;
if
((
zobj
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
emptymultibulk
))
==
NULL
||
checkType
(
c
,
zobj
,
REDIS
_ZSET
))
return
;
==
NULL
||
checkType
(
c
,
zobj
,
OBJ
_ZSET
))
return
;
/* Report elements one after the other, using a null bulk reply for
* missing elements. */
...
...
@@ -686,7 +686,7 @@ void geodistCommand(client *c) {
/* Look up the requested zset */
robj
*
zobj
=
NULL
;
if
((
zobj
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
emptybulk
))
==
NULL
||
checkType
(
c
,
zobj
,
REDIS
_ZSET
))
return
;
==
NULL
||
checkType
(
c
,
zobj
,
OBJ
_ZSET
))
return
;
/* Get the scores. We need both otherwise NULL is returned. */
double
score1
,
score2
,
xyxy
[
4
];
...
...
src/hyperloglog.c
View file @
14ff5724
...
...
@@ -1111,7 +1111,7 @@ robj *createHLLObject(void) {
redisAssert
((
p
-
(
uint8_t
*
)
s
)
==
sparselen
);
/* Create the actual object. */
o
=
createObject
(
REDIS
_STRING
,
s
);
o
=
createObject
(
OBJ
_STRING
,
s
);
hdr
=
o
->
ptr
;
memcpy
(
hdr
->
magic
,
"HYLL"
,
4
);
hdr
->
encoding
=
HLL_SPARSE
;
...
...
@@ -1125,7 +1125,7 @@ int isHLLObjectOrReply(client *c, robj *o) {
struct
hllhdr
*
hdr
;
/* Key exists, check type */
if
(
checkType
(
c
,
o
,
REDIS
_STRING
))
if
(
checkType
(
c
,
o
,
OBJ
_STRING
))
return
REDIS_ERR
;
/* Error already sent. */
if
(
stringObjectLen
(
o
)
<
sizeof
(
*
hdr
))
goto
invalid
;
...
...
src/networking.c
View file @
14ff5724
...
...
@@ -44,10 +44,10 @@ size_t sdsZmallocSize(sds s) {
/* Return the amount of memory used by the sds string at object->ptr
* for a string object. */
size_t
getStringObjectSdsUsedMemory
(
robj
*
o
)
{
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
REDIS
_STRING
);
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
OBJ
_STRING
);
switch
(
o
->
encoding
)
{
case
REDIS
_ENCODING_RAW
:
return
sdsZmallocSize
(
o
->
ptr
);
case
REDIS
_ENCODING_EMBSTR
:
return
zmalloc_size
(
o
)
-
sizeof
(
robj
);
case
OBJ
_ENCODING_RAW
:
return
sdsZmallocSize
(
o
->
ptr
);
case
OBJ
_ENCODING_EMBSTR
:
return
zmalloc_size
(
o
)
-
sizeof
(
robj
);
default:
return
0
;
/* Just integer encoding for now. */
}
}
...
...
@@ -232,7 +232,7 @@ void _addReplyObjectToList(client *c, robj *o) {
/* Append to this object when possible. */
if
(
tail
->
ptr
!=
NULL
&&
tail
->
encoding
==
REDIS
_ENCODING_RAW
&&
tail
->
encoding
==
OBJ
_ENCODING_RAW
&&
sdslen
(
tail
->
ptr
)
+
sdslen
(
o
->
ptr
)
<=
REDIS_REPLY_CHUNK_BYTES
)
{
c
->
reply_bytes
-=
sdsZmallocSize
(
tail
->
ptr
);
...
...
@@ -259,13 +259,13 @@ void _addReplySdsToList(client *c, sds s) {
}
if
(
listLength
(
c
->
reply
)
==
0
)
{
listAddNodeTail
(
c
->
reply
,
createObject
(
REDIS
_STRING
,
s
));
listAddNodeTail
(
c
->
reply
,
createObject
(
OBJ
_STRING
,
s
));
c
->
reply_bytes
+=
sdsZmallocSize
(
s
);
}
else
{
tail
=
listNodeValue
(
listLast
(
c
->
reply
));
/* Append to this object when possible. */
if
(
tail
->
ptr
!=
NULL
&&
tail
->
encoding
==
REDIS
_ENCODING_RAW
&&
if
(
tail
->
ptr
!=
NULL
&&
tail
->
encoding
==
OBJ
_ENCODING_RAW
&&
sdslen
(
tail
->
ptr
)
+
sdslen
(
s
)
<=
REDIS_REPLY_CHUNK_BYTES
)
{
c
->
reply_bytes
-=
sdsZmallocSize
(
tail
->
ptr
);
...
...
@@ -274,7 +274,7 @@ void _addReplySdsToList(client *c, sds s) {
c
->
reply_bytes
+=
sdsZmallocSize
(
tail
->
ptr
);
sdsfree
(
s
);
}
else
{
listAddNodeTail
(
c
->
reply
,
createObject
(
REDIS
_STRING
,
s
));
listAddNodeTail
(
c
->
reply
,
createObject
(
OBJ
_STRING
,
s
));
c
->
reply_bytes
+=
sdsZmallocSize
(
s
);
}
}
...
...
@@ -295,7 +295,7 @@ void _addReplyStringToList(client *c, const char *s, size_t len) {
tail
=
listNodeValue
(
listLast
(
c
->
reply
));
/* Append to this object when possible. */
if
(
tail
->
ptr
!=
NULL
&&
tail
->
encoding
==
REDIS
_ENCODING_RAW
&&
if
(
tail
->
ptr
!=
NULL
&&
tail
->
encoding
==
OBJ
_ENCODING_RAW
&&
sdslen
(
tail
->
ptr
)
+
len
<=
REDIS_REPLY_CHUNK_BYTES
)
{
c
->
reply_bytes
-=
sdsZmallocSize
(
tail
->
ptr
);
...
...
@@ -330,7 +330,7 @@ void addReply(client *c, robj *obj) {
if
(
sdsEncodedObject
(
obj
))
{
if
(
_addReplyToBuffer
(
c
,
obj
->
ptr
,
sdslen
(
obj
->
ptr
))
!=
REDIS_OK
)
_addReplyObjectToList
(
c
,
obj
);
}
else
if
(
obj
->
encoding
==
REDIS
_ENCODING_INT
)
{
}
else
if
(
obj
->
encoding
==
OBJ
_ENCODING_INT
)
{
/* Optimization: if there is room in the static buffer for 32 bytes
* (more than the max chars a 64 bit integer can take as string) we
* avoid decoding the object and go for the lower level approach. */
...
...
@@ -425,7 +425,7 @@ void *addDeferredMultiBulkLength(client *c) {
* ready to be sent, since we are sure that before returning to the
* event loop setDeferredMultiBulkLength() will be called. */
if
(
prepareClientToWrite
(
c
)
!=
REDIS_OK
)
return
NULL
;
listAddNodeTail
(
c
->
reply
,
createObject
(
REDIS
_STRING
,
NULL
));
listAddNodeTail
(
c
->
reply
,
createObject
(
OBJ
_STRING
,
NULL
));
return
listLast
(
c
->
reply
);
}
...
...
@@ -439,7 +439,7 @@ void setDeferredMultiBulkLength(client *c, void *node, long length) {
len
=
listNodeValue
(
ln
);
len
->
ptr
=
sdscatprintf
(
sdsempty
(),
"*%ld
\r\n
"
,
length
);
len
->
encoding
=
REDIS
_ENCODING_RAW
;
/* in case it was an EMBSTR. */
len
->
encoding
=
OBJ
_ENCODING_RAW
;
/* in case it was an EMBSTR. */
c
->
reply_bytes
+=
sdsZmallocSize
(
len
->
ptr
);
if
(
ln
->
next
!=
NULL
)
{
next
=
listNodeValue
(
ln
->
next
);
...
...
@@ -970,7 +970,7 @@ int processInlineBuffer(client *c) {
/* Create redis objects for all arguments. */
for
(
c
->
argc
=
0
,
j
=
0
;
j
<
argc
;
j
++
)
{
if
(
sdslen
(
argv
[
j
]))
{
c
->
argv
[
c
->
argc
]
=
createObject
(
REDIS
_STRING
,
argv
[
j
]);
c
->
argv
[
c
->
argc
]
=
createObject
(
OBJ
_STRING
,
argv
[
j
]);
c
->
argc
++
;
}
else
{
sdsfree
(
argv
[
j
]);
...
...
@@ -1104,7 +1104,7 @@ int processMultibulkBuffer(client *c) {
c
->
bulklen
>=
REDIS_MBULK_BIG_ARG
&&
(
signed
)
sdslen
(
c
->
querybuf
)
==
c
->
bulklen
+
2
)
{
c
->
argv
[
c
->
argc
++
]
=
createObject
(
REDIS
_STRING
,
c
->
querybuf
);
c
->
argv
[
c
->
argc
++
]
=
createObject
(
OBJ
_STRING
,
c
->
querybuf
);
sdsIncrLen
(
c
->
querybuf
,
-
2
);
/* remove CRLF */
c
->
querybuf
=
sdsempty
();
/* Assume that if we saw a fat argument we'll see another one
...
...
src/notify.c
View file @
14ff5724
...
...
@@ -110,7 +110,7 @@ void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) {
chan
=
sdscatlen
(
chan
,
buf
,
len
);
chan
=
sdscatlen
(
chan
,
"__:"
,
3
);
chan
=
sdscatsds
(
chan
,
key
->
ptr
);
chanobj
=
createObject
(
REDIS
_STRING
,
chan
);
chanobj
=
createObject
(
OBJ
_STRING
,
chan
);
pubsubPublishMessage
(
chanobj
,
eventobj
);
decrRefCount
(
chanobj
);
}
...
...
@@ -122,7 +122,7 @@ void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) {
chan
=
sdscatlen
(
chan
,
buf
,
len
);
chan
=
sdscatlen
(
chan
,
"__:"
,
3
);
chan
=
sdscatsds
(
chan
,
eventobj
->
ptr
);
chanobj
=
createObject
(
REDIS
_STRING
,
chan
);
chanobj
=
createObject
(
OBJ
_STRING
,
chan
);
pubsubPublishMessage
(
chanobj
,
key
);
decrRefCount
(
chanobj
);
}
...
...
src/object.c
View file @
14ff5724
...
...
@@ -39,7 +39,7 @@
robj
*
createObject
(
int
type
,
void
*
ptr
)
{
robj
*
o
=
zmalloc
(
sizeof
(
*
o
));
o
->
type
=
type
;
o
->
encoding
=
REDIS
_ENCODING_RAW
;
o
->
encoding
=
OBJ
_ENCODING_RAW
;
o
->
ptr
=
ptr
;
o
->
refcount
=
1
;
...
...
@@ -48,21 +48,21 @@ robj *createObject(int type, void *ptr) {
return
o
;
}
/* Create a string object with encoding
REDIS
_ENCODING_RAW, that is a plain
/* Create a string object with encoding
OBJ
_ENCODING_RAW, that is a plain
* string object where o->ptr points to a proper sds string. */
robj
*
createRawStringObject
(
const
char
*
ptr
,
size_t
len
)
{
return
createObject
(
REDIS
_STRING
,
sdsnewlen
(
ptr
,
len
));
return
createObject
(
OBJ
_STRING
,
sdsnewlen
(
ptr
,
len
));
}
/* Create a string object with encoding
REDIS
_ENCODING_EMBSTR, that is
/* Create a string object with encoding
OBJ
_ENCODING_EMBSTR, that is
* an object where the sds string is actually an unmodifiable string
* allocated in the same chunk as the object itself. */
robj
*
createEmbeddedStringObject
(
const
char
*
ptr
,
size_t
len
)
{
robj
*
o
=
zmalloc
(
sizeof
(
robj
)
+
sizeof
(
struct
sdshdr8
)
+
len
+
1
);
struct
sdshdr8
*
sh
=
(
void
*
)(
o
+
1
);
o
->
type
=
REDIS
_STRING
;
o
->
encoding
=
REDIS
_ENCODING_EMBSTR
;
o
->
type
=
OBJ
_STRING
;
o
->
encoding
=
OBJ
_ENCODING_EMBSTR
;
o
->
ptr
=
sh
+
1
;
o
->
refcount
=
1
;
o
->
lru
=
LRU_CLOCK
();
...
...
@@ -85,9 +85,9 @@ robj *createEmbeddedStringObject(const char *ptr, size_t len) {
*
* The current limit of 39 is chosen so that the biggest string object
* we allocate as EMBSTR will still fit into the 64 byte arena of jemalloc. */
#define
REDIS
_ENCODING_EMBSTR_SIZE_LIMIT 44
#define
OBJ
_ENCODING_EMBSTR_SIZE_LIMIT 44
robj
*
createStringObject
(
const
char
*
ptr
,
size_t
len
)
{
if
(
len
<=
REDIS
_ENCODING_EMBSTR_SIZE_LIMIT
)
if
(
len
<=
OBJ
_ENCODING_EMBSTR_SIZE_LIMIT
)
return
createEmbeddedStringObject
(
ptr
,
len
);
else
return
createRawStringObject
(
ptr
,
len
);
...
...
@@ -100,11 +100,11 @@ robj *createStringObjectFromLongLong(long long value) {
o
=
shared
.
integers
[
value
];
}
else
{
if
(
value
>=
LONG_MIN
&&
value
<=
LONG_MAX
)
{
o
=
createObject
(
REDIS
_STRING
,
NULL
);
o
->
encoding
=
REDIS
_ENCODING_INT
;
o
=
createObject
(
OBJ
_STRING
,
NULL
);
o
->
encoding
=
OBJ
_ENCODING_INT
;
o
->
ptr
=
(
void
*
)((
long
)
value
);
}
else
{
o
=
createObject
(
REDIS
_STRING
,
sdsfromlonglong
(
value
));
o
=
createObject
(
OBJ
_STRING
,
sdsfromlonglong
(
value
));
}
}
return
o
;
...
...
@@ -163,16 +163,16 @@ robj *createStringObjectFromLongDouble(long double value, int humanfriendly) {
robj
*
dupStringObject
(
robj
*
o
)
{
robj
*
d
;
redisAssert
(
o
->
type
==
REDIS
_STRING
);
redisAssert
(
o
->
type
==
OBJ
_STRING
);
switch
(
o
->
encoding
)
{
case
REDIS
_ENCODING_RAW
:
case
OBJ
_ENCODING_RAW
:
return
createRawStringObject
(
o
->
ptr
,
sdslen
(
o
->
ptr
));
case
REDIS
_ENCODING_EMBSTR
:
case
OBJ
_ENCODING_EMBSTR
:
return
createEmbeddedStringObject
(
o
->
ptr
,
sdslen
(
o
->
ptr
));
case
REDIS
_ENCODING_INT
:
d
=
createObject
(
REDIS
_STRING
,
NULL
);
d
->
encoding
=
REDIS
_ENCODING_INT
;
case
OBJ
_ENCODING_INT
:
d
=
createObject
(
OBJ
_STRING
,
NULL
);
d
->
encoding
=
OBJ
_ENCODING_INT
;
d
->
ptr
=
o
->
ptr
;
return
d
;
default:
...
...
@@ -183,36 +183,36 @@ robj *dupStringObject(robj *o) {
robj
*
createQuicklistObject
(
void
)
{
quicklist
*
l
=
quicklistCreate
();
robj
*
o
=
createObject
(
REDIS
_LIST
,
l
);
o
->
encoding
=
REDIS
_ENCODING_QUICKLIST
;
robj
*
o
=
createObject
(
OBJ
_LIST
,
l
);
o
->
encoding
=
OBJ
_ENCODING_QUICKLIST
;
return
o
;
}
robj
*
createZiplistObject
(
void
)
{
unsigned
char
*
zl
=
ziplistNew
();
robj
*
o
=
createObject
(
REDIS
_LIST
,
zl
);
o
->
encoding
=
REDIS
_ENCODING_ZIPLIST
;
robj
*
o
=
createObject
(
OBJ
_LIST
,
zl
);
o
->
encoding
=
OBJ
_ENCODING_ZIPLIST
;
return
o
;
}
robj
*
createSetObject
(
void
)
{
dict
*
d
=
dictCreate
(
&
setDictType
,
NULL
);
robj
*
o
=
createObject
(
REDIS
_SET
,
d
);
o
->
encoding
=
REDIS
_ENCODING_HT
;
robj
*
o
=
createObject
(
OBJ
_SET
,
d
);
o
->
encoding
=
OBJ
_ENCODING_HT
;
return
o
;
}
robj
*
createIntsetObject
(
void
)
{
intset
*
is
=
intsetNew
();
robj
*
o
=
createObject
(
REDIS
_SET
,
is
);
o
->
encoding
=
REDIS
_ENCODING_INTSET
;
robj
*
o
=
createObject
(
OBJ
_SET
,
is
);
o
->
encoding
=
OBJ
_ENCODING_INTSET
;
return
o
;
}
robj
*
createHashObject
(
void
)
{
unsigned
char
*
zl
=
ziplistNew
();
robj
*
o
=
createObject
(
REDIS
_HASH
,
zl
);
o
->
encoding
=
REDIS
_ENCODING_ZIPLIST
;
robj
*
o
=
createObject
(
OBJ
_HASH
,
zl
);
o
->
encoding
=
OBJ
_ENCODING_ZIPLIST
;
return
o
;
}
...
...
@@ -222,27 +222,27 @@ robj *createZsetObject(void) {
zs
->
dict
=
dictCreate
(
&
zsetDictType
,
NULL
);
zs
->
zsl
=
zslCreate
();
o
=
createObject
(
REDIS
_ZSET
,
zs
);
o
->
encoding
=
REDIS
_ENCODING_SKIPLIST
;
o
=
createObject
(
OBJ
_ZSET
,
zs
);
o
->
encoding
=
OBJ
_ENCODING_SKIPLIST
;
return
o
;
}
robj
*
createZsetZiplistObject
(
void
)
{
unsigned
char
*
zl
=
ziplistNew
();
robj
*
o
=
createObject
(
REDIS
_ZSET
,
zl
);
o
->
encoding
=
REDIS
_ENCODING_ZIPLIST
;
robj
*
o
=
createObject
(
OBJ
_ZSET
,
zl
);
o
->
encoding
=
OBJ
_ENCODING_ZIPLIST
;
return
o
;
}
void
freeStringObject
(
robj
*
o
)
{
if
(
o
->
encoding
==
REDIS
_ENCODING_RAW
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_RAW
)
{
sdsfree
(
o
->
ptr
);
}
}
void
freeListObject
(
robj
*
o
)
{
switch
(
o
->
encoding
)
{
case
REDIS
_ENCODING_QUICKLIST
:
case
OBJ
_ENCODING_QUICKLIST
:
quicklistRelease
(
o
->
ptr
);
break
;
default:
...
...
@@ -252,10 +252,10 @@ void freeListObject(robj *o) {
void
freeSetObject
(
robj
*
o
)
{
switch
(
o
->
encoding
)
{
case
REDIS
_ENCODING_HT
:
case
OBJ
_ENCODING_HT
:
dictRelease
((
dict
*
)
o
->
ptr
);
break
;
case
REDIS
_ENCODING_INTSET
:
case
OBJ
_ENCODING_INTSET
:
zfree
(
o
->
ptr
);
break
;
default:
...
...
@@ -266,13 +266,13 @@ void freeSetObject(robj *o) {
void
freeZsetObject
(
robj
*
o
)
{
zset
*
zs
;
switch
(
o
->
encoding
)
{
case
REDIS
_ENCODING_SKIPLIST
:
case
OBJ
_ENCODING_SKIPLIST
:
zs
=
o
->
ptr
;
dictRelease
(
zs
->
dict
);
zslFree
(
zs
->
zsl
);
zfree
(
zs
);
break
;
case
REDIS
_ENCODING_ZIPLIST
:
case
OBJ
_ENCODING_ZIPLIST
:
zfree
(
o
->
ptr
);
break
;
default:
...
...
@@ -282,10 +282,10 @@ void freeZsetObject(robj *o) {
void
freeHashObject
(
robj
*
o
)
{
switch
(
o
->
encoding
)
{
case
REDIS
_ENCODING_HT
:
case
OBJ
_ENCODING_HT
:
dictRelease
((
dict
*
)
o
->
ptr
);
break
;
case
REDIS
_ENCODING_ZIPLIST
:
case
OBJ
_ENCODING_ZIPLIST
:
zfree
(
o
->
ptr
);
break
;
default:
...
...
@@ -302,11 +302,11 @@ void decrRefCount(robj *o) {
if
(
o
->
refcount
<=
0
)
redisPanic
(
"decrRefCount against refcount <= 0"
);
if
(
o
->
refcount
==
1
)
{
switch
(
o
->
type
)
{
case
REDIS
_STRING
:
freeStringObject
(
o
);
break
;
case
REDIS
_LIST
:
freeListObject
(
o
);
break
;
case
REDIS
_SET
:
freeSetObject
(
o
);
break
;
case
REDIS
_ZSET
:
freeZsetObject
(
o
);
break
;
case
REDIS
_HASH
:
freeHashObject
(
o
);
break
;
case
OBJ
_STRING
:
freeStringObject
(
o
);
break
;
case
OBJ
_LIST
:
freeListObject
(
o
);
break
;
case
OBJ
_SET
:
freeSetObject
(
o
);
break
;
case
OBJ
_ZSET
:
freeZsetObject
(
o
);
break
;
case
OBJ
_HASH
:
freeHashObject
(
o
);
break
;
default:
redisPanic
(
"Unknown object type"
);
break
;
}
zfree
(
o
);
...
...
@@ -348,8 +348,8 @@ int checkType(client *c, robj *o, int type) {
}
int
isObjectRepresentableAsLongLong
(
robj
*
o
,
long
long
*
llval
)
{
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
REDIS
_STRING
);
if
(
o
->
encoding
==
REDIS
_ENCODING_INT
)
{
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
OBJ
_STRING
);
if
(
o
->
encoding
==
OBJ
_ENCODING_INT
)
{
if
(
llval
)
*
llval
=
(
long
)
o
->
ptr
;
return
REDIS_OK
;
}
else
{
...
...
@@ -367,7 +367,7 @@ robj *tryObjectEncoding(robj *o) {
* in this function. Other types use encoded memory efficient
* representations but are handled by the commands implementing
* the type. */
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
REDIS
_STRING
);
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
OBJ
_STRING
);
/* We try some specialized encoding only for objects that are
* RAW or EMBSTR encoded, in other words objects that are still
...
...
@@ -398,8 +398,8 @@ robj *tryObjectEncoding(robj *o) {
incrRefCount
(
shared
.
integers
[
value
]);
return
shared
.
integers
[
value
];
}
else
{
if
(
o
->
encoding
==
REDIS
_ENCODING_RAW
)
sdsfree
(
o
->
ptr
);
o
->
encoding
=
REDIS
_ENCODING_INT
;
if
(
o
->
encoding
==
OBJ
_ENCODING_RAW
)
sdsfree
(
o
->
ptr
);
o
->
encoding
=
OBJ
_ENCODING_INT
;
o
->
ptr
=
(
void
*
)
value
;
return
o
;
}
...
...
@@ -409,10 +409,10 @@ robj *tryObjectEncoding(robj *o) {
* try the EMBSTR encoding which is more efficient.
* In this representation the object and the SDS string are allocated
* in the same chunk of memory to save space and cache misses. */
if
(
len
<=
REDIS
_ENCODING_EMBSTR_SIZE_LIMIT
)
{
if
(
len
<=
OBJ
_ENCODING_EMBSTR_SIZE_LIMIT
)
{
robj
*
emb
;
if
(
o
->
encoding
==
REDIS
_ENCODING_EMBSTR
)
return
o
;
if
(
o
->
encoding
==
OBJ
_ENCODING_EMBSTR
)
return
o
;
emb
=
createEmbeddedStringObject
(
s
,
sdslen
(
s
));
decrRefCount
(
o
);
return
emb
;
...
...
@@ -426,8 +426,8 @@ robj *tryObjectEncoding(robj *o) {
*
* We do that only for relatively large strings as this branch
* is only entered if the length of the string is greater than
*
REDIS
_ENCODING_EMBSTR_SIZE_LIMIT. */
if
(
o
->
encoding
==
REDIS
_ENCODING_RAW
&&
*
OBJ
_ENCODING_EMBSTR_SIZE_LIMIT. */
if
(
o
->
encoding
==
OBJ
_ENCODING_RAW
&&
sdsavail
(
s
)
>
len
/
10
)
{
o
->
ptr
=
sdsRemoveFreeSpace
(
o
->
ptr
);
...
...
@@ -446,7 +446,7 @@ robj *getDecodedObject(robj *o) {
incrRefCount
(
o
);
return
o
;
}
if
(
o
->
type
==
REDIS
_STRING
&&
o
->
encoding
==
REDIS
_ENCODING_INT
)
{
if
(
o
->
type
==
OBJ
_STRING
&&
o
->
encoding
==
OBJ
_ENCODING_INT
)
{
char
buf
[
32
];
ll2string
(
buf
,
32
,(
long
)
o
->
ptr
);
...
...
@@ -469,7 +469,7 @@ robj *getDecodedObject(robj *o) {
#define REDIS_COMPARE_COLL (1<<1)
int
compareStringObjectsWithFlags
(
robj
*
a
,
robj
*
b
,
int
flags
)
{
redisAssertWithInfo
(
NULL
,
a
,
a
->
type
==
REDIS
_STRING
&&
b
->
type
==
REDIS
_STRING
);
redisAssertWithInfo
(
NULL
,
a
,
a
->
type
==
OBJ
_STRING
&&
b
->
type
==
OBJ
_STRING
);
char
bufa
[
128
],
bufb
[
128
],
*
astr
,
*
bstr
;
size_t
alen
,
blen
,
minlen
;
...
...
@@ -515,8 +515,8 @@ int collateStringObjects(robj *a, robj *b) {
* this function is faster then checking for (compareStringObject(a,b) == 0)
* because it can perform some more optimization. */
int
equalStringObjects
(
robj
*
a
,
robj
*
b
)
{
if
(
a
->
encoding
==
REDIS
_ENCODING_INT
&&
b
->
encoding
==
REDIS
_ENCODING_INT
){
if
(
a
->
encoding
==
OBJ
_ENCODING_INT
&&
b
->
encoding
==
OBJ
_ENCODING_INT
){
/* If both strings are integer encoded just check if the stored
* long is the same. */
return
a
->
ptr
==
b
->
ptr
;
...
...
@@ -526,7 +526,7 @@ int equalStringObjects(robj *a, robj *b) {
}
size_t
stringObjectLen
(
robj
*
o
)
{
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
REDIS
_STRING
);
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
OBJ
_STRING
);
if
(
sdsEncodedObject
(
o
))
{
return
sdslen
(
o
->
ptr
);
}
else
{
...
...
@@ -541,7 +541,7 @@ int getDoubleFromObject(robj *o, double *target) {
if
(
o
==
NULL
)
{
value
=
0
;
}
else
{
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
REDIS
_STRING
);
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
OBJ
_STRING
);
if
(
sdsEncodedObject
(
o
))
{
errno
=
0
;
value
=
strtod
(
o
->
ptr
,
&
eptr
);
...
...
@@ -552,7 +552,7 @@ int getDoubleFromObject(robj *o, double *target) {
errno
==
EINVAL
||
isnan
(
value
))
return
REDIS_ERR
;
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_INT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_INT
)
{
value
=
(
long
)
o
->
ptr
;
}
else
{
redisPanic
(
"Unknown string encoding"
);
...
...
@@ -583,14 +583,14 @@ int getLongDoubleFromObject(robj *o, long double *target) {
if
(
o
==
NULL
)
{
value
=
0
;
}
else
{
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
REDIS
_STRING
);
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
OBJ
_STRING
);
if
(
sdsEncodedObject
(
o
))
{
errno
=
0
;
value
=
strtold
(
o
->
ptr
,
&
eptr
);
if
(
isspace
(((
char
*
)
o
->
ptr
)[
0
])
||
eptr
[
0
]
!=
'\0'
||
errno
==
ERANGE
||
isnan
(
value
))
return
REDIS_ERR
;
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_INT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_INT
)
{
value
=
(
long
)
o
->
ptr
;
}
else
{
redisPanic
(
"Unknown string encoding"
);
...
...
@@ -621,14 +621,14 @@ int getLongLongFromObject(robj *o, long long *target) {
if
(
o
==
NULL
)
{
value
=
0
;
}
else
{
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
REDIS
_STRING
);
redisAssertWithInfo
(
NULL
,
o
,
o
->
type
==
OBJ
_STRING
);
if
(
sdsEncodedObject
(
o
))
{
errno
=
0
;
value
=
strtoll
(
o
->
ptr
,
&
eptr
,
10
);
if
(
isspace
(((
char
*
)
o
->
ptr
)[
0
])
||
eptr
[
0
]
!=
'\0'
||
errno
==
ERANGE
)
return
REDIS_ERR
;
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_INT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_INT
)
{
value
=
(
long
)
o
->
ptr
;
}
else
{
redisPanic
(
"Unknown string encoding"
);
...
...
@@ -670,14 +670,14 @@ int getLongFromObjectOrReply(client *c, robj *o, long *target, const char *msg)
char
*
strEncoding
(
int
encoding
)
{
switch
(
encoding
)
{
case
REDIS
_ENCODING_RAW
:
return
"raw"
;
case
REDIS
_ENCODING_INT
:
return
"int"
;
case
REDIS
_ENCODING_HT
:
return
"hashtable"
;
case
REDIS
_ENCODING_QUICKLIST
:
return
"quicklist"
;
case
REDIS
_ENCODING_ZIPLIST
:
return
"ziplist"
;
case
REDIS
_ENCODING_INTSET
:
return
"intset"
;
case
REDIS
_ENCODING_SKIPLIST
:
return
"skiplist"
;
case
REDIS
_ENCODING_EMBSTR
:
return
"embstr"
;
case
OBJ
_ENCODING_RAW
:
return
"raw"
;
case
OBJ
_ENCODING_INT
:
return
"int"
;
case
OBJ
_ENCODING_HT
:
return
"hashtable"
;
case
OBJ
_ENCODING_QUICKLIST
:
return
"quicklist"
;
case
OBJ
_ENCODING_ZIPLIST
:
return
"ziplist"
;
case
OBJ
_ENCODING_INTSET
:
return
"intset"
;
case
OBJ
_ENCODING_SKIPLIST
:
return
"skiplist"
;
case
OBJ
_ENCODING_EMBSTR
:
return
"embstr"
;
default:
return
"unknown"
;
}
}
...
...
src/rdb.c
View file @
14ff5724
...
...
@@ -209,7 +209,7 @@ void *rdbLoadIntegerObject(rio *rdb, int enctype, int flags) {
}
else
if
(
encode
)
{
return
createStringObjectFromLongLong
(
val
);
}
else
{
return
createObject
(
REDIS
_STRING
,
sdsfromlonglong
(
val
));
return
createObject
(
OBJ
_STRING
,
sdsfromlonglong
(
val
));
}
}
...
...
@@ -303,7 +303,7 @@ void *rdbLoadLzfStringObject(rio *rdb, int flags) {
if
(
plain
)
return
val
;
else
return
createObject
(
REDIS
_STRING
,
val
);
return
createObject
(
OBJ
_STRING
,
val
);
err:
zfree
(
c
);
if
(
plain
)
...
...
@@ -370,7 +370,7 @@ ssize_t rdbSaveLongLongAsStringObject(rio *rdb, long long value) {
int
rdbSaveStringObject
(
rio
*
rdb
,
robj
*
obj
)
{
/* Avoid to decode the object, then encode it again, if the
* object is already integer encoded. */
if
(
obj
->
encoding
==
REDIS
_ENCODING_INT
)
{
if
(
obj
->
encoding
==
OBJ
_ENCODING_INT
)
{
return
rdbSaveLongLongAsStringObject
(
rdb
,(
long
)
obj
->
ptr
);
}
else
{
redisAssertWithInfo
(
NULL
,
obj
,
sdsEncodedObject
(
obj
));
...
...
@@ -498,31 +498,31 @@ int rdbLoadDoubleValue(rio *rdb, double *val) {
/* Save the object type of object "o". */
int
rdbSaveObjectType
(
rio
*
rdb
,
robj
*
o
)
{
switch
(
o
->
type
)
{
case
REDIS
_STRING
:
case
OBJ
_STRING
:
return
rdbSaveType
(
rdb
,
REDIS_RDB_TYPE_STRING
);
case
REDIS
_LIST
:
if
(
o
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
case
OBJ
_LIST
:
if
(
o
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
return
rdbSaveType
(
rdb
,
REDIS_RDB_TYPE_LIST_QUICKLIST
);
else
redisPanic
(
"Unknown list encoding"
);
case
REDIS
_SET
:
if
(
o
->
encoding
==
REDIS
_ENCODING_INTSET
)
case
OBJ
_SET
:
if
(
o
->
encoding
==
OBJ
_ENCODING_INTSET
)
return
rdbSaveType
(
rdb
,
REDIS_RDB_TYPE_SET_INTSET
);
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
return
rdbSaveType
(
rdb
,
REDIS_RDB_TYPE_SET
);
else
redisPanic
(
"Unknown set encoding"
);
case
REDIS
_ZSET
:
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
case
OBJ
_ZSET
:
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
return
rdbSaveType
(
rdb
,
REDIS_RDB_TYPE_ZSET_ZIPLIST
);
else
if
(
o
->
encoding
==
REDIS
_ENCODING_SKIPLIST
)
else
if
(
o
->
encoding
==
OBJ
_ENCODING_SKIPLIST
)
return
rdbSaveType
(
rdb
,
REDIS_RDB_TYPE_ZSET
);
else
redisPanic
(
"Unknown sorted set encoding"
);
case
REDIS
_HASH
:
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
case
OBJ
_HASH
:
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
return
rdbSaveType
(
rdb
,
REDIS_RDB_TYPE_HASH_ZIPLIST
);
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
return
rdbSaveType
(
rdb
,
REDIS_RDB_TYPE_HASH
);
else
redisPanic
(
"Unknown hash encoding"
);
...
...
@@ -545,13 +545,13 @@ int rdbLoadObjectType(rio *rdb) {
ssize_t
rdbSaveObject
(
rio
*
rdb
,
robj
*
o
)
{
ssize_t
n
=
0
,
nwritten
=
0
;
if
(
o
->
type
==
REDIS
_STRING
)
{
if
(
o
->
type
==
OBJ
_STRING
)
{
/* Save a string value */
if
((
n
=
rdbSaveStringObject
(
rdb
,
o
))
==
-
1
)
return
-
1
;
nwritten
+=
n
;
}
else
if
(
o
->
type
==
REDIS
_LIST
)
{
}
else
if
(
o
->
type
==
OBJ
_LIST
)
{
/* Save a list value */
if
(
o
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
quicklist
*
ql
=
o
->
ptr
;
quicklistNode
*
node
=
ql
->
head
;
...
...
@@ -572,9 +572,9 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
}
else
{
redisPanic
(
"Unknown list encoding"
);
}
}
else
if
(
o
->
type
==
REDIS
_SET
)
{
}
else
if
(
o
->
type
==
OBJ
_SET
)
{
/* Save a set value */
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
dict
*
set
=
o
->
ptr
;
dictIterator
*
di
=
dictGetIterator
(
set
);
dictEntry
*
de
;
...
...
@@ -588,7 +588,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
nwritten
+=
n
;
}
dictReleaseIterator
(
di
);
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_INTSET
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_INTSET
)
{
size_t
l
=
intsetBlobLen
((
intset
*
)
o
->
ptr
);
if
((
n
=
rdbSaveRawString
(
rdb
,
o
->
ptr
,
l
))
==
-
1
)
return
-
1
;
...
...
@@ -596,14 +596,14 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
}
else
{
redisPanic
(
"Unknown set encoding"
);
}
}
else
if
(
o
->
type
==
REDIS
_ZSET
)
{
}
else
if
(
o
->
type
==
OBJ
_ZSET
)
{
/* Save a sorted set value */
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
size_t
l
=
ziplistBlobLen
((
unsigned
char
*
)
o
->
ptr
);
if
((
n
=
rdbSaveRawString
(
rdb
,
o
->
ptr
,
l
))
==
-
1
)
return
-
1
;
nwritten
+=
n
;
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_SKIPLIST
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_SKIPLIST
)
{
zset
*
zs
=
o
->
ptr
;
dictIterator
*
di
=
dictGetIterator
(
zs
->
dict
);
dictEntry
*
de
;
...
...
@@ -624,15 +624,15 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
}
else
{
redisPanic
(
"Unknown sorted set encoding"
);
}
}
else
if
(
o
->
type
==
REDIS
_HASH
)
{
}
else
if
(
o
->
type
==
OBJ
_HASH
)
{
/* Save a hash value */
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
size_t
l
=
ziplistBlobLen
((
unsigned
char
*
)
o
->
ptr
);
if
((
n
=
rdbSaveRawString
(
rdb
,
o
->
ptr
,
l
))
==
-
1
)
return
-
1
;
nwritten
+=
n
;
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
dictIterator
*
di
=
dictGetIterator
(
o
->
ptr
);
dictEntry
*
de
;
...
...
@@ -979,19 +979,19 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
if
((
ele
=
rdbLoadEncodedStringObject
(
rdb
))
==
NULL
)
return
NULL
;
ele
=
tryObjectEncoding
(
ele
);
if
(
o
->
encoding
==
REDIS
_ENCODING_INTSET
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_INTSET
)
{
/* Fetch integer value from element */
if
(
isObjectRepresentableAsLongLong
(
ele
,
&
llval
)
==
REDIS_OK
)
{
o
->
ptr
=
intsetAdd
(
o
->
ptr
,
llval
,
NULL
);
}
else
{
setTypeConvert
(
o
,
REDIS
_ENCODING_HT
);
setTypeConvert
(
o
,
OBJ
_ENCODING_HT
);
dictExpand
(
o
->
ptr
,
len
);
}
}
/* This will also be called when the set was just converted
* to a regular hash table encoded set */
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
dictAdd
((
dict
*
)
o
->
ptr
,
ele
,
NULL
);
}
else
{
decrRefCount
(
ele
);
...
...
@@ -1029,7 +1029,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
/* Convert *after* loading, since sorted sets are not stored ordered. */
if
(
zsetLength
(
o
)
<=
server
.
zset_max_ziplist_entries
&&
maxelelen
<=
server
.
zset_max_ziplist_value
)
zsetConvert
(
o
,
REDIS
_ENCODING_ZIPLIST
);
zsetConvert
(
o
,
OBJ
_ENCODING_ZIPLIST
);
}
else
if
(
rdbtype
==
REDIS_RDB_TYPE_HASH
)
{
size_t
len
;
int
ret
;
...
...
@@ -1041,10 +1041,10 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
/* Too many entries? Use a hash table. */
if
(
len
>
server
.
hash_max_ziplist_entries
)
hashTypeConvert
(
o
,
REDIS
_ENCODING_HT
);
hashTypeConvert
(
o
,
OBJ
_ENCODING_HT
);
/* Load every field and value into the ziplist */
while
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
&&
len
>
0
)
{
while
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
&&
len
>
0
)
{
robj
*
field
,
*
value
;
len
--
;
...
...
@@ -1065,7 +1065,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
{
decrRefCount
(
field
);
decrRefCount
(
value
);
hashTypeConvert
(
o
,
REDIS
_ENCODING_HT
);
hashTypeConvert
(
o
,
OBJ
_ENCODING_HT
);
break
;
}
decrRefCount
(
field
);
...
...
@@ -1073,7 +1073,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
}
/* Load remaining fields and values into the hash table */
while
(
o
->
encoding
==
REDIS
_ENCODING_HT
&&
len
>
0
)
{
while
(
o
->
encoding
==
OBJ
_ENCODING_HT
&&
len
>
0
)
{
robj
*
field
,
*
value
;
len
--
;
...
...
@@ -1114,7 +1114,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
{
unsigned
char
*
encoded
=
rdbGenericLoadStringObject
(
rdb
,
RDB_LOAD_PLAIN
);
if
(
encoded
==
NULL
)
return
NULL
;
o
=
createObject
(
REDIS
_STRING
,
encoded
);
/* Obj type fixed below. */
o
=
createObject
(
OBJ
_STRING
,
encoded
);
/* Obj type fixed below. */
/* Fix the object encoding, and make sure to convert the encoded
* data type into the base type if accordingly to the current
...
...
@@ -1142,38 +1142,38 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
zfree
(
o
->
ptr
);
o
->
ptr
=
zl
;
o
->
type
=
REDIS
_HASH
;
o
->
encoding
=
REDIS
_ENCODING_ZIPLIST
;
o
->
type
=
OBJ
_HASH
;
o
->
encoding
=
OBJ
_ENCODING_ZIPLIST
;
if
(
hashTypeLength
(
o
)
>
server
.
hash_max_ziplist_entries
||
maxlen
>
server
.
hash_max_ziplist_value
)
{
hashTypeConvert
(
o
,
REDIS
_ENCODING_HT
);
hashTypeConvert
(
o
,
OBJ
_ENCODING_HT
);
}
}
break
;
case
REDIS_RDB_TYPE_LIST_ZIPLIST
:
o
->
type
=
REDIS
_LIST
;
o
->
encoding
=
REDIS
_ENCODING_ZIPLIST
;
listTypeConvert
(
o
,
REDIS
_ENCODING_QUICKLIST
);
o
->
type
=
OBJ
_LIST
;
o
->
encoding
=
OBJ
_ENCODING_ZIPLIST
;
listTypeConvert
(
o
,
OBJ
_ENCODING_QUICKLIST
);
break
;
case
REDIS_RDB_TYPE_SET_INTSET
:
o
->
type
=
REDIS
_SET
;
o
->
encoding
=
REDIS
_ENCODING_INTSET
;
o
->
type
=
OBJ
_SET
;
o
->
encoding
=
OBJ
_ENCODING_INTSET
;
if
(
intsetLen
(
o
->
ptr
)
>
server
.
set_max_intset_entries
)
setTypeConvert
(
o
,
REDIS
_ENCODING_HT
);
setTypeConvert
(
o
,
OBJ
_ENCODING_HT
);
break
;
case
REDIS_RDB_TYPE_ZSET_ZIPLIST
:
o
->
type
=
REDIS
_ZSET
;
o
->
encoding
=
REDIS
_ENCODING_ZIPLIST
;
o
->
type
=
OBJ
_ZSET
;
o
->
encoding
=
OBJ
_ENCODING_ZIPLIST
;
if
(
zsetLength
(
o
)
>
server
.
zset_max_ziplist_entries
)
zsetConvert
(
o
,
REDIS
_ENCODING_SKIPLIST
);
zsetConvert
(
o
,
OBJ
_ENCODING_SKIPLIST
);
break
;
case
REDIS_RDB_TYPE_HASH_ZIPLIST
:
o
->
type
=
REDIS
_HASH
;
o
->
encoding
=
REDIS
_ENCODING_ZIPLIST
;
o
->
type
=
OBJ
_HASH
;
o
->
encoding
=
OBJ
_ENCODING_ZIPLIST
;
if
(
hashTypeLength
(
o
)
>
server
.
hash_max_ziplist_entries
)
hashTypeConvert
(
o
,
REDIS
_ENCODING_HT
);
hashTypeConvert
(
o
,
OBJ
_ENCODING_HT
);
break
;
default:
rdbExitReportCorruptRDB
(
"Unknown encoding"
);
...
...
src/replication.c
View file @
14ff5724
...
...
@@ -154,7 +154,7 @@ void feedReplicationBacklogWithObject(robj *o) {
void
*
p
;
size_t
len
;
if
(
o
->
encoding
==
REDIS
_ENCODING_INT
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_INT
)
{
len
=
ll2string
(
llstr
,
sizeof
(
llstr
),(
long
)
o
->
ptr
);
p
=
llstr
;
}
else
{
...
...
@@ -188,7 +188,7 @@ void replicationFeedSlaves(list *slaves, int dictid, robj **argv, int argc) {
int
dictid_len
;
dictid_len
=
ll2string
(
llstr
,
sizeof
(
llstr
),
dictid
);
selectcmd
=
createObject
(
REDIS
_STRING
,
selectcmd
=
createObject
(
OBJ
_STRING
,
sdscatprintf
(
sdsempty
(),
"*2
\r\n
$6
\r\n
SELECT
\r\n
$%d
\r\n
%s
\r\n
"
,
dictid_len
,
llstr
));
...
...
@@ -277,7 +277,7 @@ void replicationFeedMonitors(client *c, list *monitors, int dictid, robj **argv,
}
for
(
j
=
0
;
j
<
argc
;
j
++
)
{
if
(
argv
[
j
]
->
encoding
==
REDIS
_ENCODING_INT
)
{
if
(
argv
[
j
]
->
encoding
==
OBJ
_ENCODING_INT
)
{
cmdrepr
=
sdscatprintf
(
cmdrepr
,
"
\"
%ld
\"
"
,
(
long
)
argv
[
j
]
->
ptr
);
}
else
{
cmdrepr
=
sdscatrepr
(
cmdrepr
,(
char
*
)
argv
[
j
]
->
ptr
,
...
...
@@ -287,7 +287,7 @@ void replicationFeedMonitors(client *c, list *monitors, int dictid, robj **argv,
cmdrepr
=
sdscatlen
(
cmdrepr
,
" "
,
1
);
}
cmdrepr
=
sdscatlen
(
cmdrepr
,
"
\r\n
"
,
2
);
cmdobj
=
createObject
(
REDIS
_STRING
,
cmdrepr
);
cmdobj
=
createObject
(
OBJ
_STRING
,
cmdrepr
);
listRewind
(
monitors
,
&
li
);
while
((
ln
=
listNext
(
&
li
)))
{
...
...
src/scripting.c
View file @
14ff5724
...
...
@@ -415,8 +415,8 @@ cleanup:
* (we must be the only owner) for us to cache it. */
if
(
j
<
LUA_CMD_OBJCACHE_SIZE
&&
o
->
refcount
==
1
&&
(
o
->
encoding
==
REDIS
_ENCODING_RAW
||
o
->
encoding
==
REDIS
_ENCODING_EMBSTR
)
&&
(
o
->
encoding
==
OBJ
_ENCODING_RAW
||
o
->
encoding
==
OBJ
_ENCODING_EMBSTR
)
&&
sdslen
(
o
->
ptr
)
<=
LUA_CMD_OBJCACHE_MAX_LEN
)
{
sds
s
=
o
->
ptr
;
...
...
src/server.c
View file @
14ff5724
...
...
@@ -495,8 +495,8 @@ int dictEncObjKeyCompare(void *privdata, const void *key1,
robj
*
o1
=
(
robj
*
)
key1
,
*
o2
=
(
robj
*
)
key2
;
int
cmp
;
if
(
o1
->
encoding
==
REDIS
_ENCODING_INT
&&
o2
->
encoding
==
REDIS
_ENCODING_INT
)
if
(
o1
->
encoding
==
OBJ
_ENCODING_INT
&&
o2
->
encoding
==
OBJ
_ENCODING_INT
)
return
o1
->
ptr
==
o2
->
ptr
;
o1
=
getDecodedObject
(
o1
);
...
...
@@ -513,7 +513,7 @@ unsigned int dictEncObjHash(const void *key) {
if
(
sdsEncodedObject
(
o
))
{
return
dictGenHashFunction
(
o
->
ptr
,
sdslen
((
sds
)
o
->
ptr
));
}
else
{
if
(
o
->
encoding
==
REDIS
_ENCODING_INT
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_INT
)
{
char
buf
[
32
];
int
len
;
...
...
@@ -1324,61 +1324,61 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
void
createSharedObjects
(
void
)
{
int
j
;
shared
.
crlf
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"
\r\n
"
));
shared
.
ok
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"+OK
\r\n
"
));
shared
.
err
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"-ERR
\r\n
"
));
shared
.
emptybulk
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"$0
\r\n\r\n
"
));
shared
.
czero
=
createObject
(
REDIS
_STRING
,
sdsnew
(
":0
\r\n
"
));
shared
.
cone
=
createObject
(
REDIS
_STRING
,
sdsnew
(
":1
\r\n
"
));
shared
.
cnegone
=
createObject
(
REDIS
_STRING
,
sdsnew
(
":-1
\r\n
"
));
shared
.
nullbulk
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"$-1
\r\n
"
));
shared
.
nullmultibulk
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"*-1
\r\n
"
));
shared
.
emptymultibulk
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"*0
\r\n
"
));
shared
.
pong
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"+PONG
\r\n
"
));
shared
.
queued
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"+QUEUED
\r\n
"
));
shared
.
emptyscan
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"*2
\r\n
$1
\r\n
0
\r\n
*0
\r\n
"
));
shared
.
wrongtypeerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
crlf
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"
\r\n
"
));
shared
.
ok
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"+OK
\r\n
"
));
shared
.
err
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-ERR
\r\n
"
));
shared
.
emptybulk
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"$0
\r\n\r\n
"
));
shared
.
czero
=
createObject
(
OBJ
_STRING
,
sdsnew
(
":0
\r\n
"
));
shared
.
cone
=
createObject
(
OBJ
_STRING
,
sdsnew
(
":1
\r\n
"
));
shared
.
cnegone
=
createObject
(
OBJ
_STRING
,
sdsnew
(
":-1
\r\n
"
));
shared
.
nullbulk
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"$-1
\r\n
"
));
shared
.
nullmultibulk
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"*-1
\r\n
"
));
shared
.
emptymultibulk
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"*0
\r\n
"
));
shared
.
pong
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"+PONG
\r\n
"
));
shared
.
queued
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"+QUEUED
\r\n
"
));
shared
.
emptyscan
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"*2
\r\n
$1
\r\n
0
\r\n
*0
\r\n
"
));
shared
.
wrongtypeerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-WRONGTYPE Operation against a key holding the wrong kind of value
\r\n
"
));
shared
.
nokeyerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
nokeyerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-ERR no such key
\r\n
"
));
shared
.
syntaxerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
syntaxerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-ERR syntax error
\r\n
"
));
shared
.
sameobjecterr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
sameobjecterr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-ERR source and destination objects are the same
\r\n
"
));
shared
.
outofrangeerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
outofrangeerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-ERR index out of range
\r\n
"
));
shared
.
noscripterr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
noscripterr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-NOSCRIPT No matching script. Please use EVAL.
\r\n
"
));
shared
.
loadingerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
loadingerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-LOADING Redis is loading the dataset in memory
\r\n
"
));
shared
.
slowscripterr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
slowscripterr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
\r\n
"
));
shared
.
masterdownerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
masterdownerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-MASTERDOWN Link with MASTER is down and slave-serve-stale-data is set to 'no'.
\r\n
"
));
shared
.
bgsaveerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
bgsaveerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
\r\n
"
));
shared
.
roslaveerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
roslaveerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-READONLY You can't write against a read only slave.
\r\n
"
));
shared
.
noautherr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
noautherr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-NOAUTH Authentication required.
\r\n
"
));
shared
.
oomerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
oomerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-OOM command not allowed when used memory > 'maxmemory'.
\r\n
"
));
shared
.
execaborterr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
execaborterr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-EXECABORT Transaction discarded because of previous errors.
\r\n
"
));
shared
.
noreplicaserr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
noreplicaserr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-NOREPLICAS Not enough good slaves to write.
\r\n
"
));
shared
.
busykeyerr
=
createObject
(
REDIS
_STRING
,
sdsnew
(
shared
.
busykeyerr
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"-BUSYKEY Target key name already exists.
\r\n
"
));
shared
.
space
=
createObject
(
REDIS
_STRING
,
sdsnew
(
" "
));
shared
.
colon
=
createObject
(
REDIS
_STRING
,
sdsnew
(
":"
));
shared
.
plus
=
createObject
(
REDIS
_STRING
,
sdsnew
(
"+"
));
shared
.
space
=
createObject
(
OBJ
_STRING
,
sdsnew
(
" "
));
shared
.
colon
=
createObject
(
OBJ
_STRING
,
sdsnew
(
":"
));
shared
.
plus
=
createObject
(
OBJ
_STRING
,
sdsnew
(
"+"
));
for
(
j
=
0
;
j
<
REDIS_SHARED_SELECT_CMDS
;
j
++
)
{
char
dictid_str
[
64
];
int
dictid_len
;
dictid_len
=
ll2string
(
dictid_str
,
sizeof
(
dictid_str
),
j
);
shared
.
select
[
j
]
=
createObject
(
REDIS
_STRING
,
shared
.
select
[
j
]
=
createObject
(
OBJ
_STRING
,
sdscatprintf
(
sdsempty
(),
"*2
\r\n
$6
\r\n
SELECT
\r\n
$%d
\r\n
%s
\r\n
"
,
dictid_len
,
dictid_str
));
...
...
@@ -1394,13 +1394,13 @@ void createSharedObjects(void) {
shared
.
lpop
=
createStringObject
(
"LPOP"
,
4
);
shared
.
lpush
=
createStringObject
(
"LPUSH"
,
5
);
for
(
j
=
0
;
j
<
REDIS_SHARED_INTEGERS
;
j
++
)
{
shared
.
integers
[
j
]
=
createObject
(
REDIS
_STRING
,(
void
*
)(
long
)
j
);
shared
.
integers
[
j
]
->
encoding
=
REDIS
_ENCODING_INT
;
shared
.
integers
[
j
]
=
createObject
(
OBJ
_STRING
,(
void
*
)(
long
)
j
);
shared
.
integers
[
j
]
->
encoding
=
OBJ
_ENCODING_INT
;
}
for
(
j
=
0
;
j
<
REDIS_SHARED_BULKHDR_LEN
;
j
++
)
{
shared
.
mbulkhdr
[
j
]
=
createObject
(
REDIS
_STRING
,
shared
.
mbulkhdr
[
j
]
=
createObject
(
OBJ
_STRING
,
sdscatprintf
(
sdsempty
(),
"*%d
\r\n
"
,
j
));
shared
.
bulkhdr
[
j
]
=
createObject
(
REDIS
_STRING
,
shared
.
bulkhdr
[
j
]
=
createObject
(
OBJ
_STRING
,
sdscatprintf
(
sdsempty
(),
"$%d
\r\n
"
,
j
));
}
/* The following two shared objects, minstring and maxstrings, are not
...
...
@@ -1472,13 +1472,13 @@ void initServerConfig(void) {
server
.
maxmemory
=
CONFIG_DEFAULT_MAXMEMORY
;
server
.
maxmemory_policy
=
CONFIG_DEFAULT_MAXMEMORY_POLICY
;
server
.
maxmemory_samples
=
CONFIG_DEFAULT_MAXMEMORY_SAMPLES
;
server
.
hash_max_ziplist_entries
=
REDIS
_HASH_MAX_ZIPLIST_ENTRIES
;
server
.
hash_max_ziplist_value
=
REDIS
_HASH_MAX_ZIPLIST_VALUE
;
server
.
list_max_ziplist_size
=
REDIS
_LIST_MAX_ZIPLIST_SIZE
;
server
.
list_compress_depth
=
REDIS
_LIST_COMPRESS_DEPTH
;
server
.
set_max_intset_entries
=
REDIS
_SET_MAX_INTSET_ENTRIES
;
server
.
zset_max_ziplist_entries
=
REDIS
_ZSET_MAX_ZIPLIST_ENTRIES
;
server
.
zset_max_ziplist_value
=
REDIS
_ZSET_MAX_ZIPLIST_VALUE
;
server
.
hash_max_ziplist_entries
=
OBJ
_HASH_MAX_ZIPLIST_ENTRIES
;
server
.
hash_max_ziplist_value
=
OBJ
_HASH_MAX_ZIPLIST_VALUE
;
server
.
list_max_ziplist_size
=
OBJ
_LIST_MAX_ZIPLIST_SIZE
;
server
.
list_compress_depth
=
OBJ
_LIST_COMPRESS_DEPTH
;
server
.
set_max_intset_entries
=
OBJ
_SET_MAX_INTSET_ENTRIES
;
server
.
zset_max_ziplist_entries
=
OBJ
_ZSET_MAX_ZIPLIST_ENTRIES
;
server
.
zset_max_ziplist_value
=
OBJ
_ZSET_MAX_ZIPLIST_VALUE
;
server
.
hll_sparse_max_bytes
=
CONFIG_DEFAULT_HLL_SPARSE_MAX_BYTES
;
server
.
shutdown_asap
=
0
;
server
.
repl_ping_slave_period
=
REDIS_REPL_PING_SLAVE_PERIOD
;
...
...
src/server.h
View file @
14ff5724
...
...
@@ -184,25 +184,25 @@ typedef long long mstime_t; /* millisecond time type. */
#define REDIS_CMD_FAST 8192
/* "F" flag */
/* Object types */
#define
REDIS
_STRING 0
#define
REDIS
_LIST 1
#define
REDIS
_SET 2
#define
REDIS
_ZSET 3
#define
REDIS
_HASH 4
#define
OBJ
_STRING 0
#define
OBJ
_LIST 1
#define
OBJ
_SET 2
#define
OBJ
_ZSET 3
#define
OBJ
_HASH 4
/* Objects encoding. Some kind of objects like Strings and Hashes can be
* internally represented in multiple ways. The 'encoding' field of the object
* is set to one of this fields for this object. */
#define
REDIS
_ENCODING_RAW 0
/* Raw representation */
#define
REDIS
_ENCODING_INT 1
/* Encoded as integer */
#define
REDIS
_ENCODING_HT 2
/* Encoded as hash table */
#define
REDIS
_ENCODING_ZIPMAP 3
/* Encoded as zipmap */
#define
REDIS
_ENCODING_LINKEDLIST 4
/* Encoded as regular linked list */
#define
REDIS
_ENCODING_ZIPLIST 5
/* Encoded as ziplist */
#define
REDIS
_ENCODING_INTSET 6
/* Encoded as intset */
#define
REDIS
_ENCODING_SKIPLIST 7
/* Encoded as skiplist */
#define
REDIS
_ENCODING_EMBSTR 8
/* Embedded sds string encoding */
#define
REDIS
_ENCODING_QUICKLIST 9
/* Encoded as linked list of ziplists */
#define
OBJ
_ENCODING_RAW 0
/* Raw representation */
#define
OBJ
_ENCODING_INT 1
/* Encoded as integer */
#define
OBJ
_ENCODING_HT 2
/* Encoded as hash table */
#define
OBJ
_ENCODING_ZIPMAP 3
/* Encoded as zipmap */
#define
OBJ
_ENCODING_LINKEDLIST 4
/* Encoded as regular linked list */
#define
OBJ
_ENCODING_ZIPLIST 5
/* Encoded as ziplist */
#define
OBJ
_ENCODING_INTSET 6
/* Encoded as intset */
#define
OBJ
_ENCODING_SKIPLIST 7
/* Encoded as skiplist */
#define
OBJ
_ENCODING_EMBSTR 8
/* Embedded sds string encoding */
#define
OBJ
_ENCODING_QUICKLIST 9
/* Encoded as linked list of ziplists */
/* Defines related to the dump file format. To store 32 bits lengths for short
* keys requires a lot of space, so we check the most significant 2 bits of
...
...
@@ -333,15 +333,15 @@ typedef long long mstime_t; /* millisecond time type. */
#define CONFIG_DEFAULT_AOF_FSYNC AOF_FSYNC_EVERYSEC
/* Zip structure related defaults */
#define
REDIS
_HASH_MAX_ZIPLIST_ENTRIES 512
#define
REDIS
_HASH_MAX_ZIPLIST_VALUE 64
#define
REDIS
_SET_MAX_INTSET_ENTRIES 512
#define
REDIS
_ZSET_MAX_ZIPLIST_ENTRIES 128
#define
REDIS
_ZSET_MAX_ZIPLIST_VALUE 64
#define
OBJ
_HASH_MAX_ZIPLIST_ENTRIES 512
#define
OBJ
_HASH_MAX_ZIPLIST_VALUE 64
#define
OBJ
_SET_MAX_INTSET_ENTRIES 512
#define
OBJ
_ZSET_MAX_ZIPLIST_ENTRIES 128
#define
OBJ
_ZSET_MAX_ZIPLIST_VALUE 64
/* List defaults */
#define
REDIS
_LIST_MAX_ZIPLIST_SIZE -2
#define
REDIS
_LIST_COMPRESS_DEPTH 0
#define
OBJ
_LIST_MAX_ZIPLIST_SIZE -2
#define
OBJ
_LIST_COMPRESS_DEPTH 0
/* HyperLogLog defines */
#define CONFIG_DEFAULT_HLL_SPARSE_MAX_BYTES 3000
...
...
@@ -446,8 +446,8 @@ typedef struct redisObject {
* bug #85 introduced exactly in this way. */
#define initStaticStringObject(_var,_ptr) do { \
_var.refcount = 1; \
_var.type =
REDIS
_STRING; \
_var.encoding =
REDIS
_ENCODING_RAW; \
_var.type =
OBJ
_STRING; \
_var.encoding =
OBJ
_ENCODING_RAW; \
_var.ptr = _ptr; \
} while(0);
...
...
@@ -1006,8 +1006,8 @@ typedef struct {
dictEntry
*
de
;
}
hashTypeIterator
;
#define
REDIS
_HASH_KEY 1
#define
REDIS
_HASH_VALUE 2
#define
OBJ
_HASH_KEY 1
#define
OBJ
_HASH_VALUE 2
/*-----------------------------------------------------------------------------
* Extern declarations
...
...
@@ -1166,7 +1166,7 @@ int compareStringObjects(robj *a, robj *b);
int
collateStringObjects
(
robj
*
a
,
robj
*
b
);
int
equalStringObjects
(
robj
*
a
,
robj
*
b
);
unsigned
long
long
estimateObjectIdleTime
(
robj
*
o
);
#define sdsEncodedObject(objptr) (objptr->encoding ==
REDIS
_ENCODING_RAW || objptr->encoding ==
REDIS
_ENCODING_EMBSTR)
#define sdsEncodedObject(objptr) (objptr->encoding ==
OBJ
_ENCODING_RAW || objptr->encoding ==
OBJ
_ENCODING_EMBSTR)
/* Synchronous I/O with timeout */
ssize_t
syncWrite
(
int
fd
,
char
*
ptr
,
ssize_t
size
,
long
long
timeout
);
...
...
src/slowlog.c
View file @
14ff5724
...
...
@@ -57,12 +57,12 @@ slowlogEntry *slowlogCreateEntry(robj **argv, int argc, long long duration) {
* at SLOWLOG_ENTRY_MAX_ARGC, but use the last argument to specify
* how many remaining arguments there were in the original command. */
if
(
slargc
!=
argc
&&
j
==
slargc
-
1
)
{
se
->
argv
[
j
]
=
createObject
(
REDIS
_STRING
,
se
->
argv
[
j
]
=
createObject
(
OBJ
_STRING
,
sdscatprintf
(
sdsempty
(),
"... (%d more arguments)"
,
argc
-
slargc
+
1
));
}
else
{
/* Trim too long strings as well... */
if
(
argv
[
j
]
->
type
==
REDIS
_STRING
&&
if
(
argv
[
j
]
->
type
==
OBJ
_STRING
&&
sdsEncodedObject
(
argv
[
j
])
&&
sdslen
(
argv
[
j
]
->
ptr
)
>
SLOWLOG_ENTRY_MAX_STRING
)
{
...
...
@@ -71,7 +71,7 @@ slowlogEntry *slowlogCreateEntry(robj **argv, int argc, long long duration) {
s
=
sdscatprintf
(
s
,
"... (%lu more bytes)"
,
(
unsigned
long
)
sdslen
(
argv
[
j
]
->
ptr
)
-
SLOWLOG_ENTRY_MAX_STRING
);
se
->
argv
[
j
]
=
createObject
(
REDIS
_STRING
,
s
);
se
->
argv
[
j
]
=
createObject
(
OBJ
_STRING
,
s
);
}
else
{
se
->
argv
[
j
]
=
argv
[
j
];
incrRefCount
(
argv
[
j
]);
...
...
src/sort.c
View file @
14ff5724
...
...
@@ -110,13 +110,13 @@ robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
if
(
o
==
NULL
)
goto
noobj
;
if
(
fieldobj
)
{
if
(
o
->
type
!=
REDIS
_HASH
)
goto
noobj
;
if
(
o
->
type
!=
OBJ
_HASH
)
goto
noobj
;
/* Retrieve value from hash by the field name. This operation
* already increases the refcount of the returned object. */
o
=
hashTypeGetObject
(
o
,
fieldobj
);
}
else
{
if
(
o
->
type
!=
REDIS
_STRING
)
goto
noobj
;
if
(
o
->
type
!=
OBJ
_STRING
)
goto
noobj
;
/* Every object that this function returns needs to have its refcount
* increased. sortCommand decreases it again. */
...
...
@@ -200,9 +200,9 @@ void sortCommand(client *c) {
/* Lookup the key to sort. It must be of the right types */
sortval
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
(
sortval
&&
sortval
->
type
!=
REDIS
_SET
&&
sortval
->
type
!=
REDIS
_LIST
&&
sortval
->
type
!=
REDIS
_ZSET
)
if
(
sortval
&&
sortval
->
type
!=
OBJ
_SET
&&
sortval
->
type
!=
OBJ
_LIST
&&
sortval
->
type
!=
OBJ
_ZSET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
...
...
@@ -292,7 +292,7 @@ void sortCommand(client *c) {
* even if no sort order is requested, so they remain stable across
* scripting and replication. */
if
(
dontsort
&&
sortval
->
type
==
REDIS
_SET
&&
sortval
->
type
==
OBJ
_SET
&&
(
storekey
||
c
->
flags
&
REDIS_LUA_CLIENT
))
{
/* Force ALPHA sorting */
...
...
@@ -302,14 +302,14 @@ void sortCommand(client *c) {
}
/* Destructively convert encoded sorted sets for SORT. */
if
(
sortval
->
type
==
REDIS
_ZSET
)
zsetConvert
(
sortval
,
REDIS
_ENCODING_SKIPLIST
);
if
(
sortval
->
type
==
OBJ
_ZSET
)
zsetConvert
(
sortval
,
OBJ
_ENCODING_SKIPLIST
);
/* Objtain the length of the object to sort. */
switch
(
sortval
->
type
)
{
case
REDIS
_LIST
:
vectorlen
=
listTypeLength
(
sortval
);
break
;
case
REDIS
_SET
:
vectorlen
=
setTypeSize
(
sortval
);
break
;
case
REDIS
_ZSET
:
vectorlen
=
dictSize
(((
zset
*
)
sortval
->
ptr
)
->
dict
);
break
;
case
OBJ
_LIST
:
vectorlen
=
listTypeLength
(
sortval
);
break
;
case
OBJ
_SET
:
vectorlen
=
setTypeSize
(
sortval
);
break
;
case
OBJ
_ZSET
:
vectorlen
=
dictSize
(((
zset
*
)
sortval
->
ptr
)
->
dict
);
break
;
default:
vectorlen
=
0
;
redisPanic
(
"Bad SORT type"
);
/* Avoid GCC warning */
}
...
...
@@ -332,7 +332,7 @@ void sortCommand(client *c) {
* the number of elements to fetch, we also optimize to just load the
* range we are interested in and allocating a vector that is big enough
* for the selected range length. */
if
((
sortval
->
type
==
REDIS
_ZSET
||
sortval
->
type
==
REDIS
_LIST
)
&&
if
((
sortval
->
type
==
OBJ
_ZSET
||
sortval
->
type
==
OBJ
_LIST
)
&&
dontsort
&&
(
start
!=
0
||
end
!=
vectorlen
-
1
))
{
...
...
@@ -343,7 +343,7 @@ void sortCommand(client *c) {
vector
=
zmalloc
(
sizeof
(
redisSortObject
)
*
vectorlen
);
j
=
0
;
if
(
sortval
->
type
==
REDIS
_LIST
&&
dontsort
)
{
if
(
sortval
->
type
==
OBJ
_LIST
&&
dontsort
)
{
/* Special handling for a list, if 'dontsort' is true.
* This makes sure we return elements in the list original
* ordering, accordingly to DESC / ASC options.
...
...
@@ -368,7 +368,7 @@ void sortCommand(client *c) {
end
-=
start
;
start
=
0
;
}
}
else
if
(
sortval
->
type
==
REDIS
_LIST
)
{
}
else
if
(
sortval
->
type
==
OBJ
_LIST
)
{
listTypeIterator
*
li
=
listTypeInitIterator
(
sortval
,
0
,
REDIS_TAIL
);
listTypeEntry
entry
;
while
(
listTypeNext
(
li
,
&
entry
))
{
...
...
@@ -378,7 +378,7 @@ void sortCommand(client *c) {
j
++
;
}
listTypeReleaseIterator
(
li
);
}
else
if
(
sortval
->
type
==
REDIS
_SET
)
{
}
else
if
(
sortval
->
type
==
OBJ
_SET
)
{
setTypeIterator
*
si
=
setTypeInitIterator
(
sortval
);
robj
*
ele
;
while
((
ele
=
setTypeNextObject
(
si
))
!=
NULL
)
{
...
...
@@ -388,7 +388,7 @@ void sortCommand(client *c) {
j
++
;
}
setTypeReleaseIterator
(
si
);
}
else
if
(
sortval
->
type
==
REDIS
_ZSET
&&
dontsort
)
{
}
else
if
(
sortval
->
type
==
OBJ
_ZSET
&&
dontsort
)
{
/* Special handling for a sorted set, if 'dontsort' is true.
* This makes sure we return elements in the sorted set original
* ordering, accordingly to DESC / ASC options.
...
...
@@ -427,7 +427,7 @@ void sortCommand(client *c) {
/* Fix start/end: output code is not aware of this optimization. */
end
-=
start
;
start
=
0
;
}
else
if
(
sortval
->
type
==
REDIS
_ZSET
)
{
}
else
if
(
sortval
->
type
==
OBJ
_ZSET
)
{
dict
*
set
=
((
zset
*
)
sortval
->
ptr
)
->
dict
;
dictIterator
*
di
;
dictEntry
*
setele
;
...
...
@@ -469,7 +469,7 @@ void sortCommand(client *c) {
{
int_convertion_error
=
1
;
}
}
else
if
(
byval
->
encoding
==
REDIS
_ENCODING_INT
)
{
}
else
if
(
byval
->
encoding
==
OBJ
_ENCODING_INT
)
{
/* Don't need to decode the object if it's
* integer-encoded (the only encoding supported) so
* far. We can just cast it */
...
...
@@ -577,7 +577,7 @@ void sortCommand(client *c) {
}
/* Cleanup */
if
(
sortval
->
type
==
REDIS
_LIST
||
sortval
->
type
==
REDIS
_SET
)
if
(
sortval
->
type
==
OBJ
_LIST
||
sortval
->
type
==
OBJ
_SET
)
for
(
j
=
0
;
j
<
vectorlen
;
j
++
)
decrRefCount
(
vector
[
j
].
obj
);
decrRefCount
(
sortval
);
...
...
src/t_hash.c
View file @
14ff5724
...
...
@@ -40,13 +40,13 @@
void
hashTypeTryConversion
(
robj
*
o
,
robj
**
argv
,
int
start
,
int
end
)
{
int
i
;
if
(
o
->
encoding
!=
REDIS
_ENCODING_ZIPLIST
)
return
;
if
(
o
->
encoding
!=
OBJ
_ENCODING_ZIPLIST
)
return
;
for
(
i
=
start
;
i
<=
end
;
i
++
)
{
if
(
sdsEncodedObject
(
argv
[
i
])
&&
sdslen
(
argv
[
i
]
->
ptr
)
>
server
.
hash_max_ziplist_value
)
{
hashTypeConvert
(
o
,
REDIS
_ENCODING_HT
);
hashTypeConvert
(
o
,
OBJ
_ENCODING_HT
);
break
;
}
}
...
...
@@ -54,7 +54,7 @@ void hashTypeTryConversion(robj *o, robj **argv, int start, int end) {
/* Encode given objects in-place when the hash uses a dict. */
void
hashTypeTryObjectEncoding
(
robj
*
subject
,
robj
**
o1
,
robj
**
o2
)
{
if
(
subject
->
encoding
==
REDIS
_ENCODING_HT
)
{
if
(
subject
->
encoding
==
OBJ
_ENCODING_HT
)
{
if
(
o1
)
*
o1
=
tryObjectEncoding
(
*
o1
);
if
(
o2
)
*
o2
=
tryObjectEncoding
(
*
o2
);
}
...
...
@@ -70,7 +70,7 @@ int hashTypeGetFromZiplist(robj *o, robj *field,
unsigned
char
*
zl
,
*
fptr
=
NULL
,
*
vptr
=
NULL
;
int
ret
;
redisAssert
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
);
redisAssert
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
);
field
=
getDecodedObject
(
field
);
...
...
@@ -101,7 +101,7 @@ int hashTypeGetFromZiplist(robj *o, robj *field,
int
hashTypeGetFromHashTable
(
robj
*
o
,
robj
*
field
,
robj
**
value
)
{
dictEntry
*
de
;
redisAssert
(
o
->
encoding
==
REDIS
_ENCODING_HT
);
redisAssert
(
o
->
encoding
==
OBJ
_ENCODING_HT
);
de
=
dictFind
(
o
->
ptr
,
field
);
if
(
de
==
NULL
)
return
-
1
;
...
...
@@ -118,7 +118,7 @@ int hashTypeGetFromHashTable(robj *o, robj *field, robj **value) {
robj
*
hashTypeGetObject
(
robj
*
o
,
robj
*
field
)
{
robj
*
value
=
NULL
;
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
vstr
=
NULL
;
unsigned
int
vlen
=
UINT_MAX
;
long
long
vll
=
LLONG_MAX
;
...
...
@@ -130,7 +130,7 @@ robj *hashTypeGetObject(robj *o, robj *field) {
value
=
createStringObjectFromLongLong
(
vll
);
}
}
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
robj
*
aux
;
if
(
hashTypeGetFromHashTable
(
o
,
field
,
&
aux
)
==
0
)
{
...
...
@@ -148,14 +148,14 @@ robj *hashTypeGetObject(robj *o, robj *field) {
* exist. */
size_t
hashTypeGetValueLength
(
robj
*
o
,
robj
*
field
)
{
size_t
len
=
0
;
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
vstr
=
NULL
;
unsigned
int
vlen
=
UINT_MAX
;
long
long
vll
=
LLONG_MAX
;
if
(
hashTypeGetFromZiplist
(
o
,
field
,
&
vstr
,
&
vlen
,
&
vll
)
==
0
)
len
=
vstr
?
vlen
:
sdigits10
(
vll
);
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
robj
*
aux
;
if
(
hashTypeGetFromHashTable
(
o
,
field
,
&
aux
)
==
0
)
...
...
@@ -169,13 +169,13 @@ size_t hashTypeGetValueLength(robj *o, robj *field) {
/* Test if the specified field exists in the given hash. Returns 1 if the field
* exists, and 0 when it doesn't. */
int
hashTypeExists
(
robj
*
o
,
robj
*
field
)
{
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
vstr
=
NULL
;
unsigned
int
vlen
=
UINT_MAX
;
long
long
vll
=
LLONG_MAX
;
if
(
hashTypeGetFromZiplist
(
o
,
field
,
&
vstr
,
&
vlen
,
&
vll
)
==
0
)
return
1
;
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
robj
*
aux
;
if
(
hashTypeGetFromHashTable
(
o
,
field
,
&
aux
)
==
0
)
return
1
;
...
...
@@ -192,7 +192,7 @@ int hashTypeExists(robj *o, robj *field) {
int
hashTypeSet
(
robj
*
o
,
robj
*
field
,
robj
*
value
)
{
int
update
=
0
;
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
zl
,
*
fptr
,
*
vptr
;
field
=
getDecodedObject
(
field
);
...
...
@@ -227,8 +227,8 @@ int hashTypeSet(robj *o, robj *field, robj *value) {
/* Check if the ziplist needs to be converted to a hash table */
if
(
hashTypeLength
(
o
)
>
server
.
hash_max_ziplist_entries
)
hashTypeConvert
(
o
,
REDIS
_ENCODING_HT
);
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
hashTypeConvert
(
o
,
OBJ
_ENCODING_HT
);
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
if
(
dictReplace
(
o
->
ptr
,
field
,
value
))
{
/* Insert */
incrRefCount
(
field
);
}
else
{
/* Update */
...
...
@@ -246,7 +246,7 @@ int hashTypeSet(robj *o, robj *field, robj *value) {
int
hashTypeDelete
(
robj
*
o
,
robj
*
field
)
{
int
deleted
=
0
;
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
zl
,
*
fptr
;
field
=
getDecodedObject
(
field
);
...
...
@@ -265,7 +265,7 @@ int hashTypeDelete(robj *o, robj *field) {
decrRefCount
(
field
);
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
if
(
dictDelete
((
dict
*
)
o
->
ptr
,
field
)
==
REDIS_OK
)
{
deleted
=
1
;
...
...
@@ -284,9 +284,9 @@ int hashTypeDelete(robj *o, robj *field) {
unsigned
long
hashTypeLength
(
robj
*
o
)
{
unsigned
long
length
=
ULONG_MAX
;
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
length
=
ziplistLen
(
o
->
ptr
)
/
2
;
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
length
=
dictSize
((
dict
*
)
o
->
ptr
);
}
else
{
redisPanic
(
"Unknown hash encoding"
);
...
...
@@ -300,10 +300,10 @@ hashTypeIterator *hashTypeInitIterator(robj *subject) {
hi
->
subject
=
subject
;
hi
->
encoding
=
subject
->
encoding
;
if
(
hi
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
hi
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
hi
->
fptr
=
NULL
;
hi
->
vptr
=
NULL
;
}
else
if
(
hi
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
hi
->
encoding
==
OBJ
_ENCODING_HT
)
{
hi
->
di
=
dictGetIterator
(
subject
->
ptr
);
}
else
{
redisPanic
(
"Unknown hash encoding"
);
...
...
@@ -313,7 +313,7 @@ hashTypeIterator *hashTypeInitIterator(robj *subject) {
}
void
hashTypeReleaseIterator
(
hashTypeIterator
*
hi
)
{
if
(
hi
->
encoding
==
REDIS
_ENCODING_HT
)
{
if
(
hi
->
encoding
==
OBJ
_ENCODING_HT
)
{
dictReleaseIterator
(
hi
->
di
);
}
...
...
@@ -323,7 +323,7 @@ void hashTypeReleaseIterator(hashTypeIterator *hi) {
/* Move to the next entry in the hash. Return REDIS_OK when the next entry
* could be found and REDIS_ERR when the iterator reaches the end. */
int
hashTypeNext
(
hashTypeIterator
*
hi
)
{
if
(
hi
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
hi
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
zl
;
unsigned
char
*
fptr
,
*
vptr
;
...
...
@@ -349,7 +349,7 @@ int hashTypeNext(hashTypeIterator *hi) {
/* fptr, vptr now point to the first or next pair */
hi
->
fptr
=
fptr
;
hi
->
vptr
=
vptr
;
}
else
if
(
hi
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
hi
->
encoding
==
OBJ
_ENCODING_HT
)
{
if
((
hi
->
de
=
dictNext
(
hi
->
di
))
==
NULL
)
return
REDIS_ERR
;
}
else
{
redisPanic
(
"Unknown hash encoding"
);
...
...
@@ -366,9 +366,9 @@ void hashTypeCurrentFromZiplist(hashTypeIterator *hi, int what,
{
int
ret
;
redisAssert
(
hi
->
encoding
==
REDIS
_ENCODING_ZIPLIST
);
redisAssert
(
hi
->
encoding
==
OBJ
_ENCODING_ZIPLIST
);
if
(
what
&
REDIS
_HASH_KEY
)
{
if
(
what
&
OBJ
_HASH_KEY
)
{
ret
=
ziplistGet
(
hi
->
fptr
,
vstr
,
vlen
,
vll
);
redisAssert
(
ret
);
}
else
{
...
...
@@ -380,9 +380,9 @@ void hashTypeCurrentFromZiplist(hashTypeIterator *hi, int what,
/* Get the field or value at iterator cursor, for an iterator on a hash value
* encoded as a ziplist. Prototype is similar to `hashTypeGetFromHashTable`. */
void
hashTypeCurrentFromHashTable
(
hashTypeIterator
*
hi
,
int
what
,
robj
**
dst
)
{
redisAssert
(
hi
->
encoding
==
REDIS
_ENCODING_HT
);
redisAssert
(
hi
->
encoding
==
OBJ
_ENCODING_HT
);
if
(
what
&
REDIS
_HASH_KEY
)
{
if
(
what
&
OBJ
_HASH_KEY
)
{
*
dst
=
dictGetKey
(
hi
->
de
);
}
else
{
*
dst
=
dictGetVal
(
hi
->
de
);
...
...
@@ -395,7 +395,7 @@ void hashTypeCurrentFromHashTable(hashTypeIterator *hi, int what, robj **dst) {
robj
*
hashTypeCurrentObject
(
hashTypeIterator
*
hi
,
int
what
)
{
robj
*
dst
;
if
(
hi
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
hi
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
vstr
=
NULL
;
unsigned
int
vlen
=
UINT_MAX
;
long
long
vll
=
LLONG_MAX
;
...
...
@@ -406,7 +406,7 @@ robj *hashTypeCurrentObject(hashTypeIterator *hi, int what) {
}
else
{
dst
=
createStringObjectFromLongLong
(
vll
);
}
}
else
if
(
hi
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
hi
->
encoding
==
OBJ
_ENCODING_HT
)
{
hashTypeCurrentFromHashTable
(
hi
,
what
,
&
dst
);
incrRefCount
(
dst
);
}
else
{
...
...
@@ -421,7 +421,7 @@ robj *hashTypeLookupWriteOrCreate(client *c, robj *key) {
o
=
createHashObject
();
dbAdd
(
c
->
db
,
key
,
o
);
}
else
{
if
(
o
->
type
!=
REDIS
_HASH
)
{
if
(
o
->
type
!=
OBJ
_HASH
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
NULL
;
}
...
...
@@ -430,12 +430,12 @@ robj *hashTypeLookupWriteOrCreate(client *c, robj *key) {
}
void
hashTypeConvertZiplist
(
robj
*
o
,
int
enc
)
{
redisAssert
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
);
redisAssert
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
);
if
(
enc
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
enc
==
OBJ
_ENCODING_ZIPLIST
)
{
/* Nothing to do... */
}
else
if
(
enc
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
enc
==
OBJ
_ENCODING_HT
)
{
hashTypeIterator
*
hi
;
dict
*
dict
;
int
ret
;
...
...
@@ -446,9 +446,9 @@ void hashTypeConvertZiplist(robj *o, int enc) {
while
(
hashTypeNext
(
hi
)
!=
REDIS_ERR
)
{
robj
*
field
,
*
value
;
field
=
hashTypeCurrentObject
(
hi
,
REDIS
_HASH_KEY
);
field
=
hashTypeCurrentObject
(
hi
,
OBJ
_HASH_KEY
);
field
=
tryObjectEncoding
(
field
);
value
=
hashTypeCurrentObject
(
hi
,
REDIS
_HASH_VALUE
);
value
=
hashTypeCurrentObject
(
hi
,
OBJ
_HASH_VALUE
);
value
=
tryObjectEncoding
(
value
);
ret
=
dictAdd
(
dict
,
field
,
value
);
if
(
ret
!=
DICT_OK
)
{
...
...
@@ -461,7 +461,7 @@ void hashTypeConvertZiplist(robj *o, int enc) {
hashTypeReleaseIterator
(
hi
);
zfree
(
o
->
ptr
);
o
->
encoding
=
REDIS
_ENCODING_HT
;
o
->
encoding
=
OBJ
_ENCODING_HT
;
o
->
ptr
=
dict
;
}
else
{
...
...
@@ -470,9 +470,9 @@ void hashTypeConvertZiplist(robj *o, int enc) {
}
void
hashTypeConvert
(
robj
*
o
,
int
enc
)
{
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
hashTypeConvertZiplist
(
o
,
enc
);
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
redisPanic
(
"Not implemented"
);
}
else
{
redisPanic
(
"Unknown hash encoding"
);
...
...
@@ -613,7 +613,7 @@ static void addHashFieldToReply(client *c, robj *o, robj *field) {
return
;
}
if
(
o
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
vstr
=
NULL
;
unsigned
int
vlen
=
UINT_MAX
;
long
long
vll
=
LLONG_MAX
;
...
...
@@ -629,7 +629,7 @@ static void addHashFieldToReply(client *c, robj *o, robj *field) {
}
}
}
else
if
(
o
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
o
->
encoding
==
OBJ
_ENCODING_HT
)
{
robj
*
value
;
ret
=
hashTypeGetFromHashTable
(
o
,
field
,
&
value
);
...
...
@@ -648,7 +648,7 @@ void hgetCommand(client *c) {
robj
*
o
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_HASH
))
return
;
checkType
(
c
,
o
,
OBJ
_HASH
))
return
;
addHashFieldToReply
(
c
,
o
,
c
->
argv
[
2
]);
}
...
...
@@ -660,7 +660,7 @@ void hmgetCommand(client *c) {
/* Don't abort when the key cannot be found. Non-existing keys are empty
* hashes, where HMGET should respond with a series of null bulks. */
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
!=
NULL
&&
o
->
type
!=
REDIS
_HASH
)
{
if
(
o
!=
NULL
&&
o
->
type
!=
OBJ
_HASH
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
...
...
@@ -676,7 +676,7 @@ void hdelCommand(client *c) {
int
j
,
deleted
=
0
,
keyremoved
=
0
;
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_HASH
))
return
;
checkType
(
c
,
o
,
OBJ
_HASH
))
return
;
for
(
j
=
2
;
j
<
c
->
argc
;
j
++
)
{
if
(
hashTypeDelete
(
o
,
c
->
argv
[
j
]))
{
...
...
@@ -703,7 +703,7 @@ void hlenCommand(client *c) {
robj
*
o
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_HASH
))
return
;
checkType
(
c
,
o
,
OBJ
_HASH
))
return
;
addReplyLongLong
(
c
,
hashTypeLength
(
o
));
}
...
...
@@ -712,12 +712,12 @@ void hstrlenCommand(client *c) {
robj
*
o
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_HASH
))
return
;
checkType
(
c
,
o
,
OBJ
_HASH
))
return
;
addReplyLongLong
(
c
,
hashTypeGetValueLength
(
o
,
c
->
argv
[
2
]));
}
static
void
addHashIteratorCursorToReply
(
client
*
c
,
hashTypeIterator
*
hi
,
int
what
)
{
if
(
hi
->
encoding
==
REDIS
_ENCODING_ZIPLIST
)
{
if
(
hi
->
encoding
==
OBJ
_ENCODING_ZIPLIST
)
{
unsigned
char
*
vstr
=
NULL
;
unsigned
int
vlen
=
UINT_MAX
;
long
long
vll
=
LLONG_MAX
;
...
...
@@ -729,7 +729,7 @@ static void addHashIteratorCursorToReply(client *c, hashTypeIterator *hi, int wh
addReplyBulkLongLong
(
c
,
vll
);
}
}
else
if
(
hi
->
encoding
==
REDIS
_ENCODING_HT
)
{
}
else
if
(
hi
->
encoding
==
OBJ
_ENCODING_HT
)
{
robj
*
value
;
hashTypeCurrentFromHashTable
(
hi
,
what
,
&
value
);
...
...
@@ -747,22 +747,22 @@ void genericHgetallCommand(client *c, int flags) {
int
length
,
count
=
0
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
emptymultibulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_HASH
))
return
;
||
checkType
(
c
,
o
,
OBJ
_HASH
))
return
;
if
(
flags
&
REDIS
_HASH_KEY
)
multiplier
++
;
if
(
flags
&
REDIS
_HASH_VALUE
)
multiplier
++
;
if
(
flags
&
OBJ
_HASH_KEY
)
multiplier
++
;
if
(
flags
&
OBJ
_HASH_VALUE
)
multiplier
++
;
length
=
hashTypeLength
(
o
)
*
multiplier
;
addReplyMultiBulkLen
(
c
,
length
);
hi
=
hashTypeInitIterator
(
o
);
while
(
hashTypeNext
(
hi
)
!=
REDIS_ERR
)
{
if
(
flags
&
REDIS
_HASH_KEY
)
{
addHashIteratorCursorToReply
(
c
,
hi
,
REDIS
_HASH_KEY
);
if
(
flags
&
OBJ
_HASH_KEY
)
{
addHashIteratorCursorToReply
(
c
,
hi
,
OBJ
_HASH_KEY
);
count
++
;
}
if
(
flags
&
REDIS
_HASH_VALUE
)
{
addHashIteratorCursorToReply
(
c
,
hi
,
REDIS
_HASH_VALUE
);
if
(
flags
&
OBJ
_HASH_VALUE
)
{
addHashIteratorCursorToReply
(
c
,
hi
,
OBJ
_HASH_VALUE
);
count
++
;
}
}
...
...
@@ -772,21 +772,21 @@ void genericHgetallCommand(client *c, int flags) {
}
void
hkeysCommand
(
client
*
c
)
{
genericHgetallCommand
(
c
,
REDIS
_HASH_KEY
);
genericHgetallCommand
(
c
,
OBJ
_HASH_KEY
);
}
void
hvalsCommand
(
client
*
c
)
{
genericHgetallCommand
(
c
,
REDIS
_HASH_VALUE
);
genericHgetallCommand
(
c
,
OBJ
_HASH_VALUE
);
}
void
hgetallCommand
(
client
*
c
)
{
genericHgetallCommand
(
c
,
REDIS
_HASH_KEY
|
REDIS
_HASH_VALUE
);
genericHgetallCommand
(
c
,
OBJ
_HASH_KEY
|
OBJ
_HASH_VALUE
);
}
void
hexistsCommand
(
client
*
c
)
{
robj
*
o
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_HASH
))
return
;
checkType
(
c
,
o
,
OBJ
_HASH
))
return
;
addReply
(
c
,
hashTypeExists
(
o
,
c
->
argv
[
2
])
?
shared
.
cone
:
shared
.
czero
);
}
...
...
@@ -797,6 +797,6 @@ void hscanCommand(client *c) {
if
(
parseScanCursorOrReply
(
c
,
c
->
argv
[
2
],
&
cursor
)
==
REDIS_ERR
)
return
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
emptyscan
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_HASH
))
return
;
checkType
(
c
,
o
,
OBJ
_HASH
))
return
;
scanGenericCommand
(
c
,
o
,
cursor
);
}
src/t_list.c
View file @
14ff5724
...
...
@@ -39,7 +39,7 @@
* There is no need for the caller to increment the refcount of 'value' as
* the function takes care of it if needed. */
void
listTypePush
(
robj
*
subject
,
robj
*
value
,
int
where
)
{
if
(
subject
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
subject
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
int
pos
=
(
where
==
REDIS_HEAD
)
?
QUICKLIST_HEAD
:
QUICKLIST_TAIL
;
value
=
getDecodedObject
(
value
);
size_t
len
=
sdslen
(
value
->
ptr
);
...
...
@@ -59,7 +59,7 @@ robj *listTypePop(robj *subject, int where) {
robj
*
value
=
NULL
;
int
ql_where
=
where
==
REDIS_HEAD
?
QUICKLIST_HEAD
:
QUICKLIST_TAIL
;
if
(
subject
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
subject
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
if
(
quicklistPopCustom
(
subject
->
ptr
,
ql_where
,
(
unsigned
char
**
)
&
value
,
NULL
,
&
vlong
,
listPopSaver
))
{
if
(
!
value
)
...
...
@@ -72,7 +72,7 @@ robj *listTypePop(robj *subject, int where) {
}
unsigned
long
listTypeLength
(
robj
*
subject
)
{
if
(
subject
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
subject
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
return
quicklistCount
(
subject
->
ptr
);
}
else
{
redisPanic
(
"Unknown list encoding"
);
...
...
@@ -91,7 +91,7 @@ listTypeIterator *listTypeInitIterator(robj *subject, long index,
* REDIS_TAIL means start at HEAD and move *towards tail. */
int
iter_direction
=
direction
==
REDIS_HEAD
?
AL_START_TAIL
:
AL_START_HEAD
;
if
(
li
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
li
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
li
->
iter
=
quicklistGetIteratorAtIdx
(
li
->
subject
->
ptr
,
iter_direction
,
index
);
}
else
{
...
...
@@ -114,7 +114,7 @@ int listTypeNext(listTypeIterator *li, listTypeEntry *entry) {
redisAssert
(
li
->
subject
->
encoding
==
li
->
encoding
);
entry
->
li
=
li
;
if
(
li
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
li
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
return
quicklistNext
(
li
->
iter
,
&
entry
->
entry
);
}
else
{
redisPanic
(
"Unknown list encoding"
);
...
...
@@ -125,7 +125,7 @@ int listTypeNext(listTypeIterator *li, listTypeEntry *entry) {
/* Return entry or NULL at the current position of the iterator. */
robj
*
listTypeGet
(
listTypeEntry
*
entry
)
{
robj
*
value
=
NULL
;
if
(
entry
->
li
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
entry
->
li
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
if
(
entry
->
entry
.
value
)
{
value
=
createStringObject
((
char
*
)
entry
->
entry
.
value
,
entry
->
entry
.
sz
);
...
...
@@ -139,7 +139,7 @@ robj *listTypeGet(listTypeEntry *entry) {
}
void
listTypeInsert
(
listTypeEntry
*
entry
,
robj
*
value
,
int
where
)
{
if
(
entry
->
li
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
entry
->
li
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
value
=
getDecodedObject
(
value
);
sds
str
=
value
->
ptr
;
size_t
len
=
sdslen
(
str
);
...
...
@@ -158,7 +158,7 @@ void listTypeInsert(listTypeEntry *entry, robj *value, int where) {
/* Compare the given object with the entry at the current position. */
int
listTypeEqual
(
listTypeEntry
*
entry
,
robj
*
o
)
{
if
(
entry
->
li
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
entry
->
li
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
redisAssertWithInfo
(
NULL
,
o
,
sdsEncodedObject
(
o
));
return
quicklistCompare
(
entry
->
entry
.
zi
,
o
->
ptr
,
sdslen
(
o
->
ptr
));
}
else
{
...
...
@@ -168,7 +168,7 @@ int listTypeEqual(listTypeEntry *entry, robj *o) {
/* Delete the element pointed to. */
void
listTypeDelete
(
listTypeIterator
*
iter
,
listTypeEntry
*
entry
)
{
if
(
entry
->
li
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
entry
->
li
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
quicklistDelEntry
(
iter
->
iter
,
&
entry
->
entry
);
}
else
{
redisPanic
(
"Unknown list encoding"
);
...
...
@@ -177,14 +177,14 @@ void listTypeDelete(listTypeIterator *iter, listTypeEntry *entry) {
/* Create a quicklist from a single ziplist */
void
listTypeConvert
(
robj
*
subject
,
int
enc
)
{
redisAssertWithInfo
(
NULL
,
subject
,
subject
->
type
==
REDIS
_LIST
);
redisAssertWithInfo
(
NULL
,
subject
,
subject
->
encoding
==
REDIS
_ENCODING_ZIPLIST
);
redisAssertWithInfo
(
NULL
,
subject
,
subject
->
type
==
OBJ
_LIST
);
redisAssertWithInfo
(
NULL
,
subject
,
subject
->
encoding
==
OBJ
_ENCODING_ZIPLIST
);
if
(
enc
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
enc
==
OBJ
_ENCODING_QUICKLIST
)
{
size_t
zlen
=
server
.
list_max_ziplist_size
;
int
depth
=
server
.
list_compress_depth
;
subject
->
ptr
=
quicklistCreateFromZiplist
(
zlen
,
depth
,
subject
->
ptr
);
subject
->
encoding
=
REDIS
_ENCODING_QUICKLIST
;
subject
->
encoding
=
OBJ
_ENCODING_QUICKLIST
;
}
else
{
redisPanic
(
"Unsupported list conversion"
);
}
...
...
@@ -198,7 +198,7 @@ void pushGenericCommand(client *c, int where) {
int
j
,
waiting
=
0
,
pushed
=
0
;
robj
*
lobj
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
(
lobj
&&
lobj
->
type
!=
REDIS
_LIST
)
{
if
(
lobj
&&
lobj
->
type
!=
OBJ
_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
...
...
@@ -239,7 +239,7 @@ void pushxGenericCommand(client *c, robj *refval, robj *val, int where) {
int
inserted
=
0
;
if
((
subject
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
subject
,
REDIS
_LIST
))
return
;
checkType
(
c
,
subject
,
OBJ
_LIST
))
return
;
if
(
refval
!=
NULL
)
{
/* Seek refval from head to tail */
...
...
@@ -298,20 +298,20 @@ void linsertCommand(client *c) {
void
llenCommand
(
client
*
c
)
{
robj
*
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
);
if
(
o
==
NULL
||
checkType
(
c
,
o
,
REDIS
_LIST
))
return
;
if
(
o
==
NULL
||
checkType
(
c
,
o
,
OBJ
_LIST
))
return
;
addReplyLongLong
(
c
,
listTypeLength
(
o
));
}
void
lindexCommand
(
client
*
c
)
{
robj
*
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
);
if
(
o
==
NULL
||
checkType
(
c
,
o
,
REDIS
_LIST
))
return
;
if
(
o
==
NULL
||
checkType
(
c
,
o
,
OBJ
_LIST
))
return
;
long
index
;
robj
*
value
=
NULL
;
if
((
getLongFromObjectOrReply
(
c
,
c
->
argv
[
2
],
&
index
,
NULL
)
!=
REDIS_OK
))
return
;
if
(
o
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
quicklistEntry
entry
;
if
(
quicklistIndex
(
o
->
ptr
,
index
,
&
entry
))
{
if
(
entry
.
value
)
{
...
...
@@ -331,14 +331,14 @@ void lindexCommand(client *c) {
void
lsetCommand
(
client
*
c
)
{
robj
*
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nokeyerr
);
if
(
o
==
NULL
||
checkType
(
c
,
o
,
REDIS
_LIST
))
return
;
if
(
o
==
NULL
||
checkType
(
c
,
o
,
OBJ
_LIST
))
return
;
long
index
;
robj
*
value
=
c
->
argv
[
3
];
if
((
getLongFromObjectOrReply
(
c
,
c
->
argv
[
2
],
&
index
,
NULL
)
!=
REDIS_OK
))
return
;
if
(
o
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
quicklist
*
ql
=
o
->
ptr
;
int
replaced
=
quicklistReplaceAtIndex
(
ql
,
index
,
value
->
ptr
,
sdslen
(
value
->
ptr
));
...
...
@@ -357,7 +357,7 @@ void lsetCommand(client *c) {
void
popGenericCommand
(
client
*
c
,
int
where
)
{
robj
*
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
);
if
(
o
==
NULL
||
checkType
(
c
,
o
,
REDIS
_LIST
))
return
;
if
(
o
==
NULL
||
checkType
(
c
,
o
,
OBJ
_LIST
))
return
;
robj
*
value
=
listTypePop
(
o
,
where
);
if
(
value
==
NULL
)
{
...
...
@@ -394,7 +394,7 @@ void lrangeCommand(client *c) {
(
getLongFromObjectOrReply
(
c
,
c
->
argv
[
3
],
&
end
,
NULL
)
!=
REDIS_OK
))
return
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
emptymultibulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_LIST
))
return
;
||
checkType
(
c
,
o
,
OBJ
_LIST
))
return
;
llen
=
listTypeLength
(
o
);
/* convert negative indexes */
...
...
@@ -413,7 +413,7 @@ void lrangeCommand(client *c) {
/* Return the result in form of a multi-bulk reply */
addReplyMultiBulkLen
(
c
,
rangelen
);
if
(
o
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
listTypeIterator
*
iter
=
listTypeInitIterator
(
o
,
start
,
REDIS_TAIL
);
while
(
rangelen
--
)
{
...
...
@@ -440,7 +440,7 @@ void ltrimCommand(client *c) {
(
getLongFromObjectOrReply
(
c
,
c
->
argv
[
3
],
&
end
,
NULL
)
!=
REDIS_OK
))
return
;
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
ok
))
==
NULL
||
checkType
(
c
,
o
,
REDIS
_LIST
))
return
;
checkType
(
c
,
o
,
OBJ
_LIST
))
return
;
llen
=
listTypeLength
(
o
);
/* convert negative indexes */
...
...
@@ -461,7 +461,7 @@ void ltrimCommand(client *c) {
}
/* Remove list elements to perform the trim */
if
(
o
->
encoding
==
REDIS
_ENCODING_QUICKLIST
)
{
if
(
o
->
encoding
==
OBJ
_ENCODING_QUICKLIST
)
{
quicklistDelRange
(
o
->
ptr
,
0
,
ltrim
);
quicklistDelRange
(
o
->
ptr
,
-
rtrim
,
rtrim
);
}
else
{
...
...
@@ -488,7 +488,7 @@ void lremCommand(client *c) {
return
;
subject
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
);
if
(
subject
==
NULL
||
checkType
(
c
,
subject
,
REDIS
_LIST
))
return
;
if
(
subject
==
NULL
||
checkType
(
c
,
subject
,
OBJ
_LIST
))
return
;
listTypeIterator
*
li
;
if
(
toremove
<
0
)
{
...
...
@@ -551,7 +551,7 @@ void rpoplpushHandlePush(client *c, robj *dstkey, robj *dstobj, robj *value) {
void
rpoplpushCommand
(
client
*
c
)
{
robj
*
sobj
,
*
value
;
if
((
sobj
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
checkType
(
c
,
sobj
,
REDIS
_LIST
))
return
;
checkType
(
c
,
sobj
,
OBJ
_LIST
))
return
;
if
(
listTypeLength
(
sobj
)
==
0
)
{
/* This may only happen after loading very old RDB files. Recent
...
...
@@ -561,7 +561,7 @@ void rpoplpushCommand(client *c) {
robj
*
dobj
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
2
]);
robj
*
touchedkey
=
c
->
argv
[
1
];
if
(
dobj
&&
checkType
(
c
,
dobj
,
REDIS
_LIST
))
return
;
if
(
dobj
&&
checkType
(
c
,
dobj
,
OBJ
_LIST
))
return
;
value
=
listTypePop
(
sobj
,
REDIS_TAIL
);
/* We saved touched key, and protect it, since rpoplpushHandlePush
* may change the client command argument vector (it does not
...
...
@@ -743,7 +743,7 @@ int serveClientBlockedOnList(client *receiver, robj *key, robj *dstkey, redisDb
robj
*
dstobj
=
lookupKeyWrite
(
receiver
->
db
,
dstkey
);
if
(
!
(
dstobj
&&
checkType
(
receiver
,
dstobj
,
REDIS
_LIST
)))
checkType
(
receiver
,
dstobj
,
OBJ
_LIST
)))
{
/* Propagate the RPOP operation. */
argv
[
0
]
=
shared
.
rpop
;
...
...
@@ -803,7 +803,7 @@ void handleClientsBlockedOnLists(void) {
/* If the key exists and it's a list, serve blocked clients
* with data. */
robj
*
o
=
lookupKeyWrite
(
rl
->
db
,
rl
->
key
);
if
(
o
!=
NULL
&&
o
->
type
==
REDIS
_LIST
)
{
if
(
o
!=
NULL
&&
o
->
type
==
OBJ
_LIST
)
{
dictEntry
*
de
;
/* We serve clients in the same order they blocked for
...
...
@@ -874,7 +874,7 @@ void blockingPopGenericCommand(client *c, int where) {
for
(
j
=
1
;
j
<
c
->
argc
-
1
;
j
++
)
{
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
j
]);
if
(
o
!=
NULL
)
{
if
(
o
->
type
!=
REDIS
_LIST
)
{
if
(
o
->
type
!=
OBJ
_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
else
{
...
...
@@ -945,7 +945,7 @@ void brpoplpushCommand(client *c) {
blockForKeys
(
c
,
c
->
argv
+
1
,
1
,
timeout
,
c
->
argv
[
2
]);
}
}
else
{
if
(
key
->
type
!=
REDIS
_LIST
)
{
if
(
key
->
type
!=
OBJ
_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
/* The list exists and has elements, so
...
...
Prev
1
2
Next
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