return createObject(REDIS_STRING,sdsnewlen(ptr,len));
}
+ static robj *createStringObjectFromLongLong(long long value) {
+ robj *o;
+ if (value >= 0 && value < REDIS_SHARED_INTEGERS) {
+ incrRefCount(shared.integers[value]);
+ o = shared.integers[value];
+ } else {
+ o = createObject(REDIS_STRING, NULL);
+ if (value >= LONG_MIN && value <= LONG_MAX) {
+ o->encoding = REDIS_ENCODING_INT;
+ o->ptr = (void*)((long)value);
+ } else {
+ o->ptr = sdscatprintf(sdsempty(),"%lld",value);
+ }
+ }
+ return o;
+ }
+
static robj *dupStringObject(robj *o) {
assert(o->encoding == REDIS_ENCODING_RAW);
return createStringObject(o->ptr,sdslen(o->ptr));
zfree(o->ptr);
break;
default:
- redisAssert(0);
+ redisPanic("Unknown hash encoding type");
break;
}
}
case REDIS_SET: freeSetObject(o); break;
case REDIS_ZSET: freeZsetObject(o); break;
case REDIS_HASH: freeHashObject(o); break;
- default: redisAssert(0); break;
+ default: redisPanic("Unknown object type"); break;
}
if (server.vm_enabled) pthread_mutex_lock(&server.obj_freelist_mutex);
if (listLength(server.objfreelist) > REDIS_OBJFREELIST_MAX ||
dictReleaseIterator(di);
}
} else {
- redisAssert(0);
+ redisPanic("Unknown object type");
}
return 0;
}
val = (int32_t)v;
} else {
val = 0; /* anti-warning */
- redisAssert(0);
+ redisPanic("Unknown RDB integer encoding type");
}
return createObject(REDIS_STRING,sdscatprintf(sdsempty(),"%lld",val));
}
case REDIS_RDB_ENC_LZF:
return rdbLoadLzfStringObject(fp);
default:
- redisAssert(0);
+ redisPanic("Unknown RDB encoding type");
}
}
}
}
} else {
- redisAssert(0);
+ redisPanic("Unknown object type");
}
return o;
}
*target = val > *target ? val : *target;
} else {
/* safety net */
- redisAssert(0 != 0);
+ redisPanic("Unknown ZUNION/INTER aggregate type");
}
}
}
}
+ /* Encode given objects in-place when the hash uses a dict. */
+ static void hashTryObjectEncoding(robj *subject, robj **o1, robj **o2) {
+ if (subject->encoding == REDIS_ENCODING_HT) {
+ if (o1) *o1 = tryObjectEncoding(*o1);
+ if (o2) *o2 = tryObjectEncoding(*o2);
+ }
+ }
+
/* Get the value from a hash identified by key. Returns either a string
* object or NULL if the value cannot be found. The refcount of the object
* is always increased by 1 when the value was found. */
if (zipmapLen(o->ptr) > server.hash_max_zipmap_entries)
convertToRealHash(o);
} else {
- value = tryObjectEncoding(value);
if (dictReplace(o->ptr,key,value)) {
/* Insert */
incrRefCount(key);
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++;
if (hashExists(o, c->argv[2])) {
addReply(c, shared.czero);
} else {
+ hashTryObjectEncoding(o,&c->argv[2], &c->argv[3]);
hashSet(o,c->argv[2],c->argv[3]);
addReply(c, shared.cone);
server.dirty++;
if ((o = hashLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
hashTryConversion(o,c->argv,2,c->argc-1);
for (i = 2; i < c->argc; i += 2) {
+ hashTryObjectEncoding(o,&c->argv[i], &c->argv[i+1]);
hashSet(o,c->argv[i],c->argv[i+1]);
}
addReply(c, shared.ok);
+ server.dirty++;
}
static void hincrbyCommand(redisClient *c) {
}
value += incr;
- new = createObject(REDIS_STRING,sdscatprintf(sdsempty(),"%lld",value));
+ new = createStringObjectFromLongLong(value);
+ hashTryObjectEncoding(o,&c->argv[2],NULL);
hashSet(o,c->argv[2],new);
decrRefCount(new);
addReplyLongLong(c,value);
case REDIS_LIST: vectorlen = listLength((list*)sortval->ptr); break;
case REDIS_SET: vectorlen = dictSize((dict*)sortval->ptr); break;
case REDIS_ZSET: vectorlen = dictSize(((zset*)sortval->ptr)->dict); break;
- default: vectorlen = 0; redisAssert(0); /* Avoid GCC warning */
+ default: vectorlen = 0; redisPanic("Bad SORT type"); /* Avoid GCC warning */
}
vector = zmalloc(sizeof(redisSortObject)*vectorlen);
j = 0;
dictReleaseIterator(di);
}
} else {
- redisAssert(0);
+ redisPanic("Unknown object type");
}
/* Save the expire time */
if (expiretime != -1) {