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
5045ff84
"client-libraries/vscode:/vscode.git/clone" did not exist on "f78fd11b71988ea91bda72f464df6cb7a1a45620"
Commit
5045ff84
authored
Feb 28, 2011
by
antirez
Browse files
direct saving of specially encoded types implemented for lists and sets too
parent
c9228377
Changes
1
Show whitespace changes
Inline
Side-by-side
src/rdb.c
View file @
5045ff84
...
@@ -256,27 +256,10 @@ int rdbSaveObject(FILE *fp, robj *o) {
...
@@ -256,27 +256,10 @@ int rdbSaveObject(FILE *fp, robj *o) {
}
else
if
(
o
->
type
==
REDIS_LIST
)
{
}
else
if
(
o
->
type
==
REDIS_LIST
)
{
/* Save a list value */
/* Save a list value */
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
unsigned
char
*
p
;
size_t
l
=
ziplistBlobLen
((
unsigned
char
*
)
o
->
ptr
);
unsigned
char
*
vstr
;
unsigned
int
vlen
;
long
long
vlong
;
if
((
n
=
rdbSaveLen
(
fp
,
ziplistLen
(
o
->
ptr
)))
==
-
1
)
return
-
1
;
if
((
n
=
rdbSaveRawString
(
fp
,
o
->
ptr
,
l
))
==
-
1
)
return
-
1
;
nwritten
+=
n
;
p
=
ziplistIndex
(
o
->
ptr
,
0
);
while
(
ziplistGet
(
p
,
&
vstr
,
&
vlen
,
&
vlong
))
{
if
(
vstr
)
{
if
((
n
=
rdbSaveRawString
(
fp
,
vstr
,
vlen
))
==
-
1
)
return
-
1
;
nwritten
+=
n
;
}
else
{
if
((
n
=
rdbSaveLongLongAsStringObject
(
fp
,
vlong
))
==
-
1
)
return
-
1
;
nwritten
+=
n
;
nwritten
+=
n
;
}
p
=
ziplistNext
(
o
->
ptr
,
p
);
}
}
else
if
(
o
->
encoding
==
REDIS_ENCODING_LINKEDLIST
)
{
}
else
if
(
o
->
encoding
==
REDIS_ENCODING_LINKEDLIST
)
{
list
*
list
=
o
->
ptr
;
list
*
list
=
o
->
ptr
;
listIter
li
;
listIter
li
;
...
@@ -311,17 +294,10 @@ int rdbSaveObject(FILE *fp, robj *o) {
...
@@ -311,17 +294,10 @@ int rdbSaveObject(FILE *fp, robj *o) {
}
}
dictReleaseIterator
(
di
);
dictReleaseIterator
(
di
);
}
else
if
(
o
->
encoding
==
REDIS_ENCODING_INTSET
)
{
}
else
if
(
o
->
encoding
==
REDIS_ENCODING_INTSET
)
{
intset
*
is
=
o
->
ptr
;
size_t
l
=
intsetBlobLen
((
intset
*
)
o
->
ptr
);
int64_t
llval
;
int
i
=
0
;
if
((
n
=
rdbSaveLen
(
fp
,
intsetLen
(
is
)))
==
-
1
)
return
-
1
;
nwritten
+=
n
;
while
(
intsetGet
(
is
,
i
++
,
&
llval
))
{
if
((
n
=
rdbSaveRawString
(
fp
,
o
->
ptr
,
l
))
==
-
1
)
return
-
1
;
if
((
n
=
rdbSaveLongLongAsStringObject
(
fp
,
llval
))
==
-
1
)
return
-
1
;
nwritten
+=
n
;
nwritten
+=
n
;
}
}
else
{
}
else
{
redisPanic
(
"Unknown set encoding"
);
redisPanic
(
"Unknown set encoding"
);
}
}
...
@@ -884,20 +860,46 @@ robj *rdbLoadObject(int type, FILE *fp) {
...
@@ -884,20 +860,46 @@ robj *rdbLoadObject(int type, FILE *fp) {
dictAdd
((
dict
*
)
o
->
ptr
,
key
,
val
);
dictAdd
((
dict
*
)
o
->
ptr
,
key
,
val
);
}
}
}
}
}
else
if
(
type
==
REDIS_HASH_ZIPMAP
)
{
}
else
if
(
type
==
REDIS_HASH_ZIPMAP
||
type
==
REDIS_LIST_ZIPLIST
||
type
==
REDIS_SET_INTSET
)
{
robj
*
aux
=
rdbLoadStringObject
(
fp
);
robj
*
aux
=
rdbLoadStringObject
(
fp
);
if
(
aux
==
NULL
)
return
NULL
;
if
(
aux
==
NULL
)
return
NULL
;
o
=
createHashObject
();
o
=
createObject
(
REDIS_STRING
,
NULL
);
/* string is just placeholder */
o
->
encoding
=
REDIS_ENCODING_ZIPMAP
;
o
->
ptr
=
zmalloc
(
sdslen
(
aux
->
ptr
));
o
->
ptr
=
zmalloc
(
sdslen
(
aux
->
ptr
));
memcpy
(
o
->
ptr
,
aux
->
ptr
,
sdslen
(
aux
->
ptr
));
memcpy
(
o
->
ptr
,
aux
->
ptr
,
sdslen
(
aux
->
ptr
));
decrRefCount
(
aux
);
decrRefCount
(
aux
);
/* Convert to real hash if the number of items is too large.
* We don't check the max item size as this requires an O(N)
/* Fix the object encoding, and make sure to convert the encoded
* scan usually. */
* data type into the base type if accordingly to the current
if
(
zipmapLen
(
o
->
ptr
)
>
server
.
hash_max_zipmap_entries
)
{
* configuration there are too many elements in the encoded data
* type. Note that we only check the length and not max element
* size as this is an O(N) scan. Eventually everything will get
* converted. */
switch
(
type
)
{
case
REDIS_HASH_ZIPMAP
:
o
->
type
=
REDIS_HASH
;
o
->
encoding
=
REDIS_ENCODING_ZIPMAP
;
if
(
zipmapLen
(
o
->
ptr
)
>
server
.
hash_max_zipmap_entries
)
convertToRealHash
(
o
);
convertToRealHash
(
o
);
break
;
case
REDIS_LIST_ZIPLIST
:
o
->
type
=
REDIS_LIST
;
o
->
encoding
=
REDIS_ENCODING_ZIPLIST
;
if
(
ziplistLen
(
o
->
ptr
)
>
server
.
list_max_ziplist_entries
)
listTypeConvert
(
o
,
REDIS_ENCODING_LINKEDLIST
);
break
;
case
REDIS_SET_INTSET
:
o
->
type
=
REDIS_SET
;
o
->
encoding
=
REDIS_ENCODING_INTSET
;
if
(
intsetLen
(
o
->
ptr
)
>
server
.
set_max_intset_entries
)
setTypeConvert
(
o
,
REDIS_ENCODING_HT
);
break
;
default:
redisPanic
(
"Unknown enoding"
);
break
;
}
}
}
else
{
}
else
{
redisPanic
(
"Unknown object type"
);
redisPanic
(
"Unknown object type"
);
...
...
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