From 8e0963f7b97f87df590a369842f75ddda86c2531 Mon Sep 17 00:00:00 2001 From: ZhangJQ Date: Thu, 21 Feb 2019 17:07:00 +0800 Subject: [PATCH] support RDB version 8 (for Redis version 4.x) and the new RDB data type ZSET2 --- src/rmt_redis.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) mode change 100644 => 100755 src/rmt_redis.c diff --git a/src/rmt_redis.c b/src/rmt_redis.c old mode 100644 new mode 100755 index dfc58e6..1bcdb53 --- a/src/rmt_redis.c +++ b/src/rmt_redis.c @@ -30,7 +30,7 @@ /* The current RDB version. When the format changes in a way that is no longer * backward compatible this number gets incremented. */ -#define REDIS_RDB_VERSION 7 +#define REDIS_RDB_VERSION 8 /* 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 @@ -66,6 +66,7 @@ #define REDIS_RDB_TYPE_SET 2 #define REDIS_RDB_TYPE_ZSET 3 #define REDIS_RDB_TYPE_HASH 4 +#define REDIS_RDB_TYPE_ZSET2 5 /* Object types for encoded objects. */ #define REDIS_RDB_TYPE_HASH_ZIPMAP 9 @@ -5832,6 +5833,18 @@ static sds redis_rdb_file_load_double_str(redis_rdb *rdb) { } } +static sds redis_rdb_file_load_binary_double_str(redis_rdb *rdb) { + char dbuf[128]; + int dlen; + double d; + if (redis_rdb_file_read(rdb,&d,sizeof(d)) != RMT_OK) return NULL; + memrev64ifbe(num); + + dlen = snprintf(dbuf,sizeof(dbuf),"%.17g",d); + + return sdsnewlen(dbuf, dlen); +} + static sds redis_rdb_file_load_lzf_str(redis_rdb *rdb) { unsigned int len, clen; unsigned char *c = NULL; @@ -5955,6 +5968,28 @@ static struct array *redis_rdb_file_load_value(redis_rdb *rdb, int rdbtype) goto error; } + str = array_push(value); + *str = elem2; + ASSERT(sdsIsNum(*str) == 1); + str = array_push(value); + *str = elem1; + } + }else if (rdbtype == REDIS_RDB_TYPE_ZSET2) { + if ((len = redis_rdb_file_load_len(rdb,NULL)) == REDIS_RDB_LENERR) goto error; + + value = redis_value_create((uint32_t)(2*len)); + if (value == NULL) { + log_error("ERROR: Out of memory"); + goto error; + } + + while(len--) { + if ((elem1 = redis_rdb_file_load_str(rdb)) == NULL) goto error; + if ((elem2 = redis_rdb_file_load_binary_double_str(rdb)) == NULL) { + sdsfree(elem1); + goto error; + } + str = array_push(value); *str = elem2; ASSERT(sdsIsNum(*str) == 1); @@ -6208,6 +6243,7 @@ static int redis_object_type_get_by_rdbtype(int dbtype) return REDIS_SET; break; case REDIS_RDB_TYPE_ZSET: + case REDIS_RDB_TYPE_ZSET2: case REDIS_RDB_TYPE_ZSET_ZIPLIST: return REDIS_ZSET;