]> git.saurik.com Git - redis.git/commitdiff
Merge branch 'master' into intset-split
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 20 Aug 2010 10:40:29 +0000 (12:40 +0200)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 20 Aug 2010 10:40:55 +0000 (12:40 +0200)
Conflicts:
src/Makefile
src/t_set.c

1  2 
src/Makefile
src/aof.c
src/object.c
src/redis.c
src/redis.h
src/t_set.c

diff --cc src/Makefile
index fb343e8048b145a45bb9847730f56cb44c2b2b7c,0af70f1741ee47e4475c63d1ab763a4a2faaa8fa..5fe3971ed4171afdbc589a1e57e2d4f927c4ed7d
@@@ -15,7 -15,11 +15,11 @@@ endi
  CCOPT= $(CFLAGS) $(CCLINK) $(ARCH) $(PROF)
  DEBUG?= -g -rdynamic -ggdb 
  
 -OBJ = adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o vm.o pubsub.o multi.o debug.o sort.o
+ INSTALL_TOP= /usr/local
+ INSTALL_BIN= $(INSTALL_TOP)/bin
+ INSTALL= cp -p
 +OBJ = adlist.o ae.o anet.o dict.o redis.o sds.o zmalloc.o lzf_c.o lzf_d.o pqsort.o zipmap.o sha1.o ziplist.o release.o networking.o util.o object.o db.o replication.o rdb.o t_string.o t_list.o t_set.o t_zset.o t_hash.o config.o aof.o vm.o pubsub.o multi.o debug.o sort.o intset.o
  BENCHOBJ = ae.o anet.o redis-benchmark.o sds.o adlist.o zmalloc.o
  CLIOBJ = anet.o sds.o adlist.o redis-cli.o zmalloc.o linenoise.o
  CHECKDUMPOBJ = redis-check-dump.o lzf_c.o lzf_d.o
diff --cc src/aof.c
Simple merge
diff --cc src/object.c
Simple merge
diff --cc src/redis.c
Simple merge
diff --cc src/redis.h
Simple merge
diff --cc src/t_set.c
index 3fbf13a352affabf72ae6602e5194254d4fa752c,94b97633e83f0e1cfaeac0cb39d27beaba6ed270..bcb8dd3f1932082cd77e7ba95253b07f27deacb4
@@@ -187,7 -17,9 +187,8 @@@ void saddCommand(redisClient *c) 
              return;
          }
      }
 -    if (dictAdd(set->ptr,c->argv[2],NULL) == DICT_OK) {
 -        incrRefCount(c->argv[2]);
 +    if (setTypeAdd(set,c->argv[2])) {
+         touchWatchedKey(c->db,c->argv[1]);
          server.dirty++;
          addReply(c,shared.cone);
      } else {
@@@ -201,9 -33,11 +202,10 @@@ void sremCommand(redisClient *c) 
      if ((set = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL ||
          checkType(c,set,REDIS_SET)) return;
  
 -    if (dictDelete(set->ptr,c->argv[2]) == DICT_OK) {
 -        server.dirty++;
 +    if (setTypeRemove(set,c->argv[2])) {
 +        if (setTypeSize(set) == 0) dbDelete(c->db,c->argv[1]);
+         touchWatchedKey(c->db,c->argv[1]);
 -        if (htNeedsResize(set->ptr)) dictResize(set->ptr);
 -        if (dictSize((dict*)set->ptr) == 0) dbDelete(c->db,c->argv[1]);
 +        server.dirty++;
          addReply(c,shared.cone);
      } else {
          addReply(c,shared.czero);
@@@ -238,19 -67,18 +240,21 @@@ void smoveCommand(redisClient *c) 
          addReply(c,shared.czero);
          return;
      }
 -    if (dictSize((dict*)srcset->ptr) == 0 && srcset != dstset)
 -        dbDelete(c->db,c->argv[1]);
 +
 +    /* Remove the src set from the database when empty */
 +    if (setTypeSize(srcset) == 0) dbDelete(c->db,c->argv[1]);
+     touchWatchedKey(c->db,c->argv[1]);
+     touchWatchedKey(c->db,c->argv[2]);
      server.dirty++;
 -    /* Add the element to the destination set */
 +
 +    /* Create the destination set when it doesn't exist */
      if (!dstset) {
 -        dstset = createSetObject();
 +        dstset = setTypeCreate(ele);
          dbAdd(c->db,c->argv[2],dstset);
      }
 -    if (dictAdd(dstset->ptr,c->argv[3],NULL) == DICT_OK)
 -        incrRefCount(c->argv[3]);
 +
 +    /* An extra key has changed when ele was successfully added to dstset */
 +    if (setTypeAdd(dstset,ele)) server.dirty++;
      addReply(c,shared.cone);
  }
  
@@@ -281,14 -112,17 +285,15 @@@ void spopCommand(redisClient *c) 
      if ((set = lookupKeyWriteOrReply(c,c->argv[1],shared.nullbulk)) == NULL ||
          checkType(c,set,REDIS_SET)) return;
  
 -    de = dictGetRandomKey(set->ptr);
 -    if (de == NULL) {
 +    ele = setTypeRandomElement(set);
 +    if (ele == NULL) {
          addReply(c,shared.nullbulk);
      } else {
 -        robj *ele = dictGetEntryKey(de);
 -
 +        setTypeRemove(set,ele);
          addReplyBulk(c,ele);
 -        dictDelete(set->ptr,ele);
 -        if (htNeedsResize(set->ptr)) dictResize(set->ptr);
 -        if (dictSize((dict*)set->ptr) == 0) dbDelete(c->db,c->argv[1]);
 +        decrRefCount(ele);
 +        if (setTypeSize(set) == 0) dbDelete(c->db,c->argv[1]);
+         touchWatchedKey(c->db,c->argv[1]);
          server.dirty++;
      }
  }
@@@ -309,24 -145,31 +314,26 @@@ void srandmemberCommand(redisClient *c
  }
  
  int qsortCompareSetsByCardinality(const void *s1, const void *s2) {
 -    dict **d1 = (void*) s1, **d2 = (void*) s2;
 -
 -    return dictSize(*d1)-dictSize(*d2);
 +    return setTypeSize(*(robj**)s1)-setTypeSize(*(robj**)s2);
  }
  
 -void sinterGenericCommand(redisClient *c, robj **setskeys, unsigned long setsnum, robj *dstkey) {
 -    dict **dv = zmalloc(sizeof(dict*)*setsnum);
 -    dictIterator *di;
 -    dictEntry *de;
 -    robj *lenobj = NULL, *dstset = NULL;
 +void sinterGenericCommand(redisClient *c, robj **setkeys, unsigned long setnum, robj *dstkey) {
 +    robj **sets = zmalloc(sizeof(robj*)*setnum);
 +    setIterator *si;
 +    robj *ele, *lenobj = NULL, *dstset = NULL;
      unsigned long j, cardinality = 0;
  
 -    for (j = 0; j < setsnum; j++) {
 -        robj *setobj;
 -
 -        setobj = dstkey ?
 -                    lookupKeyWrite(c->db,setskeys[j]) :
 -                    lookupKeyRead(c->db,setskeys[j]);
 +    for (j = 0; j < setnum; j++) {
 +        robj *setobj = dstkey ?
 +            lookupKeyWrite(c->db,setkeys[j]) :
 +            lookupKeyRead(c->db,setkeys[j]);
          if (!setobj) {
 -            zfree(dv);
 +            zfree(sets);
              if (dstkey) {
-                 if (dbDelete(c->db,dstkey))
+                 if (dbDelete(c->db,dstkey)) {
+                     touchWatchedKey(c->db,dstkey);
                      server.dirty++;
+                 }
                  addReply(c,shared.czero);
              } else {
                  addReply(c,shared.emptymultibulk);
@@@ -481,9 -335,10 +489,10 @@@ void sunionDiffGenericCommand(redisClie
              decrRefCount(dstset);
              addReply(c,shared.czero);
          }
+         touchWatchedKey(c->db,dstkey);
          server.dirty++;
      }
 -    zfree(dv);
 +    zfree(sets);
  }
  
  void sunionCommand(redisClient *c) {