- zs = zsetobj->ptr;
- c->argv[2] = tryObjectEncoding(c->argv[2]);
- de = dictFind(zs->dict,c->argv[2]);
- if (de == NULL) {
- addReply(c,shared.czero);
- return;
+ if (zobj->encoding == REDIS_ENCODING_ZIPLIST) {
+ unsigned char *eptr;
+
+ if ((eptr = zzlFind(zobj,ele,NULL)) != NULL) {
+ redisAssert(zzlDelete(zobj,eptr) == REDIS_OK);
+ if (zzlLength(zobj) == 0) dbDelete(c->db,key);
+ } else {
+ addReply(c,shared.czero);
+ return;
+ }
+ } else if (zobj->encoding == REDIS_ENCODING_RAW) {
+ zset *zs = zobj->ptr;
+ dictEntry *de;
+ double score;
+
+ de = dictFind(zs->dict,ele);
+ if (de != NULL) {
+ /* Delete from the skiplist */
+ score = *(double*)dictGetEntryVal(de);
+ redisAssert(zslDelete(zs->zsl,score,ele));
+
+ /* Delete from the hash table */
+ dictDelete(zs->dict,ele);
+ if (htNeedsResize(zs->dict)) dictResize(zs->dict);
+ if (dictSize(zs->dict) == 0) dbDelete(c->db,key);
+ } else {
+ addReply(c,shared.czero);
+ return;
+ }
+ } else {
+ redisPanic("Unknown sorted set encoding");