+/* Save the object type of object "o". */
+int rdbSaveObjectType(rio *rdb, robj *o) {
+ switch (o->type) {
+ case REDIS_STRING:
+ return rdbSaveType(rdb,REDIS_RDB_TYPE_STRING);
+ case REDIS_LIST:
+ if (o->encoding == REDIS_ENCODING_ZIPLIST)
+ return rdbSaveType(rdb,REDIS_RDB_TYPE_LIST_ZIPLIST);
+ else if (o->encoding == REDIS_ENCODING_LINKEDLIST)
+ return rdbSaveType(rdb,REDIS_RDB_TYPE_LIST);
+ else
+ redisPanic("Unknown list encoding");
+ case REDIS_SET:
+ if (o->encoding == REDIS_ENCODING_INTSET)
+ return rdbSaveType(rdb,REDIS_RDB_TYPE_SET_INTSET);
+ else if (o->encoding == REDIS_ENCODING_HT)
+ return rdbSaveType(rdb,REDIS_RDB_TYPE_SET);
+ else
+ redisPanic("Unknown set encoding");
+ case REDIS_ZSET:
+ if (o->encoding == REDIS_ENCODING_ZIPLIST)
+ return rdbSaveType(rdb,REDIS_RDB_TYPE_ZSET_ZIPLIST);
+ else if (o->encoding == REDIS_ENCODING_SKIPLIST)
+ return rdbSaveType(rdb,REDIS_RDB_TYPE_ZSET);
+ else
+ redisPanic("Unknown sorted set encoding");
+ case REDIS_HASH:
+ if (o->encoding == REDIS_ENCODING_ZIPMAP)
+ return rdbSaveType(rdb,REDIS_RDB_TYPE_HASH_ZIPMAP);
+ else if (o->encoding == REDIS_ENCODING_HT)
+ return rdbSaveType(rdb,REDIS_RDB_TYPE_HASH);
+ else
+ redisPanic("Unknown hash encoding");
+ default:
+ redisPanic("Unknown object type");
+ }
+ return -1; /* avoid warning */
+}
+
+/* Load object type. Return -1 when the byte doesn't contain an object type. */
+int rdbLoadObjectType(rio *rdb) {
+ int type;
+ if ((type = rdbLoadType(rdb)) == -1) return -1;
+ if (!rdbIsObjectType(type)) return -1;
+ return type;
+}
+