- if (o->encoding == REDIS_ENCODING_ZIPMAP) {
- unsigned char *zm = o->ptr;
- unsigned char *zval;
- unsigned int zvlen;
-
- /* Find value if already present in hash */
- if (zipmapGet(zm,c->argv[2]->ptr,sdslen(c->argv[2]->ptr),
- &zval,&zvlen)) {
- /* strtoll needs the char* to have a trailing \0, but
- * the zipmap doesn't include them. */
- sds szval = sdsnewlen(zval, zvlen);
- value = strtoll(szval,NULL,10);
- sdsfree(szval);
- }
-
- value += incr;
- sds svalue = sdscatprintf(sdsempty(),"%lld",value);
- zm = zipmapSet(zm,c->argv[2]->ptr,sdslen(c->argv[2]->ptr),
- (unsigned char*)svalue,sdslen(svalue),NULL);
- sdsfree(svalue);
- o->ptr = zm;
-
- /* Check if the zipmap needs to be converted. */
- if (zipmapLen(zm) > server.hash_max_zipmap_entries)
- convertToRealHash(o);
+ if ((o = hashLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
+ hashTryConversion(o,c->argv,2,3);
+ hashTryObjectEncoding(o,&c->argv[2], &c->argv[3]);
+ update = hashSet(o,c->argv[2],c->argv[3]);
+ addReply(c, update ? shared.czero : shared.cone);
+ server.dirty++;
+}
+
+static void hsetnxCommand(redisClient *c) {
+ robj *o;
+ if ((o = hashLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
+ hashTryConversion(o,c->argv,2,3);
+
+ if (hashExists(o, c->argv[2])) {
+ addReply(c, shared.czero);