4343#define RDB_LOAD_NONE 0
4444#define RDB_LOAD_ENC (1<<0)
4545#define RDB_LOAD_PLAIN (1<<1)
46+ #define RDB_LOAD_SDS (1<<2)
4647
4748#define rdbExitReportCorruptRDB (reason ) rdbCheckThenExit(reason, __LINE__);
4849
@@ -179,6 +180,7 @@ int rdbEncodeInteger(long long value, unsigned char *enc) {
179180 * rdbGenerincLoadStringObject() for more info. */
180181void * rdbLoadIntegerObject (rio * rdb , int enctype , int flags ) {
181182 int plain = flags & RDB_LOAD_PLAIN ;
183+ int sds = flags & RDB_LOAD_SDS ;
182184 int encode = flags & RDB_LOAD_ENC ;
183185 unsigned char enc [4 ];
184186 long long val ;
@@ -200,10 +202,10 @@ void *rdbLoadIntegerObject(rio *rdb, int enctype, int flags) {
200202 val = 0 ; /* anti-warning */
201203 rdbExitReportCorruptRDB ("Unknown RDB integer encoding type" );
202204 }
203- if (plain ) {
205+ if (plain || sds ) {
204206 char buf [LONG_STR_SIZE ], * p ;
205207 int len = ll2string (buf ,sizeof (buf ),val );
206- p = zmalloc (len );
208+ p = plain ? zmalloc (len ) : sdsnewlen ( NULL , len );
207209 memcpy (p ,buf ,len );
208210 return p ;
209211 } else if (encode ) {
@@ -280,9 +282,10 @@ ssize_t rdbSaveLzfStringObject(rio *rdb, unsigned char *s, size_t len) {
280282 * rdbGenericLoadStringObject() function. */
281283void * rdbLoadLzfStringObject (rio * rdb , int flags ) {
282284 int plain = flags & RDB_LOAD_PLAIN ;
285+ int sds = flags & RDB_LOAD_SDS ;
283286 unsigned int len , clen ;
284287 unsigned char * c = NULL ;
285- sds val = NULL ;
288+ char * val = NULL ;
286289
287290 if ((clen = rdbLoadLen (rdb ,NULL )) == RDB_LENERR ) return NULL ;
288291 if ((len = rdbLoadLen (rdb ,NULL )) == RDB_LENERR ) return NULL ;
@@ -292,18 +295,19 @@ void *rdbLoadLzfStringObject(rio *rdb, int flags) {
292295 if (plain ) {
293296 val = zmalloc (len );
294297 } else {
295- if (( val = sdsnewlen (NULL ,len )) == NULL ) goto err ;
298+ val = sdsnewlen (NULL ,len );
296299 }
297300
298301 /* Load the compressed representation and uncompress it to target. */
299302 if (rioRead (rdb ,c ,clen ) == 0 ) goto err ;
300303 if (lzf_decompress (c ,clen ,val ,len ) == 0 ) goto err ;
301304 zfree (c );
302305
303- if (plain )
306+ if (plain || sds ) {
304307 return val ;
305- else
308+ } else {
306309 return createObject (OBJ_STRING ,val );
310+ }
307311err :
308312 zfree (c );
309313 if (plain )
@@ -366,7 +370,7 @@ ssize_t rdbSaveLongLongAsStringObject(rio *rdb, long long value) {
366370 return nwritten ;
367371}
368372
369- /* Like rdbSaveStringObjectRaw () but handle encoded objects */
373+ /* Like rdbSaveRawString () gets a Redis object instead. */
370374int rdbSaveStringObject (rio * rdb , robj * obj ) {
371375 /* Avoid to decode the object, then encode it again, if the
372376 * object is already integer encoded. */
@@ -387,10 +391,12 @@ int rdbSaveStringObject(rio *rdb, robj *obj) {
387391 * no longer guarantees that obj->ptr is an SDS string.
388392 * RDB_LOAD_PLAIN: Return a plain string allocated with zmalloc()
389393 * instead of a Redis object.
394+ * RDB_LOAD_SDS: Return an SDS string instead of a Redis object.
390395 */
391396void * rdbGenericLoadStringObject (rio * rdb , int flags ) {
392397 int encode = flags & RDB_LOAD_ENC ;
393398 int plain = flags & RDB_LOAD_PLAIN ;
399+ int sds = flags & RDB_LOAD_SDS ;
394400 int isencoded ;
395401 uint32_t len ;
396402
@@ -409,21 +415,24 @@ void *rdbGenericLoadStringObject(rio *rdb, int flags) {
409415 }
410416
411417 if (len == RDB_LENERR ) return NULL ;
412- if (!plain ) {
418+ if (plain || sds ) {
419+ void * buf = plain ? zmalloc (len ) : sdsnewlen (NULL ,len );
420+ if (len && rioRead (rdb ,buf ,len ) == 0 ) {
421+ if (plain )
422+ zfree (buf );
423+ else
424+ sdsfree (buf );
425+ return NULL ;
426+ }
427+ return buf ;
428+ } else {
413429 robj * o = encode ? createStringObject (NULL ,len ) :
414430 createRawStringObject (NULL ,len );
415431 if (len && rioRead (rdb ,o -> ptr ,len ) == 0 ) {
416432 decrRefCount (o );
417433 return NULL ;
418434 }
419435 return o ;
420- } else {
421- void * buf = zmalloc (len );
422- if (len && rioRead (rdb ,buf ,len ) == 0 ) {
423- zfree (buf );
424- return NULL ;
425- }
426- return buf ;
427436 }
428437}
429438
@@ -583,8 +592,9 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
583592 nwritten += n ;
584593
585594 while ((de = dictNext (di )) != NULL ) {
586- robj * eleobj = dictGetKey (de );
587- if ((n = rdbSaveStringObject (rdb ,eleobj )) == -1 ) return -1 ;
595+ sds ele = dictGetKey (de );
596+ if ((n = rdbSaveRawString (rdb ,(unsigned char * )ele ,sdslen (ele )))
597+ == -1 ) return -1 ;
588598 nwritten += n ;
589599 }
590600 dictReleaseIterator (di );
@@ -959,7 +969,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
959969 decrRefCount (ele );
960970 }
961971 } else if (rdbtype == RDB_TYPE_SET ) {
962- /* Read list/set value */
972+ /* Read Set value */
963973 if ((len = rdbLoadLen (rdb ,NULL )) == RDB_LENERR ) return NULL ;
964974
965975 /* Use a regular set when there are too many entries. */
@@ -973,15 +983,17 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
973983 o = createIntsetObject ();
974984 }
975985
976- /* Load every single element of the list/ set */
986+ /* Load every single element of the set */
977987 for (i = 0 ; i < len ; i ++ ) {
978988 long long llval ;
979- if ((ele = rdbLoadEncodedStringObject (rdb )) == NULL ) return NULL ;
980- ele = tryObjectEncoding (ele );
989+ sds sdsele ;
990+
991+ if ((sdsele = rdbGenericLoadStringObject (rdb ,RDB_LOAD_SDS )) == NULL )
992+ return NULL ;
981993
982994 if (o -> encoding == OBJ_ENCODING_INTSET ) {
983995 /* Fetch integer value from element */
984- if (isObjectRepresentableAsLongLong ( ele ,& llval ) == C_OK ) {
996+ if (isSdsRepresentableAsLongLong ( sdsele ,& llval ) == C_OK ) {
985997 o -> ptr = intsetAdd (o -> ptr ,llval ,NULL );
986998 } else {
987999 setTypeConvert (o ,OBJ_ENCODING_HT );
@@ -992,9 +1004,9 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
9921004 /* This will also be called when the set was just converted
9931005 * to a regular hash table encoded set */
9941006 if (o -> encoding == OBJ_ENCODING_HT ) {
995- dictAdd ((dict * )o -> ptr ,ele ,NULL );
1007+ dictAdd ((dict * )o -> ptr ,sdsele ,NULL );
9961008 } else {
997- decrRefCount ( ele );
1009+ sdsfree ( sdsele );
9981010 }
9991011 }
10001012 } else if (rdbtype == RDB_TYPE_ZSET ) {
0 commit comments