Use helper functions in APPEND

This commit is contained in:
Pieter Noordhuis 2010-12-15 11:40:36 +01:00
parent 8f8eeffec1
commit 1333f98dd2

View File

@ -393,31 +393,26 @@ void decrbyCommand(redisClient *c) {
}
void appendCommand(redisClient *c) {
int retval;
size_t totlen;
robj *o, *append;
o = lookupKeyWrite(c->db,c->argv[1]);
c->argv[2] = tryObjectEncoding(c->argv[2]);
if (o == NULL) {
/* Create the key */
retval = dbAdd(c->db,c->argv[1],c->argv[2]);
c->argv[2] = tryObjectEncoding(c->argv[2]);
dbAdd(c->db,c->argv[1],c->argv[2]);
incrRefCount(c->argv[2]);
totlen = stringObjectLen(c->argv[2]);
} else {
if (o->type != REDIS_STRING) {
addReply(c,shared.wrongtypeerr);
/* Key exists, check type */
if (checkType(c,o,REDIS_STRING))
return;
}
append = getDecodedObject(c->argv[2]);
if (o->encoding == REDIS_ENCODING_RAW &&
(sdslen(o->ptr) + sdslen(append->ptr)) > 512*1024*1024)
{
addReplyError(c,"string exceeds maximum allowed size (512MB)");
decrRefCount(append);
/* "append" is an argument, so always an sds */
append = c->argv[2];
totlen = stringObjectLen(o)+sdslen(append->ptr);
if (checkStringLength(c,totlen) != REDIS_OK)
return;
}
/* If the object is shared or encoded, we have to make a copy */
if (o->refcount != 1 || o->encoding != REDIS_ENCODING_RAW) {
@ -429,7 +424,6 @@ void appendCommand(redisClient *c) {
/* Append the value */
o->ptr = sdscatlen(o->ptr,append->ptr,sdslen(append->ptr));
decrRefCount(append);
totlen = sdslen(o->ptr);
}
touchWatchedKey(c->db,c->argv[1]);