Reduce memory usage for in place strings by 8 bytes

This commit is contained in:
John Sully 2019-02-09 13:04:18 -05:00
parent dac1213462
commit f6736cd713
35 changed files with 919 additions and 912 deletions

View File

@ -420,7 +420,7 @@ Anatomy of a Redis command
All the Redis commands are defined in the following way: All the Redis commands are defined in the following way:
void foobarCommand(client *c) { void foobarCommand(client *c) {
printf("%s",c->argv[1]->ptr); /* Do something with the argument. */ printf("%s",ptrFromObj(c->argv[1])); /* Do something with the argument. */
addReply(c,shared.ok); /* Reply something to the client. */ addReply(c,shared.ok); /* Reply something to the client. */
} }

View File

@ -759,7 +759,7 @@ void ACLInit(void) {
* ENONENT: if the specified user does not exist at all. * ENONENT: if the specified user does not exist at all.
*/ */
int ACLCheckUserCredentials(robj *username, robj *password) { int ACLCheckUserCredentials(robj *username, robj *password) {
user *u = ACLGetUserByName(username->ptr,sdslen(username->ptr)); user *u = ACLGetUserByName(ptrFromObj(username),sdslen(ptrFromObj(username)));
if (u == NULL) { if (u == NULL) {
errno = ENOENT; errno = ENOENT;
return C_ERR; return C_ERR;
@ -781,7 +781,7 @@ int ACLCheckUserCredentials(robj *username, robj *password) {
listRewind(u->passwords,&li); listRewind(u->passwords,&li);
while((ln = listNext(&li))) { while((ln = listNext(&li))) {
sds thispass = listNodeValue(ln); sds thispass = listNodeValue(ln);
if (!time_independent_strcmp(password->ptr, thispass)) if (!time_independent_strcmp(ptrFromObj(password), thispass))
return C_OK; return C_OK;
} }
@ -868,7 +868,7 @@ int ACLCheckCommandPerm(client *c) {
while (1) { while (1) {
if (u->allowed_subcommands[id][subid] == NULL) if (u->allowed_subcommands[id][subid] == NULL)
return ACL_DENIED_CMD; return ACL_DENIED_CMD;
if (!strcasecmp(c->argv[1]->ptr, if (!strcasecmp(ptrFromObj(c->argv[1]),
u->allowed_subcommands[id][subid])) u->allowed_subcommands[id][subid]))
break; /* Subcommand match found. Stop here. */ break; /* Subcommand match found. Stop here. */
subid++; subid++;
@ -894,8 +894,8 @@ int ACLCheckCommandPerm(client *c) {
sds pattern = listNodeValue(ln); sds pattern = listNodeValue(ln);
size_t plen = sdslen(pattern); size_t plen = sdslen(pattern);
int idx = keyidx[j]; int idx = keyidx[j];
if (stringmatchlen(pattern,plen,c->argv[idx]->ptr, if (stringmatchlen(pattern,plen,ptrFromObj(c->argv[idx]),
sdslen(c->argv[idx]->ptr),0)) sdslen(ptrFromObj(c->argv[idx])),0))
{ {
match = 1; match = 1;
break; break;
@ -1021,18 +1021,18 @@ int ACLLoadConfiguredUsers(void) {
* ACL GETUSER <username> * ACL GETUSER <username>
*/ */
void aclCommand(client *c) { void aclCommand(client *c) {
char *sub = c->argv[1]->ptr; char *sub = ptrFromObj(c->argv[1]);
if (!strcasecmp(sub,"setuser") && c->argc >= 3) { if (!strcasecmp(sub,"setuser") && c->argc >= 3) {
sds username = c->argv[2]->ptr; sds username = ptrFromObj(c->argv[2]);
user *u = ACLGetUserByName(username,sdslen(username)); user *u = ACLGetUserByName(username,sdslen(username));
if (!u) u = ACLCreateUser(username,sdslen(username)); if (!u) u = ACLCreateUser(username,sdslen(username));
serverAssert(u != NULL); serverAssert(u != NULL);
for (int j = 3; j < c->argc; j++) { for (int j = 3; j < c->argc; j++) {
if (ACLSetUser(u,c->argv[j]->ptr,sdslen(c->argv[j]->ptr)) != C_OK) { if (ACLSetUser(u,ptrFromObj(c->argv[j]),sdslen(ptrFromObj(c->argv[j]))) != C_OK) {
char *errmsg = ACLSetUserStringError(); char *errmsg = ACLSetUserStringError();
addReplyErrorFormat(c, addReplyErrorFormat(c,
"Error in ACL SETUSER modifier '%s': %s", "Error in ACL SETUSER modifier '%s': %s",
(char*)c->argv[j]->ptr, errmsg); (char*)ptrFromObj(c->argv[j]), errmsg);
return; return;
} }
} }
@ -1040,7 +1040,7 @@ void aclCommand(client *c) {
} else if (!strcasecmp(sub,"deluser") && c->argc >= 3) { } else if (!strcasecmp(sub,"deluser") && c->argc >= 3) {
int deleted = 0; int deleted = 0;
for (int j = 2; j < c->argc; j++) { for (int j = 2; j < c->argc; j++) {
sds username = c->argv[j]->ptr; sds username = ptrFromObj(c->argv[j]);
if (!strcmp(username,"default")) { if (!strcmp(username,"default")) {
addReplyError(c,"The 'default' user cannot be removed"); addReplyError(c,"The 'default' user cannot be removed");
return; return;
@ -1076,7 +1076,7 @@ void aclCommand(client *c) {
} }
addReplyLongLong(c,deleted); addReplyLongLong(c,deleted);
} else if (!strcasecmp(sub,"getuser") && c->argc == 3) { } else if (!strcasecmp(sub,"getuser") && c->argc == 3) {
user *u = ACLGetUserByName(c->argv[2]->ptr,sdslen(c->argv[2]->ptr)); user *u = ACLGetUserByName(ptrFromObj(c->argv[2]),sdslen(ptrFromObj(c->argv[2])));
if (u == NULL) { if (u == NULL) {
addReplyNull(c); addReplyNull(c);
return; return;

View File

@ -506,11 +506,11 @@ sds catAppendOnlyGenericCommand(sds dst, int argc, robj **argv) {
for (j = 0; j < argc; j++) { for (j = 0; j < argc; j++) {
o = getDecodedObject(argv[j]); o = getDecodedObject(argv[j]);
buf[0] = '$'; buf[0] = '$';
len = 1+ll2string(buf+1,sizeof(buf)-1,sdslen(o->ptr)); len = 1+ll2string(buf+1,sizeof(buf)-1,sdslen(ptrFromObj(o)));
buf[len++] = '\r'; buf[len++] = '\r';
buf[len++] = '\n'; buf[len++] = '\n';
dst = sdscatlen(dst,buf,len); dst = sdscatlen(dst,buf,len);
dst = sdscatlen(dst,o->ptr,sdslen(o->ptr)); dst = sdscatlen(dst,ptrFromObj(o),sdslen(ptrFromObj(o)));
dst = sdscatlen(dst,"\r\n",2); dst = sdscatlen(dst,"\r\n",2);
decrRefCount(o); decrRefCount(o);
} }
@ -530,7 +530,7 @@ sds catAppendOnlyExpireAtCommand(sds buf, struct redisCommand *cmd, robj *key, r
/* Make sure we can use strtoll */ /* Make sure we can use strtoll */
seconds = getDecodedObject(seconds); seconds = getDecodedObject(seconds);
when = strtoll(seconds->ptr,NULL,10); when = strtoll(ptrFromObj(seconds),NULL,10);
/* Convert argument into milliseconds for EXPIRE, SETEX, EXPIREAT */ /* Convert argument into milliseconds for EXPIRE, SETEX, EXPIREAT */
if (cmd->proc == expireCommand || cmd->proc == setexCommand || if (cmd->proc == expireCommand || cmd->proc == setexCommand ||
cmd->proc == expireatCommand) cmd->proc == expireatCommand)
@ -587,8 +587,8 @@ void feedAppendOnlyFile(struct redisCommand *cmd, int dictid, robj **argv, int a
/* Translate SET [EX seconds][PX milliseconds] to SET and PEXPIREAT */ /* Translate SET [EX seconds][PX milliseconds] to SET and PEXPIREAT */
buf = catAppendOnlyGenericCommand(buf,3,argv); buf = catAppendOnlyGenericCommand(buf,3,argv);
for (i = 3; i < argc; i ++) { for (i = 3; i < argc; i ++) {
if (!strcasecmp(argv[i]->ptr, "ex")) exarg = argv[i+1]; if (!strcasecmp(ptrFromObj(argv[i]), "ex")) exarg = argv[i+1];
if (!strcasecmp(argv[i]->ptr, "px")) pxarg = argv[i+1]; if (!strcasecmp(ptrFromObj(argv[i]), "px")) pxarg = argv[i+1];
} }
serverAssert(!(exarg && pxarg)); serverAssert(!(exarg && pxarg));
if (exarg) if (exarg)
@ -780,11 +780,11 @@ int loadAppendOnlyFile(char *filename) {
} }
/* Command lookup */ /* Command lookup */
cmd = lookupCommand(argv[0]->ptr); cmd = lookupCommand(ptrFromObj(argv[0]));
if (!cmd) { if (!cmd) {
serverLog(LL_WARNING, serverLog(LL_WARNING,
"Unknown command '%s' reading the append only file", "Unknown command '%s' reading the append only file",
(char*)argv[0]->ptr); (char*)ptrFromObj(argv[0]));
exit(1); exit(1);
} }
@ -886,9 +886,9 @@ int rioWriteBulkObject(rio *r, robj *obj) {
/* Avoid using getDecodedObject to help copy-on-write (we are often /* Avoid using getDecodedObject to help copy-on-write (we are often
* in a child process when this function is called). */ * in a child process when this function is called). */
if (obj->encoding == OBJ_ENCODING_INT) { if (obj->encoding == OBJ_ENCODING_INT) {
return rioWriteBulkLongLong(r,(long)obj->ptr); return rioWriteBulkLongLong(r,(long)obj->m_ptr);
} else if (sdsEncodedObject(obj)) { } else if (sdsEncodedObject(obj)) {
return rioWriteBulkString(r,obj->ptr,sdslen(obj->ptr)); return rioWriteBulkString(r,ptrFromObj(obj),sdslen(ptrFromObj(obj)));
} else { } else {
serverPanic("Unknown string encoding"); serverPanic("Unknown string encoding");
} }
@ -900,7 +900,7 @@ int rewriteListObject(rio *r, robj *key, robj *o) {
long long count = 0, items = listTypeLength(o); long long count = 0, items = listTypeLength(o);
if (o->encoding == OBJ_ENCODING_QUICKLIST) { if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklist *list = o->ptr; quicklist *list = ptrFromObj(o);
quicklistIter *li = quicklistGetIterator(list, AL_START_HEAD); quicklistIter *li = quicklistGetIterator(list, AL_START_HEAD);
quicklistEntry entry; quicklistEntry entry;
@ -937,7 +937,7 @@ int rewriteSetObject(rio *r, robj *key, robj *o) {
int ii = 0; int ii = 0;
int64_t llval; int64_t llval;
while(intsetGet(o->ptr,ii++,&llval)) { while(intsetGet(ptrFromObj(o),ii++,&llval)) {
if (count == 0) { if (count == 0) {
int cmd_items = (items > AOF_REWRITE_ITEMS_PER_CMD) ? int cmd_items = (items > AOF_REWRITE_ITEMS_PER_CMD) ?
AOF_REWRITE_ITEMS_PER_CMD : items; AOF_REWRITE_ITEMS_PER_CMD : items;
@ -951,7 +951,7 @@ int rewriteSetObject(rio *r, robj *key, robj *o) {
items--; items--;
} }
} else if (o->encoding == OBJ_ENCODING_HT) { } else if (o->encoding == OBJ_ENCODING_HT) {
dictIterator *di = dictGetIterator(o->ptr); dictIterator *di = dictGetIterator(ptrFromObj(o));
dictEntry *de; dictEntry *de;
while((de = dictNext(di)) != NULL) { while((de = dictNext(di)) != NULL) {
@ -981,7 +981,7 @@ int rewriteSortedSetObject(rio *r, robj *key, robj *o) {
long long count = 0, items = zsetLength(o); long long count = 0, items = zsetLength(o);
if (o->encoding == OBJ_ENCODING_ZIPLIST) { if (o->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = o->ptr; unsigned char *zl = ptrFromObj(o);
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
unsigned char *vstr; unsigned char *vstr;
unsigned int vlen; unsigned int vlen;
@ -1016,7 +1016,7 @@ int rewriteSortedSetObject(rio *r, robj *key, robj *o) {
items--; items--;
} }
} else if (o->encoding == OBJ_ENCODING_SKIPLIST) { } else if (o->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = o->ptr; zset *zs = ptrFromObj(o);
dictIterator *di = dictGetIterator(zs->pdict); dictIterator *di = dictGetIterator(zs->pdict);
dictEntry *de; dictEntry *de;
@ -1137,7 +1137,7 @@ int rioWriteStreamPendingEntry(rio *r, robj *key, const char *groupname, size_t
/* Emit the commands needed to rebuild a stream object. /* Emit the commands needed to rebuild a stream object.
* The function returns 0 on error, 1 on success. */ * The function returns 0 on error, 1 on success. */
int rewriteStreamObject(rio *r, robj *key, robj *o) { int rewriteStreamObject(rio *r, robj *key, robj *o) {
stream *s = o->ptr; stream *s = ptrFromObj(o);
streamIterator si; streamIterator si;
streamIteratorStart(&si,s,NULL,NULL,0); streamIteratorStart(&si,s,NULL,NULL,0);
streamID id; streamID id;
@ -1237,7 +1237,7 @@ int rewriteStreamObject(rio *r, robj *key, robj *o) {
* The function returns 0 on error, 1 on success. */ * The function returns 0 on error, 1 on success. */
int rewriteModuleObject(rio *r, robj *key, robj *o) { int rewriteModuleObject(rio *r, robj *key, robj *o) {
RedisModuleIO io; RedisModuleIO io;
moduleValue *mv = o->ptr; moduleValue *mv = ptrFromObj(o);
moduleType *mt = mv->type; moduleType *mt = mv->type;
moduleInitIOContext(io,mt,r); moduleInitIOContext(io,mt,r);
mt->aof_rewrite(&io,key,mv->value); mt->aof_rewrite(&io,key,mv->value);

View File

@ -411,7 +411,7 @@ void printBits(unsigned char *p, unsigned long count) {
int getBitOffsetFromArgument(client *c, robj *o, size_t *offset, int hash, int bits) { int getBitOffsetFromArgument(client *c, robj *o, size_t *offset, int hash, int bits) {
long long loffset; long long loffset;
char *err = "bit offset is not an integer or out of range"; char *err = "bit offset is not an integer or out of range";
char *p = o->ptr; char *p = ptrFromObj(o);
size_t plen = sdslen(p); size_t plen = sdslen(p);
int usehash = 0; int usehash = 0;
@ -445,7 +445,7 @@ int getBitOffsetFromArgument(client *c, robj *o, size_t *offset, int hash, int b
* *
* On error C_ERR is returned and an error is sent to the client. */ * On error C_ERR is returned and an error is sent to the client. */
int getBitfieldTypeFromArgument(client *c, robj *o, int *sign, int *bits) { int getBitfieldTypeFromArgument(client *c, robj *o, int *sign, int *bits) {
char *p = o->ptr; char *p = ptrFromObj(o);
char *err = "Invalid bitfield type. Use something like i16 u8. Note that u64 is not supported but i64 is."; char *err = "Invalid bitfield type. Use something like i16 u8. Note that u64 is not supported but i64 is.";
long long llbits; long long llbits;
@ -485,7 +485,7 @@ robj *lookupStringForBitCommand(client *c, size_t maxbit) {
} else { } else {
if (checkType(c,o,OBJ_STRING)) return NULL; if (checkType(c,o,OBJ_STRING)) return NULL;
o = dbUnshareStringValue(c->db,c->argv[1],o); o = dbUnshareStringValue(c->db,c->argv[1],o);
o->ptr = sdsgrowzero(o->ptr,byte+1); o->m_ptr = sdsgrowzero(ptrFromObj(o),byte+1);
} }
return o; return o;
} }
@ -511,10 +511,10 @@ unsigned char *getObjectReadOnlyString(robj *o, long *len, char *llbuf) {
* array if our string was integer encoded. */ * array if our string was integer encoded. */
if (o && o->encoding == OBJ_ENCODING_INT) { if (o && o->encoding == OBJ_ENCODING_INT) {
p = (unsigned char*) llbuf; p = (unsigned char*) llbuf;
if (len) *len = ll2string(llbuf,LONG_STR_SIZE,(long)o->ptr); if (len) *len = ll2string(llbuf,LONG_STR_SIZE,(long)ptrFromObj(o));
} else if (o) { } else if (o) {
p = (unsigned char*) o->ptr; p = (unsigned char*) ptrFromObj(o);
if (len) *len = sdslen(o->ptr); if (len) *len = sdslen(ptrFromObj(o));
} else { } else {
if (len) *len = 0; if (len) *len = 0;
} }
@ -546,14 +546,14 @@ void setbitCommand(client *c) {
/* Get current values */ /* Get current values */
byte = bitoffset >> 3; byte = bitoffset >> 3;
byteval = ((uint8_t*)o->ptr)[byte]; byteval = ((uint8_t*)ptrFromObj(o))[byte];
bit = 7 - (bitoffset & 0x7); bit = 7 - (bitoffset & 0x7);
bitval = byteval & (1 << bit); bitval = byteval & (1 << bit);
/* Update byte with new bit value and return original value */ /* Update byte with new bit value and return original value */
byteval &= ~(1 << bit); byteval &= ~(1 << bit);
byteval |= ((on & 0x1) << bit); byteval |= ((on & 0x1) << bit);
((uint8_t*)o->ptr)[byte] = byteval; ((uint8_t*)ptrFromObj(o))[byte] = byteval;
signalModifiedKey(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[1]);
notifyKeyspaceEvent(NOTIFY_STRING,"setbit",c->argv[1],c->db->id); notifyKeyspaceEvent(NOTIFY_STRING,"setbit",c->argv[1],c->db->id);
server.dirty++; server.dirty++;
@ -577,10 +577,10 @@ void getbitCommand(client *c) {
byte = bitoffset >> 3; byte = bitoffset >> 3;
bit = 7 - (bitoffset & 0x7); bit = 7 - (bitoffset & 0x7);
if (sdsEncodedObject(o)) { if (sdsEncodedObject(o)) {
if (byte < sdslen(o->ptr)) if (byte < sdslen(ptrFromObj(o)))
bitval = ((uint8_t*)o->ptr)[byte] & (1 << bit); bitval = ((uint8_t*)ptrFromObj(o))[byte] & (1 << bit);
} else { } else {
if (byte < (size_t)ll2string(llbuf,sizeof(llbuf),(long)o->ptr)) if (byte < (size_t)ll2string(llbuf,sizeof(llbuf),(long)ptrFromObj(o)))
bitval = llbuf[byte] & (1 << bit); bitval = llbuf[byte] & (1 << bit);
} }
@ -589,7 +589,7 @@ void getbitCommand(client *c) {
/* BITOP op_name target_key src_key1 src_key2 src_key3 ... src_keyN */ /* BITOP op_name target_key src_key1 src_key2 src_key3 ... src_keyN */
void bitopCommand(client *c) { void bitopCommand(client *c) {
char *opname = c->argv[1]->ptr; char *opname = ptrFromObj(c->argv[1]);
robj *o, *targetkey = c->argv[2]; robj *o, *targetkey = c->argv[2];
unsigned long op, j, numkeys; unsigned long op, j, numkeys;
robj **objects; /* Array of source objects. */ robj **objects; /* Array of source objects. */
@ -647,8 +647,8 @@ void bitopCommand(client *c) {
return; return;
} }
objects[j] = getDecodedObject(o); objects[j] = getDecodedObject(o);
src[j] = objects[j]->ptr; src[j] = ptrFromObj(objects[j]);
len[j] = sdslen(objects[j]->ptr); len[j] = sdslen(ptrFromObj(objects[j]));
if (len[j] > maxlen) maxlen = len[j]; if (len[j] > maxlen) maxlen = len[j];
if (j == 0 || len[j] < minlen) minlen = len[j]; if (j == 0 || len[j] < minlen) minlen = len[j];
} }
@ -922,7 +922,7 @@ void bitfieldCommand(client *c) {
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
int remargs = c->argc-j-1; /* Remaining args other than current. */ int remargs = c->argc-j-1; /* Remaining args other than current. */
char *subcmd = c->argv[j]->ptr; /* Current command name. */ char *subcmd = ptrFromObj(c->argv[j]); /* Current command name. */
int opcode; /* Current operation code. */ int opcode; /* Current operation code. */
long long i64 = 0; /* Signed SET value. */ long long i64 = 0; /* Signed SET value. */
int sign = 0; /* Signed or unsigned type? */ int sign = 0; /* Signed or unsigned type? */
@ -935,7 +935,7 @@ void bitfieldCommand(client *c) {
else if (!strcasecmp(subcmd,"incrby") && remargs >= 3) else if (!strcasecmp(subcmd,"incrby") && remargs >= 3)
opcode = BITFIELDOP_INCRBY; opcode = BITFIELDOP_INCRBY;
else if (!strcasecmp(subcmd,"overflow") && remargs >= 1) { else if (!strcasecmp(subcmd,"overflow") && remargs >= 1) {
char *owtypename = c->argv[j+1]->ptr; char *owtypename = ptrFromObj(c->argv[j+1]);
j++; j++;
if (!strcasecmp(owtypename,"wrap")) if (!strcasecmp(owtypename,"wrap"))
owtype = BFOVERFLOW_WRAP; owtype = BFOVERFLOW_WRAP;
@ -1023,7 +1023,7 @@ void bitfieldCommand(client *c) {
int64_t oldval, newval, wrapped, retval; int64_t oldval, newval, wrapped, retval;
int overflow; int overflow;
oldval = getSignedBitfield(o->ptr,thisop->offset, oldval = getSignedBitfield(ptrFromObj(o),thisop->offset,
thisop->bits); thisop->bits);
if (thisop->opcode == BITFIELDOP_INCRBY) { if (thisop->opcode == BITFIELDOP_INCRBY) {
@ -1044,7 +1044,7 @@ void bitfieldCommand(client *c) {
* NULL to signal the condition. */ * NULL to signal the condition. */
if (!(overflow && thisop->owtype == BFOVERFLOW_FAIL)) { if (!(overflow && thisop->owtype == BFOVERFLOW_FAIL)) {
addReplyLongLong(c,retval); addReplyLongLong(c,retval);
setSignedBitfield(o->ptr,thisop->offset, setSignedBitfield(ptrFromObj(o),thisop->offset,
thisop->bits,newval); thisop->bits,newval);
} else { } else {
addReplyNull(c); addReplyNull(c);
@ -1053,7 +1053,7 @@ void bitfieldCommand(client *c) {
uint64_t oldval, newval, wrapped, retval; uint64_t oldval, newval, wrapped, retval;
int overflow; int overflow;
oldval = getUnsignedBitfield(o->ptr,thisop->offset, oldval = getUnsignedBitfield(ptrFromObj(o),thisop->offset,
thisop->bits); thisop->bits);
if (thisop->opcode == BITFIELDOP_INCRBY) { if (thisop->opcode == BITFIELDOP_INCRBY) {
@ -1073,7 +1073,7 @@ void bitfieldCommand(client *c) {
* NULL to signal the condition. */ * NULL to signal the condition. */
if (!(overflow && thisop->owtype == BFOVERFLOW_FAIL)) { if (!(overflow && thisop->owtype == BFOVERFLOW_FAIL)) {
addReplyLongLong(c,retval); addReplyLongLong(c,retval);
setUnsignedBitfield(o->ptr,thisop->offset, setUnsignedBitfield(ptrFromObj(o),thisop->offset,
thisop->bits,newval); thisop->bits,newval);
} else { } else {
addReplyNull(c); addReplyNull(c);

View File

@ -374,7 +374,7 @@ void handleClientsBlockedOnKeys(void) {
/* Serve clients blocked on stream key. */ /* Serve clients blocked on stream key. */
else if (o != NULL && o->type == OBJ_STREAM) { else if (o != NULL && o->type == OBJ_STREAM) {
dictEntry *de = dictFind(rl->db->blocking_keys,rl->key); dictEntry *de = dictFind(rl->db->blocking_keys,rl->key);
stream *s = o->ptr; stream *s = ptrFromObj(o);
/* We need to provide the new data arrived on the stream /* We need to provide the new data arrived on the stream
* to all the clients that are waiting for an offset smaller * to all the clients that are waiting for an offset smaller
@ -403,7 +403,7 @@ void handleClientsBlockedOnKeys(void) {
streamCG *group = NULL; streamCG *group = NULL;
if (receiver->bpop.xread_group) { if (receiver->bpop.xread_group) {
group = streamLookupCG(s, group = streamLookupCG(s,
receiver->bpop.xread_group->ptr); ptrFromObj(receiver->bpop.xread_group));
/* If the group was not found, send an error /* If the group was not found, send an error
* to the consumer. */ * to the consumer. */
if (!group) { if (!group) {
@ -427,7 +427,7 @@ void handleClientsBlockedOnKeys(void) {
if (group) { if (group) {
consumer = streamLookupConsumer(group, consumer = streamLookupConsumer(group,
receiver->bpop.xread_consumer->ptr, ptrFromObj(receiver->bpop.xread_consumer),
1); 1);
noack = receiver->bpop.xread_group_noack; noack = receiver->bpop.xread_group_noack;
} }

View File

@ -2523,8 +2523,8 @@ void clusterSendPublish(clusterLink *link, robj *channel, robj *message) {
channel = getDecodedObject(channel); channel = getDecodedObject(channel);
message = getDecodedObject(message); message = getDecodedObject(message);
channel_len = sdslen(channel->ptr); channel_len = sdslen(ptrFromObj(channel));
message_len = sdslen(message->ptr); message_len = sdslen(ptrFromObj(message));
clusterBuildMessageHdr(hdr,CLUSTERMSG_TYPE_PUBLISH); clusterBuildMessageHdr(hdr,CLUSTERMSG_TYPE_PUBLISH);
totlen = sizeof(clusterMsg)-sizeof(union clusterMsgData); totlen = sizeof(clusterMsg)-sizeof(union clusterMsgData);
@ -2542,9 +2542,9 @@ void clusterSendPublish(clusterLink *link, robj *channel, robj *message) {
memcpy(payload,hdr,sizeof(*hdr)); memcpy(payload,hdr,sizeof(*hdr));
hdr = (clusterMsg*) payload; hdr = (clusterMsg*) payload;
} }
memcpy(hdr->data.publish.msg.bulk_data,channel->ptr,sdslen(channel->ptr)); memcpy(hdr->data.publish.msg.bulk_data,ptrFromObj(channel),sdslen(ptrFromObj(channel)));
memcpy(hdr->data.publish.msg.bulk_data+sdslen(channel->ptr), memcpy(hdr->data.publish.msg.bulk_data+sdslen(ptrFromObj(channel)),
message->ptr,sdslen(message->ptr)); ptrFromObj(message),sdslen(ptrFromObj(message)));
if (link) if (link)
clusterSendMessage(link,payload,totlen); clusterSendMessage(link,payload,totlen);
@ -4193,7 +4193,7 @@ void clusterCommand(client *c) {
return; return;
} }
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = { const char *help[] = {
"ADDSLOTS <slot> [slot ...] -- Assign slots to current node.", "ADDSLOTS <slot> [slot ...] -- Assign slots to current node.",
"BUMPEPOCH -- Advance the cluster config epoch.", "BUMPEPOCH -- Advance the cluster config epoch.",
@ -4220,35 +4220,35 @@ void clusterCommand(client *c) {
NULL NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (!strcasecmp(c->argv[1]->ptr,"meet") && (c->argc == 4 || c->argc == 5)) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"meet") && (c->argc == 4 || c->argc == 5)) {
/* CLUSTER MEET <ip> <port> [cport] */ /* CLUSTER MEET <ip> <port> [cport] */
long long port, cport; long long port, cport;
if (getLongLongFromObject(c->argv[3], &port) != C_OK) { if (getLongLongFromObject(c->argv[3], &port) != C_OK) {
addReplyErrorFormat(c,"Invalid TCP base port specified: %s", addReplyErrorFormat(c,"Invalid TCP base port specified: %s",
(char*)c->argv[3]->ptr); (char*)ptrFromObj(c->argv[3]));
return; return;
} }
if (c->argc == 5) { if (c->argc == 5) {
if (getLongLongFromObject(c->argv[4], &cport) != C_OK) { if (getLongLongFromObject(c->argv[4], &cport) != C_OK) {
addReplyErrorFormat(c,"Invalid TCP bus port specified: %s", addReplyErrorFormat(c,"Invalid TCP bus port specified: %s",
(char*)c->argv[4]->ptr); (char*)ptrFromObj(c->argv[4]));
return; return;
} }
} else { } else {
cport = port + CLUSTER_PORT_INCR; cport = port + CLUSTER_PORT_INCR;
} }
if (clusterStartHandshake(c->argv[2]->ptr,port,cport) == 0 && if (clusterStartHandshake(ptrFromObj(c->argv[2]),port,cport) == 0 &&
errno == EINVAL) errno == EINVAL)
{ {
addReplyErrorFormat(c,"Invalid node address specified: %s:%s", addReplyErrorFormat(c,"Invalid node address specified: %s:%s",
(char*)c->argv[2]->ptr, (char*)c->argv[3]->ptr); (char*)ptrFromObj(c->argv[2]), (char*)ptrFromObj(c->argv[3]));
} else { } else {
addReply(c,shared.ok); addReply(c,shared.ok);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"nodes") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"nodes") && c->argc == 2) {
/* CLUSTER NODES */ /* CLUSTER NODES */
robj *o; robj *o;
sds ci = clusterGenNodesDescription(0); sds ci = clusterGenNodesDescription(0);
@ -4256,13 +4256,13 @@ NULL
o = createObject(OBJ_STRING,ci); o = createObject(OBJ_STRING,ci);
addReplyBulk(c,o); addReplyBulk(c,o);
decrRefCount(o); decrRefCount(o);
} else if (!strcasecmp(c->argv[1]->ptr,"myid") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"myid") && c->argc == 2) {
/* CLUSTER MYID */ /* CLUSTER MYID */
addReplyBulkCBuffer(c,myself->name, CLUSTER_NAMELEN); addReplyBulkCBuffer(c,myself->name, CLUSTER_NAMELEN);
} else if (!strcasecmp(c->argv[1]->ptr,"slots") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"slots") && c->argc == 2) {
/* CLUSTER SLOTS */ /* CLUSTER SLOTS */
clusterReplyMultiBulkSlots(c); clusterReplyMultiBulkSlots(c);
} else if (!strcasecmp(c->argv[1]->ptr,"flushslots") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"flushslots") && c->argc == 2) {
/* CLUSTER FLUSHSLOTS */ /* CLUSTER FLUSHSLOTS */
if (dictSize(server.db[0].pdict) != 0) { if (dictSize(server.db[0].pdict) != 0) {
addReplyError(c,"DB must be empty to perform CLUSTER FLUSHSLOTS."); addReplyError(c,"DB must be empty to perform CLUSTER FLUSHSLOTS.");
@ -4271,14 +4271,14 @@ NULL
clusterDelNodeSlots(myself); clusterDelNodeSlots(myself);
clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|CLUSTER_TODO_SAVE_CONFIG); clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|CLUSTER_TODO_SAVE_CONFIG);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if ((!strcasecmp(c->argv[1]->ptr,"addslots") || } else if ((!strcasecmp(ptrFromObj(c->argv[1]),"addslots") ||
!strcasecmp(c->argv[1]->ptr,"delslots")) && c->argc >= 3) !strcasecmp(ptrFromObj(c->argv[1]),"delslots")) && c->argc >= 3)
{ {
/* CLUSTER ADDSLOTS <slot> [slot] ... */ /* CLUSTER ADDSLOTS <slot> [slot] ... */
/* CLUSTER DELSLOTS <slot> [slot] ... */ /* CLUSTER DELSLOTS <slot> [slot] ... */
int j, slot; int j, slot;
unsigned char *slots = zmalloc(CLUSTER_SLOTS, MALLOC_LOCAL); unsigned char *slots = zmalloc(CLUSTER_SLOTS, MALLOC_LOCAL);
int del = !strcasecmp(c->argv[1]->ptr,"delslots"); int del = !strcasecmp(ptrFromObj(c->argv[1]),"delslots");
memset(slots,0,CLUSTER_SLOTS); memset(slots,0,CLUSTER_SLOTS);
/* Check that all the arguments are parseable and that all the /* Check that all the arguments are parseable and that all the
@ -4321,7 +4321,7 @@ NULL
zfree(slots); zfree(slots);
clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|CLUSTER_TODO_SAVE_CONFIG); clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|CLUSTER_TODO_SAVE_CONFIG);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"setslot") && c->argc >= 4) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"setslot") && c->argc >= 4) {
/* SETSLOT 10 MIGRATING <node ID> */ /* SETSLOT 10 MIGRATING <node ID> */
/* SETSLOT 10 IMPORTING <node ID> */ /* SETSLOT 10 IMPORTING <node ID> */
/* SETSLOT 10 STABLE */ /* SETSLOT 10 STABLE */
@ -4336,40 +4336,40 @@ NULL
if ((slot = getSlotOrReply(c,c->argv[2])) == -1) return; if ((slot = getSlotOrReply(c,c->argv[2])) == -1) return;
if (!strcasecmp(c->argv[3]->ptr,"migrating") && c->argc == 5) { if (!strcasecmp(ptrFromObj(c->argv[3]),"migrating") && c->argc == 5) {
if (server.cluster->slots[slot] != myself) { if (server.cluster->slots[slot] != myself) {
addReplyErrorFormat(c,"I'm not the owner of hash slot %u",slot); addReplyErrorFormat(c,"I'm not the owner of hash slot %u",slot);
return; return;
} }
if ((n = clusterLookupNode(c->argv[4]->ptr)) == NULL) { if ((n = clusterLookupNode(ptrFromObj(c->argv[4]))) == NULL) {
addReplyErrorFormat(c,"I don't know about node %s", addReplyErrorFormat(c,"I don't know about node %s",
(char*)c->argv[4]->ptr); (char*)ptrFromObj(c->argv[4]));
return; return;
} }
server.cluster->migrating_slots_to[slot] = n; server.cluster->migrating_slots_to[slot] = n;
} else if (!strcasecmp(c->argv[3]->ptr,"importing") && c->argc == 5) { } else if (!strcasecmp(ptrFromObj(c->argv[3]),"importing") && c->argc == 5) {
if (server.cluster->slots[slot] == myself) { if (server.cluster->slots[slot] == myself) {
addReplyErrorFormat(c, addReplyErrorFormat(c,
"I'm already the owner of hash slot %u",slot); "I'm already the owner of hash slot %u",slot);
return; return;
} }
if ((n = clusterLookupNode(c->argv[4]->ptr)) == NULL) { if ((n = clusterLookupNode(ptrFromObj(c->argv[4]))) == NULL) {
addReplyErrorFormat(c,"I don't know about node %s", addReplyErrorFormat(c,"I don't know about node %s",
(char*)c->argv[4]->ptr); (char*)ptrFromObj(c->argv[4]));
return; return;
} }
server.cluster->importing_slots_from[slot] = n; server.cluster->importing_slots_from[slot] = n;
} else if (!strcasecmp(c->argv[3]->ptr,"stable") && c->argc == 4) { } else if (!strcasecmp(ptrFromObj(c->argv[3]),"stable") && c->argc == 4) {
/* CLUSTER SETSLOT <SLOT> STABLE */ /* CLUSTER SETSLOT <SLOT> STABLE */
server.cluster->importing_slots_from[slot] = NULL; server.cluster->importing_slots_from[slot] = NULL;
server.cluster->migrating_slots_to[slot] = NULL; server.cluster->migrating_slots_to[slot] = NULL;
} else if (!strcasecmp(c->argv[3]->ptr,"node") && c->argc == 5) { } else if (!strcasecmp(ptrFromObj(c->argv[3]),"node") && c->argc == 5) {
/* CLUSTER SETSLOT <SLOT> NODE <NODE ID> */ /* CLUSTER SETSLOT <SLOT> NODE <NODE ID> */
clusterNode *n = clusterLookupNode(c->argv[4]->ptr); clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[4]));
if (!n) { if (!n) {
addReplyErrorFormat(c,"Unknown node %s", addReplyErrorFormat(c,"Unknown node %s",
(char*)c->argv[4]->ptr); (char*)ptrFromObj(c->argv[4]));
return; return;
} }
/* If this hash slot was served by 'myself' before to switch /* If this hash slot was served by 'myself' before to switch
@ -4418,14 +4418,14 @@ NULL
} }
clusterDoBeforeSleep(CLUSTER_TODO_SAVE_CONFIG|CLUSTER_TODO_UPDATE_STATE); clusterDoBeforeSleep(CLUSTER_TODO_SAVE_CONFIG|CLUSTER_TODO_UPDATE_STATE);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"bumpepoch") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"bumpepoch") && c->argc == 2) {
/* CLUSTER BUMPEPOCH */ /* CLUSTER BUMPEPOCH */
int retval = clusterBumpConfigEpochWithoutConsensus(); int retval = clusterBumpConfigEpochWithoutConsensus();
sds reply = sdscatprintf(sdsempty(),"+%s %llu\r\n", sds reply = sdscatprintf(sdsempty(),"+%s %llu\r\n",
(retval == C_OK) ? "BUMPED" : "STILL", (retval == C_OK) ? "BUMPED" : "STILL",
(unsigned long long) myself->configEpoch); (unsigned long long) myself->configEpoch);
addReplySds(c,reply); addReplySds(c,reply);
} else if (!strcasecmp(c->argv[1]->ptr,"info") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"info") && c->argc == 2) {
/* CLUSTER INFO */ /* CLUSTER INFO */
char *statestr[] = {"ok","fail","needhelp"}; char *statestr[] = {"ok","fail","needhelp"};
int slots_assigned = 0, slots_ok = 0, slots_pfail = 0, slots_fail = 0; int slots_assigned = 0, slots_ok = 0, slots_pfail = 0, slots_fail = 0;
@ -4501,7 +4501,7 @@ NULL
(unsigned long)sdslen(info))); (unsigned long)sdslen(info)));
addReplySds(c,info); addReplySds(c,info);
addReply(c,shared.crlf); addReply(c,shared.crlf);
} else if (!strcasecmp(c->argv[1]->ptr,"saveconfig") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"saveconfig") && c->argc == 2) {
int retval = clusterSaveConfig(1); int retval = clusterSaveConfig(1);
if (retval == 0) if (retval == 0)
@ -4509,12 +4509,12 @@ NULL
else else
addReplyErrorFormat(c,"error saving the cluster node config: %s", addReplyErrorFormat(c,"error saving the cluster node config: %s",
strerror(errno)); strerror(errno));
} else if (!strcasecmp(c->argv[1]->ptr,"keyslot") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"keyslot") && c->argc == 3) {
/* CLUSTER KEYSLOT <key> */ /* CLUSTER KEYSLOT <key> */
sds key = c->argv[2]->ptr; sds key = ptrFromObj(c->argv[2]);
addReplyLongLong(c,keyHashSlot(key,sdslen(key))); addReplyLongLong(c,keyHashSlot(key,sdslen(key)));
} else if (!strcasecmp(c->argv[1]->ptr,"countkeysinslot") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"countkeysinslot") && c->argc == 3) {
/* CLUSTER COUNTKEYSINSLOT <slot> */ /* CLUSTER COUNTKEYSINSLOT <slot> */
long long slot; long long slot;
@ -4525,7 +4525,7 @@ NULL
return; return;
} }
addReplyLongLong(c,countKeysInSlot(slot)); addReplyLongLong(c,countKeysInSlot(slot));
} else if (!strcasecmp(c->argv[1]->ptr,"getkeysinslot") && c->argc == 4) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"getkeysinslot") && c->argc == 4) {
/* CLUSTER GETKEYSINSLOT <slot> <count> */ /* CLUSTER GETKEYSINSLOT <slot> <count> */
long long maxkeys, slot; long long maxkeys, slot;
unsigned int numkeys, j; unsigned int numkeys, j;
@ -4554,12 +4554,12 @@ NULL
decrRefCount(keys[j]); decrRefCount(keys[j]);
} }
zfree(keys); zfree(keys);
} else if (!strcasecmp(c->argv[1]->ptr,"forget") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"forget") && c->argc == 3) {
/* CLUSTER FORGET <NODE ID> */ /* CLUSTER FORGET <NODE ID> */
clusterNode *n = clusterLookupNode(c->argv[2]->ptr); clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[2]));
if (!n) { if (!n) {
addReplyErrorFormat(c,"Unknown node %s", (char*)c->argv[2]->ptr); addReplyErrorFormat(c,"Unknown node %s", (char*)ptrFromObj(c->argv[2]));
return; return;
} else if (n == myself) { } else if (n == myself) {
addReplyError(c,"I tried hard but I can't forget myself..."); addReplyError(c,"I tried hard but I can't forget myself...");
@ -4573,13 +4573,13 @@ NULL
clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE| clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|
CLUSTER_TODO_SAVE_CONFIG); CLUSTER_TODO_SAVE_CONFIG);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"replicate") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"replicate") && c->argc == 3) {
/* CLUSTER REPLICATE <NODE ID> */ /* CLUSTER REPLICATE <NODE ID> */
clusterNode *n = clusterLookupNode(c->argv[2]->ptr); clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[2]));
/* Lookup the specified node in our table. */ /* Lookup the specified node in our table. */
if (!n) { if (!n) {
addReplyErrorFormat(c,"Unknown node %s", (char*)c->argv[2]->ptr); addReplyErrorFormat(c,"Unknown node %s", (char*)ptrFromObj(c->argv[2]));
return; return;
} }
@ -4610,15 +4610,15 @@ NULL
clusterSetMaster(n); clusterSetMaster(n);
clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|CLUSTER_TODO_SAVE_CONFIG); clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|CLUSTER_TODO_SAVE_CONFIG);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if ((!strcasecmp(c->argv[1]->ptr,"slaves") || } else if ((!strcasecmp(ptrFromObj(c->argv[1]),"slaves") ||
!strcasecmp(c->argv[1]->ptr,"replicas")) && c->argc == 3) { !strcasecmp(ptrFromObj(c->argv[1]),"replicas")) && c->argc == 3) {
/* CLUSTER SLAVES <NODE ID> */ /* CLUSTER SLAVES <NODE ID> */
clusterNode *n = clusterLookupNode(c->argv[2]->ptr); clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[2]));
int j; int j;
/* Lookup the specified node in our table. */ /* Lookup the specified node in our table. */
if (!n) { if (!n) {
addReplyErrorFormat(c,"Unknown node %s", (char*)c->argv[2]->ptr); addReplyErrorFormat(c,"Unknown node %s", (char*)ptrFromObj(c->argv[2]));
return; return;
} }
@ -4633,28 +4633,28 @@ NULL
addReplyBulkCString(c,ni); addReplyBulkCString(c,ni);
sdsfree(ni); sdsfree(ni);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"count-failure-reports") && } else if (!strcasecmp(ptrFromObj(c->argv[1]),"count-failure-reports") &&
c->argc == 3) c->argc == 3)
{ {
/* CLUSTER COUNT-FAILURE-REPORTS <NODE ID> */ /* CLUSTER COUNT-FAILURE-REPORTS <NODE ID> */
clusterNode *n = clusterLookupNode(c->argv[2]->ptr); clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[2]));
if (!n) { if (!n) {
addReplyErrorFormat(c,"Unknown node %s", (char*)c->argv[2]->ptr); addReplyErrorFormat(c,"Unknown node %s", (char*)ptrFromObj(c->argv[2]));
return; return;
} else { } else {
addReplyLongLong(c,clusterNodeFailureReportsCount(n)); addReplyLongLong(c,clusterNodeFailureReportsCount(n));
} }
} else if (!strcasecmp(c->argv[1]->ptr,"failover") && } else if (!strcasecmp(ptrFromObj(c->argv[1]),"failover") &&
(c->argc == 2 || c->argc == 3)) (c->argc == 2 || c->argc == 3))
{ {
/* CLUSTER FAILOVER [FORCE|TAKEOVER] */ /* CLUSTER FAILOVER [FORCE|TAKEOVER] */
int force = 0, takeover = 0; int force = 0, takeover = 0;
if (c->argc == 3) { if (c->argc == 3) {
if (!strcasecmp(c->argv[2]->ptr,"force")) { if (!strcasecmp(ptrFromObj(c->argv[2]),"force")) {
force = 1; force = 1;
} else if (!strcasecmp(c->argv[2]->ptr,"takeover")) { } else if (!strcasecmp(ptrFromObj(c->argv[2]),"takeover")) {
takeover = 1; takeover = 1;
force = 1; /* Takeover also implies force. */ force = 1; /* Takeover also implies force. */
} else { } else {
@ -4700,7 +4700,7 @@ NULL
clusterSendMFStart(myself->slaveof); clusterSendMFStart(myself->slaveof);
} }
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"set-config-epoch") && c->argc == 3) } else if (!strcasecmp(ptrFromObj(c->argv[1]),"set-config-epoch") && c->argc == 3)
{ {
/* CLUSTER SET-CONFIG-EPOCH <epoch> /* CLUSTER SET-CONFIG-EPOCH <epoch>
* *
@ -4736,7 +4736,7 @@ NULL
CLUSTER_TODO_SAVE_CONFIG); CLUSTER_TODO_SAVE_CONFIG);
addReply(c,shared.ok); addReply(c,shared.ok);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"reset") && } else if (!strcasecmp(ptrFromObj(c->argv[1]),"reset") &&
(c->argc == 2 || c->argc == 3)) (c->argc == 2 || c->argc == 3))
{ {
/* CLUSTER RESET [SOFT|HARD] */ /* CLUSTER RESET [SOFT|HARD] */
@ -4744,9 +4744,9 @@ NULL
/* Parse soft/hard argument. Default is soft. */ /* Parse soft/hard argument. Default is soft. */
if (c->argc == 3) { if (c->argc == 3) {
if (!strcasecmp(c->argv[2]->ptr,"hard")) { if (!strcasecmp(ptrFromObj(c->argv[2]),"hard")) {
hard = 1; hard = 1;
} else if (!strcasecmp(c->argv[2]->ptr,"soft")) { } else if (!strcasecmp(ptrFromObj(c->argv[2]),"soft")) {
hard = 0; hard = 0;
} else { } else {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
@ -4860,11 +4860,11 @@ void restoreCommand(client *c) {
/* Parse additional options */ /* Parse additional options */
for (j = 4; j < c->argc; j++) { for (j = 4; j < c->argc; j++) {
int additional = c->argc-j-1; int additional = c->argc-j-1;
if (!strcasecmp(c->argv[j]->ptr,"replace")) { if (!strcasecmp(ptrFromObj(c->argv[j]),"replace")) {
replace = 1; replace = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"absttl")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"absttl")) {
absttl = 1; absttl = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"idletime") && additional >= 1 && } else if (!strcasecmp(ptrFromObj(c->argv[j]),"idletime") && additional >= 1 &&
lfu_freq == -1) lfu_freq == -1)
{ {
if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lru_idle,NULL) if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lru_idle,NULL)
@ -4875,7 +4875,7 @@ void restoreCommand(client *c) {
} }
lru_clock = LRU_CLOCK(); lru_clock = LRU_CLOCK();
j++; /* Consume additional arg. */ j++; /* Consume additional arg. */
} else if (!strcasecmp(c->argv[j]->ptr,"freq") && additional >= 1 && } else if (!strcasecmp(ptrFromObj(c->argv[j]),"freq") && additional >= 1 &&
lru_idle == -1) lru_idle == -1)
{ {
if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lfu_freq,NULL) if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lfu_freq,NULL)
@ -4906,13 +4906,13 @@ void restoreCommand(client *c) {
} }
/* Verify RDB version and data checksum. */ /* Verify RDB version and data checksum. */
if (verifyDumpPayload(c->argv[3]->ptr,sdslen(c->argv[3]->ptr)) == C_ERR) if (verifyDumpPayload(ptrFromObj(c->argv[3]),sdslen(ptrFromObj(c->argv[3]))) == C_ERR)
{ {
addReplyError(c,"DUMP payload version or checksum are wrong"); addReplyError(c,"DUMP payload version or checksum are wrong");
return; return;
} }
rioInitWithBuffer(&payload,c->argv[3]->ptr); rioInitWithBuffer(&payload,ptrFromObj(c->argv[3]));
if (((type = rdbLoadObjectType(&payload)) == -1) || if (((type = rdbLoadObjectType(&payload)) == -1) ||
((obj = rdbLoadObject(type,&payload)) == NULL)) ((obj = rdbLoadObject(type,&payload)) == NULL))
{ {
@ -4967,9 +4967,9 @@ migrateCachedSocket* migrateGetSocket(client *c, robj *host, robj *port, long ti
migrateCachedSocket *cs; migrateCachedSocket *cs;
/* Check if we have an already cached socket for this ip:port pair. */ /* Check if we have an already cached socket for this ip:port pair. */
name = sdscatlen(name,host->ptr,sdslen(host->ptr)); name = sdscatlen(name,ptrFromObj(host),sdslen(ptrFromObj(host)));
name = sdscatlen(name,":",1); name = sdscatlen(name,":",1);
name = sdscatlen(name,port->ptr,sdslen(port->ptr)); name = sdscatlen(name,ptrFromObj(port),sdslen(ptrFromObj(port)));
cs = dictFetchValue(server.migrate_cached_sockets,name); cs = dictFetchValue(server.migrate_cached_sockets,name);
if (cs) { if (cs) {
sdsfree(name); sdsfree(name);
@ -4988,8 +4988,8 @@ migrateCachedSocket* migrateGetSocket(client *c, robj *host, robj *port, long ti
} }
/* Create the socket */ /* Create the socket */
fd = anetTcpNonBlockConnect(server.neterr,c->argv[1]->ptr, fd = anetTcpNonBlockConnect(server.neterr,ptrFromObj(c->argv[1]),
atoi(c->argv[2]->ptr)); atoi(ptrFromObj(c->argv[2])));
if (fd == -1) { if (fd == -1) {
sdsfree(name); sdsfree(name);
addReplyErrorFormat(c,"Can't connect to target node: %s", addReplyErrorFormat(c,"Can't connect to target node: %s",
@ -5021,9 +5021,9 @@ void migrateCloseSocket(robj *host, robj *port) {
sds name = sdsempty(); sds name = sdsempty();
migrateCachedSocket *cs; migrateCachedSocket *cs;
name = sdscatlen(name,host->ptr,sdslen(host->ptr)); name = sdscatlen(name,ptrFromObj(host),sdslen(ptrFromObj(host)));
name = sdscatlen(name,":",1); name = sdscatlen(name,":",1);
name = sdscatlen(name,port->ptr,sdslen(port->ptr)); name = sdscatlen(name,ptrFromObj(port),sdslen(ptrFromObj(port)));
cs = dictFetchValue(server.migrate_cached_sockets,name); cs = dictFetchValue(server.migrate_cached_sockets,name);
if (!cs) { if (!cs) {
sdsfree(name); sdsfree(name);
@ -5079,19 +5079,19 @@ void migrateCommand(client *c) {
/* Parse additional options */ /* Parse additional options */
for (j = 6; j < c->argc; j++) { for (j = 6; j < c->argc; j++) {
int moreargs = j < c->argc-1; int moreargs = j < c->argc-1;
if (!strcasecmp(c->argv[j]->ptr,"copy")) { if (!strcasecmp(ptrFromObj(c->argv[j]),"copy")) {
copy = 1; copy = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"replace")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"replace")) {
replace = 1; replace = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"auth")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"auth")) {
if (!moreargs) { if (!moreargs) {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
return; return;
} }
j++; j++;
password = c->argv[j]->ptr; password = ptrFromObj(c->argv[j]);
} else if (!strcasecmp(c->argv[j]->ptr,"keys")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"keys")) {
if (sdslen(c->argv[3]->ptr) != 0) { if (sdslen(ptrFromObj(c->argv[3])) != 0) {
addReplyError(c, addReplyError(c,
"When using MIGRATE KEYS option, the key argument" "When using MIGRATE KEYS option, the key argument"
" must be set to the empty string"); " must be set to the empty string");
@ -5196,8 +5196,8 @@ try_again:
else else
serverAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,"RESTORE",7)); serverAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,"RESTORE",7));
serverAssertWithInfo(c,NULL,sdsEncodedObject(kv[j])); serverAssertWithInfo(c,NULL,sdsEncodedObject(kv[j]));
serverAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,kv[j]->ptr, serverAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,ptrFromObj(kv[j]),
sdslen(kv[j]->ptr))); sdslen(ptrFromObj(kv[j]))));
serverAssertWithInfo(c,NULL,rioWriteBulkLongLong(&cmd,ttl)); serverAssertWithInfo(c,NULL,rioWriteBulkLongLong(&cmd,ttl));
/* Emit the payload argument, that is the serialized object using /* Emit the payload argument, that is the serialized object using
@ -5500,8 +5500,8 @@ clusterNode *getNodeByQuery(client *c, struct redisCommand *cmd, robj **argv, in
keyindex = getKeysFromCommand(mcmd,margv,margc,&numkeys); keyindex = getKeysFromCommand(mcmd,margv,margc,&numkeys);
for (j = 0; j < numkeys; j++) { for (j = 0; j < numkeys; j++) {
robj *thiskey = margv[keyindex[j]]; robj *thiskey = margv[keyindex[j]];
int thisslot = keyHashSlot((char*)thiskey->ptr, int thisslot = keyHashSlot((char*)ptrFromObj(thiskey),
sdslen(thiskey->ptr)); sdslen(ptrFromObj(thiskey)));
if (firstkey == NULL) { if (firstkey == NULL) {
/* This is the first key we see. Check what is the slot /* This is the first key we see. Check what is the slot
@ -5681,7 +5681,7 @@ int clusterRedirectBlockedClientIfNeeded(client *c) {
di = dictGetIterator(c->bpop.keys); di = dictGetIterator(c->bpop.keys);
if ((de = dictNext(di)) != NULL) { if ((de = dictNext(di)) != NULL) {
robj *key = dictGetKey(de); robj *key = dictGetKey(de);
int slot = keyHashSlot((char*)key->ptr, sdslen(key->ptr)); int slot = keyHashSlot((char*)ptrFromObj(key), sdslen(ptrFromObj(key)));
clusterNode *node = server.cluster->slots[slot]; clusterNode *node = server.cluster->slots[slot];
/* We send an error and unblock the client if: /* We send an error and unblock the client if:

View File

@ -889,36 +889,36 @@ void loadServerConfig(char *filename, char *options) {
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define config_set_bool_field(_name,_var) \ #define config_set_bool_field(_name,_var) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) { \ } else if (!strcasecmp(ptrFromObj(c->argv[2]),_name)) { \
int yn = yesnotoi(o->ptr); \ int yn = yesnotoi(ptrFromObj(o)); \
if (yn == -1) goto badfmt; \ if (yn == -1) goto badfmt; \
_var = yn; _var = yn;
#define config_set_numerical_field(_name,_var,min,max) \ #define config_set_numerical_field(_name,_var,min,max) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) { \ } else if (!strcasecmp(ptrFromObj(c->argv[2]),_name)) { \
if (getLongLongFromObject(o,&ll) == C_ERR) goto badfmt; \ if (getLongLongFromObject(o,&ll) == C_ERR) goto badfmt; \
if (min != LLONG_MIN && ll < min) goto badfmt; \ if (min != LLONG_MIN && ll < min) goto badfmt; \
if (max != LLONG_MAX && ll > max) goto badfmt; \ if (max != LLONG_MAX && ll > max) goto badfmt; \
_var = ll; _var = ll;
#define config_set_memory_field(_name,_var) \ #define config_set_memory_field(_name,_var) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) { \ } else if (!strcasecmp(ptrFromObj(c->argv[2]),_name)) { \
ll = memtoll(o->ptr,&err); \ ll = memtoll(ptrFromObj(o),&err); \
if (err || ll < 0) goto badfmt; \ if (err || ll < 0) goto badfmt; \
_var = ll; _var = ll;
#define config_set_enum_field(_name,_var,_enumvar) \ #define config_set_enum_field(_name,_var,_enumvar) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) { \ } else if (!strcasecmp(ptrFromObj(c->argv[2]),_name)) { \
int enumval = configEnumGetValue(_enumvar,o->ptr); \ int enumval = configEnumGetValue(_enumvar,ptrFromObj(o)); \
if (enumval == INT_MIN) goto badfmt; \ if (enumval == INT_MIN) goto badfmt; \
_var = enumval; _var = enumval;
#define config_set_special_field(_name) \ #define config_set_special_field(_name) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) { } else if (!strcasecmp(ptrFromObj(c->argv[2]),_name)) {
#define config_set_special_field_with_alias(_name1,_name2) \ #define config_set_special_field_with_alias(_name1,_name2) \
} else if (!strcasecmp(c->argv[2]->ptr,_name1) || \ } else if (!strcasecmp(ptrFromObj(c->argv[2]),_name1) || \
!strcasecmp(c->argv[2]->ptr,_name2)) { !strcasecmp(ptrFromObj(c->argv[2]),_name2)) {
#define config_set_else } else #define config_set_else } else
@ -934,26 +934,26 @@ void configSetCommand(client *c) {
/* Special fields that can't be handled with general macros. */ /* Special fields that can't be handled with general macros. */
config_set_special_field("dbfilename") { config_set_special_field("dbfilename") {
if (!pathIsBaseName(o->ptr)) { if (!pathIsBaseName(ptrFromObj(o))) {
addReplyError(c, "dbfilename can't be a path, just a filename"); addReplyError(c, "dbfilename can't be a path, just a filename");
return; return;
} }
zfree(server.rdb_filename); zfree(server.rdb_filename);
server.rdb_filename = zstrdup(o->ptr); server.rdb_filename = zstrdup(ptrFromObj(o));
} config_set_special_field("requirepass") { } config_set_special_field("requirepass") {
if (sdslen(o->ptr) > CONFIG_AUTHPASS_MAX_LEN) goto badfmt; if (sdslen(ptrFromObj(o)) > CONFIG_AUTHPASS_MAX_LEN) goto badfmt;
/* The old "requirepass" directive just translates to setting /* The old "requirepass" directive just translates to setting
* a password to the default user. */ * a password to the default user. */
ACLSetUser(DefaultUser,"resetpass",-1); ACLSetUser(DefaultUser,"resetpass",-1);
sds aclop = sdscatprintf(sdsempty(),">%s",(char*)o->ptr); sds aclop = sdscatprintf(sdsempty(),">%s",(char*)ptrFromObj(o));
ACLSetUser(DefaultUser,aclop,sdslen(aclop)); ACLSetUser(DefaultUser,aclop,sdslen(aclop));
sdsfree(aclop); sdsfree(aclop);
} config_set_special_field("masterauth") { } config_set_special_field("masterauth") {
zfree(server.masterauth); zfree(server.masterauth);
server.masterauth = ((char*)o->ptr)[0] ? zstrdup(o->ptr) : NULL; server.masterauth = ((char*)ptrFromObj(o))[0] ? zstrdup(ptrFromObj(o)) : NULL;
} config_set_special_field("cluster-announce-ip") { } config_set_special_field("cluster-announce-ip") {
zfree(server.cluster_announce_ip); zfree(server.cluster_announce_ip);
server.cluster_announce_ip = ((char*)o->ptr)[0] ? zstrdup(o->ptr) : NULL; server.cluster_announce_ip = ((char*)ptrFromObj(o))[0] ? zstrdup(ptrFromObj(o)) : NULL;
} config_set_special_field("maxclients") { } config_set_special_field("maxclients") {
int orig_value = server.maxclients; int orig_value = server.maxclients;
@ -981,7 +981,7 @@ void configSetCommand(client *c) {
} }
} }
} config_set_special_field("appendonly") { } config_set_special_field("appendonly") {
int enable = yesnotoi(o->ptr); int enable = yesnotoi(ptrFromObj(o));
if (enable == -1) goto badfmt; if (enable == -1) goto badfmt;
if (enable == 0 && server.aof_state != AOF_OFF) { if (enable == 0 && server.aof_state != AOF_OFF) {
@ -995,7 +995,7 @@ void configSetCommand(client *c) {
} }
} config_set_special_field("save") { } config_set_special_field("save") {
int vlen, j; int vlen, j;
sds *v = sdssplitlen(o->ptr,sdslen(o->ptr)," ",1,&vlen); sds *v = sdssplitlen(ptrFromObj(o),sdslen(ptrFromObj(o))," ",1,&vlen);
/* Perform sanity check before setting the new config: /* Perform sanity check before setting the new config:
* - Even number of args * - Even number of args
@ -1028,13 +1028,13 @@ void configSetCommand(client *c) {
} }
sdsfreesplitres(v,vlen); sdsfreesplitres(v,vlen);
} config_set_special_field("dir") { } config_set_special_field("dir") {
if (chdir((char*)o->ptr) == -1) { if (chdir((char*)ptrFromObj(o)) == -1) {
addReplyErrorFormat(c,"Changing directory: %s", strerror(errno)); addReplyErrorFormat(c,"Changing directory: %s", strerror(errno));
return; return;
} }
} config_set_special_field("client-output-buffer-limit") { } config_set_special_field("client-output-buffer-limit") {
int vlen, j; int vlen, j;
sds *v = sdssplitlen(o->ptr,sdslen(o->ptr)," ",1,&vlen); sds *v = sdssplitlen(ptrFromObj(o),sdslen(ptrFromObj(o))," ",1,&vlen);
/* We need a multiple of 4: <class> <hard> <soft> <soft_seconds> */ /* We need a multiple of 4: <class> <hard> <soft> <soft_seconds> */
if (vlen % 4) { if (vlen % 4) {
@ -1079,7 +1079,7 @@ void configSetCommand(client *c) {
} }
sdsfreesplitres(v,vlen); sdsfreesplitres(v,vlen);
} config_set_special_field("notify-keyspace-events") { } config_set_special_field("notify-keyspace-events") {
int flags = keyspaceEventsStringToFlags(o->ptr); int flags = keyspaceEventsStringToFlags(ptrFromObj(o));
if (flags == -1) goto badfmt; if (flags == -1) goto badfmt;
server.notify_keyspace_events = flags; server.notify_keyspace_events = flags;
@ -1087,7 +1087,7 @@ void configSetCommand(client *c) {
"replica-announce-ip") "replica-announce-ip")
{ {
zfree(server.slave_announce_ip); zfree(server.slave_announce_ip);
server.slave_announce_ip = ((char*)o->ptr)[0] ? zstrdup(o->ptr) : NULL; server.slave_announce_ip = ((char*)ptrFromObj(o))[0] ? zstrdup(ptrFromObj(o)) : NULL;
/* Boolean fields. /* Boolean fields.
* config_set_bool_field(name,var). */ * config_set_bool_field(name,var). */
@ -1298,7 +1298,7 @@ void configSetCommand(client *c) {
/* Everyhing else is an error... */ /* Everyhing else is an error... */
} config_set_else { } config_set_else {
addReplyErrorFormat(c,"Unsupported CONFIG parameter: %s", addReplyErrorFormat(c,"Unsupported CONFIG parameter: %s",
(char*)c->argv[2]->ptr); (char*)ptrFromObj(c->argv[2]));
return; return;
} }
@ -1308,8 +1308,8 @@ void configSetCommand(client *c) {
badfmt: /* Bad format errors */ badfmt: /* Bad format errors */
addReplyErrorFormat(c,"Invalid argument '%s' for CONFIG SET '%s'", addReplyErrorFormat(c,"Invalid argument '%s' for CONFIG SET '%s'",
(char*)o->ptr, (char*)ptrFromObj(o),
(char*)c->argv[2]->ptr); (char*)ptrFromObj(c->argv[2]));
} }
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
@ -1352,7 +1352,7 @@ badfmt: /* Bad format errors */
void configGetCommand(client *c) { void configGetCommand(client *c) {
robj *o = c->argv[2]; robj *o = c->argv[2];
void *replylen = addReplyDeferredLen(c); void *replylen = addReplyDeferredLen(c);
char *pattern = o->ptr; char *pattern = ptrFromObj(o);
char buf[128]; char buf[128];
int matches = 0; int matches = 0;
serverAssertWithInfo(c,o,sdsEncodedObject(o)); serverAssertWithInfo(c,o,sdsEncodedObject(o));
@ -2335,12 +2335,12 @@ int rewriteConfig(char *path) {
void configCommand(client *c) { void configCommand(client *c) {
/* Only allow CONFIG GET while loading. */ /* Only allow CONFIG GET while loading. */
if (server.loading && strcasecmp(c->argv[1]->ptr,"get")) { if (server.loading && strcasecmp(ptrFromObj(c->argv[1]),"get")) {
addReplyError(c,"Only CONFIG GET is allowed during loading"); addReplyError(c,"Only CONFIG GET is allowed during loading");
return; return;
} }
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = { const char *help[] = {
"GET <pattern> -- Return parameters matching the glob-like <pattern> and their values.", "GET <pattern> -- Return parameters matching the glob-like <pattern> and their values.",
"SET <parameter> <value> -- Set parameter to value.", "SET <parameter> <value> -- Set parameter to value.",
@ -2349,15 +2349,15 @@ void configCommand(client *c) {
NULL NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (!strcasecmp(c->argv[1]->ptr,"set") && c->argc == 4) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"set") && c->argc == 4) {
configSetCommand(c); configSetCommand(c);
} else if (!strcasecmp(c->argv[1]->ptr,"get") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"get") && c->argc == 3) {
configGetCommand(c); configGetCommand(c);
} else if (!strcasecmp(c->argv[1]->ptr,"resetstat") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"resetstat") && c->argc == 2) {
resetServerStats(); resetServerStats();
resetCommandTableStats(); resetCommandTableStats();
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"rewrite") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"rewrite") && c->argc == 2) {
if (server.configfile == NULL) { if (server.configfile == NULL) {
addReplyError(c,"The server is running without a config file"); addReplyError(c,"The server is running without a config file");
return; return;

View File

@ -53,7 +53,7 @@ void updateLFU(robj *val) {
* implementations that should instead rely on lookupKeyRead(), * implementations that should instead rely on lookupKeyRead(),
* lookupKeyWrite() and lookupKeyReadWithFlags(). */ * lookupKeyWrite() and lookupKeyReadWithFlags(). */
robj *lookupKey(redisDb *db, robj *key, int flags) { robj *lookupKey(redisDb *db, robj *key, int flags) {
dictEntry *de = dictFind(db->pdict,key->ptr); dictEntry *de = dictFind(db->pdict,ptrFromObj(key));
if (de) { if (de) {
robj *val = dictGetVal(de); robj *val = dictGetVal(de);
@ -171,7 +171,7 @@ robj *lookupKeyWriteOrReply(client *c, robj *key, robj *reply) {
* *
* The program is aborted if the key already exists. */ * The program is aborted if the key already exists. */
void dbAdd(redisDb *db, robj *key, robj *val) { void dbAdd(redisDb *db, robj *key, robj *val) {
sds copy = sdsdup(key->ptr); sds copy = sdsdup(ptrFromObj(key));
int retval = dictAdd(db->pdict, copy, val); int retval = dictAdd(db->pdict, copy, val);
serverAssertWithInfo(NULL,key,retval == DICT_OK); serverAssertWithInfo(NULL,key,retval == DICT_OK);
@ -187,7 +187,7 @@ void dbAdd(redisDb *db, robj *key, robj *val) {
* *
* The program is aborted if the key was not already present. */ * The program is aborted if the key was not already present. */
void dbOverwrite(redisDb *db, robj *key, robj *val) { void dbOverwrite(redisDb *db, robj *key, robj *val) {
dictEntry *de = dictFind(db->pdict,key->ptr); dictEntry *de = dictFind(db->pdict,ptrFromObj(key));
serverAssertWithInfo(NULL,key,de != NULL); serverAssertWithInfo(NULL,key,de != NULL);
dictEntry auxentry = *de; dictEntry auxentry = *de;
@ -225,7 +225,7 @@ void setKey(redisDb *db, robj *key, robj *val) {
} }
int dbExists(redisDb *db, robj *key) { int dbExists(redisDb *db, robj *key) {
return dictFind(db->pdict,key->ptr) != NULL; return dictFind(db->pdict,ptrFromObj(key)) != NULL;
} }
/* Return a random key, in form of a Redis object. /* Return a random key, in form of a Redis object.
@ -271,8 +271,8 @@ robj *dbRandomKey(redisDb *db) {
int dbSyncDelete(redisDb *db, robj *key) { int dbSyncDelete(redisDb *db, robj *key) {
/* Deleting an entry from the expires dict will not free the sds of /* Deleting an entry from the expires dict will not free the sds of
* the key, because it is shared with the main dictionary. */ * the key, because it is shared with the main dictionary. */
if (dictSize(db->expires) > 0) dictDelete(db->expires,key->ptr); if (dictSize(db->expires) > 0) dictDelete(db->expires,ptrFromObj(key));
if (dictDelete(db->pdict,key->ptr) == DICT_OK) { if (dictDelete(db->pdict,ptrFromObj(key)) == DICT_OK) {
if (server.cluster_enabled) slotToKeyDel(key); if (server.cluster_enabled) slotToKeyDel(key);
return 1; return 1;
} else { } else {
@ -318,7 +318,7 @@ robj *dbUnshareStringValue(redisDb *db, robj *key, robj *o) {
serverAssert(o->type == OBJ_STRING); serverAssert(o->type == OBJ_STRING);
if (o->refcount != 1 || o->encoding != OBJ_ENCODING_RAW) { if (o->refcount != 1 || o->encoding != OBJ_ENCODING_RAW) {
robj *decoded = getDecodedObject(o); robj *decoded = getDecodedObject(o);
o = createRawStringObject(decoded->ptr, sdslen(decoded->ptr)); o = createRawStringObject(ptrFromObj(decoded), sdslen(ptrFromObj(decoded)));
decrRefCount(decoded); decrRefCount(decoded);
dbOverwrite(db,key,o); dbOverwrite(db,key,o);
} }
@ -415,7 +415,7 @@ void signalFlushedDb(int dbid) {
int getFlushCommandFlags(client *c, int *flags) { int getFlushCommandFlags(client *c, int *flags) {
/* Parse the optional ASYNC option. */ /* Parse the optional ASYNC option. */
if (c->argc > 1) { if (c->argc > 1) {
if (c->argc > 2 || strcasecmp(c->argv[1]->ptr,"async")) { if (c->argc > 2 || strcasecmp(ptrFromObj(c->argv[1]),"async")) {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
return C_ERR; return C_ERR;
} }
@ -533,7 +533,7 @@ void randomkeyCommand(client *c) {
void keysCommand(client *c) { void keysCommand(client *c) {
dictIterator *di; dictIterator *di;
dictEntry *de; dictEntry *de;
sds pattern = c->argv[1]->ptr; sds pattern = ptrFromObj(c->argv[1]);
int plen = sdslen(pattern), allkeys; int plen = sdslen(pattern), allkeys;
unsigned long numkeys = 0; unsigned long numkeys = 0;
void *replylen = addReplyDeferredLen(c); void *replylen = addReplyDeferredLen(c);
@ -598,8 +598,8 @@ int parseScanCursorOrReply(client *c, robj *o, unsigned long *cursor) {
/* Use strtoul() because we need an *unsigned* long, so /* Use strtoul() because we need an *unsigned* long, so
* getLongLongFromObject() does not cover the whole cursor space. */ * getLongLongFromObject() does not cover the whole cursor space. */
errno = 0; errno = 0;
*cursor = strtoul(o->ptr, &eptr, 10); *cursor = strtoul(ptrFromObj(o), &eptr, 10);
if (isspace(((char*)o->ptr)[0]) || eptr[0] != '\0' || errno == ERANGE) if (isspace(((char*)ptrFromObj(o))[0]) || eptr[0] != '\0' || errno == ERANGE)
{ {
addReplyError(c, "invalid cursor"); addReplyError(c, "invalid cursor");
return C_ERR; return C_ERR;
@ -638,7 +638,7 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
/* Step 1: Parse options. */ /* Step 1: Parse options. */
while (i < c->argc) { while (i < c->argc) {
j = c->argc - i; j = c->argc - i;
if (!strcasecmp(c->argv[i]->ptr, "count") && j >= 2) { if (!strcasecmp(ptrFromObj(c->argv[i]), "count") && j >= 2) {
if (getLongFromObjectOrReply(c, c->argv[i+1], &count, NULL) if (getLongFromObjectOrReply(c, c->argv[i+1], &count, NULL)
!= C_OK) != C_OK)
{ {
@ -651,8 +651,8 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
} }
i += 2; i += 2;
} else if (!strcasecmp(c->argv[i]->ptr, "match") && j >= 2) { } else if (!strcasecmp(ptrFromObj(c->argv[i]), "match") && j >= 2) {
pat = c->argv[i+1]->ptr; pat = ptrFromObj(c->argv[i+1]);
patlen = sdslen(pat); patlen = sdslen(pat);
/* The pattern always matches if it is exactly "*", so it is /* The pattern always matches if it is exactly "*", so it is
@ -679,12 +679,12 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
if (o == NULL) { if (o == NULL) {
ht = c->db->pdict; ht = c->db->pdict;
} else if (o->type == OBJ_SET && o->encoding == OBJ_ENCODING_HT) { } else if (o->type == OBJ_SET && o->encoding == OBJ_ENCODING_HT) {
ht = o->ptr; ht = ptrFromObj(o);
} else if (o->type == OBJ_HASH && o->encoding == OBJ_ENCODING_HT) { } else if (o->type == OBJ_HASH && o->encoding == OBJ_ENCODING_HT) {
ht = o->ptr; ht = ptrFromObj(o);
count *= 2; /* We return key / value for this type. */ count *= 2; /* We return key / value for this type. */
} else if (o->type == OBJ_ZSET && o->encoding == OBJ_ENCODING_SKIPLIST) { } else if (o->type == OBJ_ZSET && o->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = o->ptr; zset *zs = ptrFromObj(o);
ht = zs->pdict; ht = zs->pdict;
count *= 2; /* We return key / value for this type. */ count *= 2; /* We return key / value for this type. */
} }
@ -711,11 +711,11 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
int pos = 0; int pos = 0;
int64_t ll; int64_t ll;
while(intsetGet(o->ptr,pos++,&ll)) while(intsetGet(ptrFromObj(o),pos++,&ll))
listAddNodeTail(keys,createStringObjectFromLongLong(ll)); listAddNodeTail(keys,createStringObjectFromLongLong(ll));
cursor = 0; cursor = 0;
} else if (o->type == OBJ_HASH || o->type == OBJ_ZSET) { } else if (o->type == OBJ_HASH || o->type == OBJ_ZSET) {
unsigned char *p = ziplistIndex(o->ptr,0); unsigned char *p = ziplistIndex(ptrFromObj(o),0);
unsigned char *vstr; unsigned char *vstr;
unsigned int vlen; unsigned int vlen;
long long vll; long long vll;
@ -725,7 +725,7 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
listAddNodeTail(keys, listAddNodeTail(keys,
(vstr != NULL) ? createStringObject((char*)vstr,vlen) : (vstr != NULL) ? createStringObject((char*)vstr,vlen) :
createStringObjectFromLongLong(vll)); createStringObjectFromLongLong(vll));
p = ziplistNext(o->ptr,p); p = ziplistNext(ptrFromObj(o),p);
} }
cursor = 0; cursor = 0;
} else { } else {
@ -742,14 +742,14 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
/* Filter element if it does not match the pattern. */ /* Filter element if it does not match the pattern. */
if (!filter && use_pattern) { if (!filter && use_pattern) {
if (sdsEncodedObject(kobj)) { if (sdsEncodedObject(kobj)) {
if (!stringmatchlen(pat, patlen, kobj->ptr, sdslen(kobj->ptr), 0)) if (!stringmatchlen(pat, patlen, ptrFromObj(kobj), sdslen(ptrFromObj(kobj)), 0))
filter = 1; filter = 1;
} else { } else {
char buf[LONG_STR_SIZE]; char buf[LONG_STR_SIZE];
int len; int len;
serverAssert(kobj->encoding == OBJ_ENCODING_INT); serverAssert(kobj->encoding == OBJ_ENCODING_INT);
len = ll2string(buf,sizeof(buf),(long)kobj->ptr); len = ll2string(buf,sizeof(buf),(long)ptrFromObj(kobj));
if (!stringmatchlen(pat, patlen, buf, len, 0)) filter = 1; if (!stringmatchlen(pat, patlen, buf, len, 0)) filter = 1;
} }
} }
@ -826,7 +826,7 @@ void typeCommand(client *c) {
case OBJ_HASH: type = "hash"; break; case OBJ_HASH: type = "hash"; break;
case OBJ_STREAM: type = "stream"; break; case OBJ_STREAM: type = "stream"; break;
case OBJ_MODULE: { case OBJ_MODULE: {
moduleValue *mv = o->ptr; moduleValue *mv = ptrFromObj(o);
type = mv->type->name; type = mv->type->name;
}; break; }; break;
default: type = "unknown"; break; default: type = "unknown"; break;
@ -842,9 +842,9 @@ void shutdownCommand(client *c) {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
return; return;
} else if (c->argc == 2) { } else if (c->argc == 2) {
if (!strcasecmp(c->argv[1]->ptr,"nosave")) { if (!strcasecmp(ptrFromObj(c->argv[1]),"nosave")) {
flags |= SHUTDOWN_NOSAVE; flags |= SHUTDOWN_NOSAVE;
} else if (!strcasecmp(c->argv[1]->ptr,"save")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"save")) {
flags |= SHUTDOWN_SAVE; flags |= SHUTDOWN_SAVE;
} else { } else {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
@ -870,7 +870,7 @@ void renameGenericCommand(client *c, int nx) {
/* When source and dest key is the same, no operation is performed, /* When source and dest key is the same, no operation is performed,
* if the key exists, however we still return an error on unexisting key. */ * if the key exists, however we still return an error on unexisting key. */
if (sdscmp(c->argv[1]->ptr,c->argv[2]->ptr) == 0) samekey = 1; if (sdscmp(ptrFromObj(c->argv[1]),ptrFromObj(c->argv[2])) == 0) samekey = 1;
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr)) == NULL) if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr)) == NULL)
return; return;
@ -1062,8 +1062,8 @@ void swapdbCommand(client *c) {
int removeExpire(redisDb *db, robj *key) { int removeExpire(redisDb *db, robj *key) {
/* An expire may only be removed if there is a corresponding entry in the /* An expire may only be removed if there is a corresponding entry in the
* main dict. Otherwise, the key will never be freed. */ * main dict. Otherwise, the key will never be freed. */
serverAssertWithInfo(NULL,key,dictFind(db->pdict,key->ptr) != NULL); serverAssertWithInfo(NULL,key,dictFind(db->pdict,ptrFromObj(key)) != NULL);
return dictDelete(db->expires,key->ptr) == DICT_OK; return dictDelete(db->expires,ptrFromObj(key)) == DICT_OK;
} }
/* Set an expire to the specified key. If the expire is set in the context /* Set an expire to the specified key. If the expire is set in the context
@ -1074,7 +1074,7 @@ void setExpire(client *c, redisDb *db, robj *key, long long when) {
dictEntry *kde, *de; dictEntry *kde, *de;
/* Reuse the sds from the main dict in the expire dict */ /* Reuse the sds from the main dict in the expire dict */
kde = dictFind(db->pdict,key->ptr); kde = dictFind(db->pdict,ptrFromObj(key));
serverAssertWithInfo(NULL,key,kde != NULL); serverAssertWithInfo(NULL,key,kde != NULL);
de = dictAddOrFind(db->expires,dictGetKey(kde)); de = dictAddOrFind(db->expires,dictGetKey(kde));
dictSetSignedIntegerVal(de,when); dictSetSignedIntegerVal(de,when);
@ -1091,11 +1091,11 @@ long long getExpire(redisDb *db, robj *key) {
/* No expire? return ASAP */ /* No expire? return ASAP */
if (dictSize(db->expires) == 0 || if (dictSize(db->expires) == 0 ||
(de = dictFind(db->expires,key->ptr)) == NULL) return -1; (de = dictFind(db->expires,ptrFromObj(key))) == NULL) return -1;
/* The entry was found in the expire dict, this means it should also /* The entry was found in the expire dict, this means it should also
* be present in the main dict (safety check). */ * be present in the main dict (safety check). */
serverAssertWithInfo(NULL,key,dictFind(db->pdict,key->ptr) != NULL); serverAssertWithInfo(NULL,key,dictFind(db->pdict,ptrFromObj(key)) != NULL);
return dictGetSignedIntegerVal(de); return dictGetSignedIntegerVal(de);
} }
@ -1256,7 +1256,7 @@ int *zunionInterGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *nu
int i, num, *keys; int i, num, *keys;
UNUSED(cmd); UNUSED(cmd);
num = atoi(argv[2]->ptr); num = atoi(ptrFromObj(argv[2]));
/* Sanity check. Don't return any key if the command is going to /* Sanity check. Don't return any key if the command is going to
* reply with syntax error. */ * reply with syntax error. */
if (num < 1 || num > (argc-3)) { if (num < 1 || num > (argc-3)) {
@ -1285,7 +1285,7 @@ int *evalGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys)
int i, num, *keys; int i, num, *keys;
UNUSED(cmd); UNUSED(cmd);
num = atoi(argv[2]->ptr); num = atoi(ptrFromObj(argv[2]));
/* Sanity check. Don't return any key if the command is going to /* Sanity check. Don't return any key if the command is going to
* reply with syntax error. */ * reply with syntax error. */
if (num <= 0 || num > (argc-3)) { if (num <= 0 || num > (argc-3)) {
@ -1334,10 +1334,10 @@ int *sortGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys)
for (i = 2; i < argc; i++) { for (i = 2; i < argc; i++) {
for (j = 0; skiplist[j].name != NULL; j++) { for (j = 0; skiplist[j].name != NULL; j++) {
if (!strcasecmp(argv[i]->ptr,skiplist[j].name)) { if (!strcasecmp(ptrFromObj(argv[i]),skiplist[j].name)) {
i += skiplist[j].skip; i += skiplist[j].skip;
break; break;
} else if (!strcasecmp(argv[i]->ptr,"store") && i+1 < argc) { } else if (!strcasecmp(ptrFromObj(argv[i]),"store") && i+1 < argc) {
/* Note: we don't increment "num" here and continue the loop /* Note: we don't increment "num" here and continue the loop
* to be sure to process the *last* "STORE" option if multiple * to be sure to process the *last* "STORE" option if multiple
* ones are provided. This is same behavior as SORT. */ * ones are provided. This is same behavior as SORT. */
@ -1362,8 +1362,8 @@ int *migrateGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkey
/* But check for the extended one with the KEYS option. */ /* But check for the extended one with the KEYS option. */
if (argc > 6) { if (argc > 6) {
for (i = 6; i < argc; i++) { for (i = 6; i < argc; i++) {
if (!strcasecmp(argv[i]->ptr,"keys") && if (!strcasecmp(ptrFromObj(argv[i]),"keys") &&
sdslen(argv[3]->ptr) == 0) sdslen(ptrFromObj(argv[3])) == 0)
{ {
first = i+1; first = i+1;
num = argc-first; num = argc-first;
@ -1389,7 +1389,7 @@ int *georadiusGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numk
/* Check for the presence of the stored key in the command */ /* Check for the presence of the stored key in the command */
int stored_key = -1; int stored_key = -1;
for (i = 5; i < argc; i++) { for (i = 5; i < argc; i++) {
char *arg = argv[i]->ptr; char *arg = ptrFromObj(argv[i]);
/* For the case when user specifies both "store" and "storedist" options, the /* For the case when user specifies both "store" and "storedist" options, the
* second key specified would override the first key. This behavior is kept * second key specified would override the first key. This behavior is kept
* the same as in georadiusCommand method. * the same as in georadiusCommand method.
@ -1428,7 +1428,7 @@ int *xreadGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys)
* name of the stream key. */ * name of the stream key. */
int streams_pos = -1; int streams_pos = -1;
for (i = 1; i < argc; i++) { for (i = 1; i < argc; i++) {
char *arg = argv[i]->ptr; char *arg = ptrFromObj(argv[i]);
if (!strcasecmp(arg, "block")) { if (!strcasecmp(arg, "block")) {
i++; /* Skip option argument. */ i++; /* Skip option argument. */
} else if (!strcasecmp(arg, "count")) { } else if (!strcasecmp(arg, "count")) {
@ -1465,16 +1465,16 @@ int *xreadGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys)
* while rehashing the cluster and in other conditions when we need to * while rehashing the cluster and in other conditions when we need to
* understand if we have keys for a given hash slot. */ * understand if we have keys for a given hash slot. */
void slotToKeyUpdateKey(robj *key, int add) { void slotToKeyUpdateKey(robj *key, int add) {
unsigned int hashslot = keyHashSlot(key->ptr,sdslen(key->ptr)); unsigned int hashslot = keyHashSlot(ptrFromObj(key),sdslen(ptrFromObj(key)));
unsigned char buf[64]; unsigned char buf[64];
unsigned char *indexed = buf; unsigned char *indexed = buf;
size_t keylen = sdslen(key->ptr); size_t keylen = sdslen(ptrFromObj(key));
server.cluster->slots_keys_count[hashslot] += add ? 1 : -1; server.cluster->slots_keys_count[hashslot] += add ? 1 : -1;
if (keylen+2 > 64) indexed = zmalloc(keylen+2, MALLOC_SHARED); if (keylen+2 > 64) indexed = zmalloc(keylen+2, MALLOC_SHARED);
indexed[0] = (hashslot >> 8) & 0xff; indexed[0] = (hashslot >> 8) & 0xff;
indexed[1] = hashslot & 0xff; indexed[1] = hashslot & 0xff;
memcpy(indexed+2,key->ptr,keylen); memcpy(indexed+2,ptrFromObj(key),keylen);
if (add) { if (add) {
raxInsert(server.cluster->slots_to_keys,indexed,keylen+2,NULL,NULL); raxInsert(server.cluster->slots_to_keys,indexed,keylen+2,NULL,NULL);
} else { } else {

View File

@ -76,7 +76,7 @@ void xorDigest(unsigned char *digest, void *ptr, size_t len) {
void xorStringObjectDigest(unsigned char *digest, robj *o) { void xorStringObjectDigest(unsigned char *digest, robj *o) {
o = getDecodedObject(o); o = getDecodedObject(o);
xorDigest(digest,o->ptr,sdslen(o->ptr)); xorDigest(digest,ptrFromObj(o),sdslen(ptrFromObj(o)));
decrRefCount(o); decrRefCount(o);
} }
@ -106,7 +106,7 @@ void mixDigest(unsigned char *digest, void *ptr, size_t len) {
void mixStringObjectDigest(unsigned char *digest, robj *o) { void mixStringObjectDigest(unsigned char *digest, robj *o) {
o = getDecodedObject(o); o = getDecodedObject(o);
mixDigest(digest,o->ptr,sdslen(o->ptr)); mixDigest(digest,ptrFromObj(o),sdslen(ptrFromObj(o)));
decrRefCount(o); decrRefCount(o);
} }
@ -148,7 +148,7 @@ void xorObjectDigest(redisDb *db, robj *keyobj, unsigned char *digest, robj *o)
unsigned char eledigest[20]; unsigned char eledigest[20];
if (o->encoding == OBJ_ENCODING_ZIPLIST) { if (o->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = o->ptr; unsigned char *zl = ptrFromObj(o);
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
unsigned char *vstr; unsigned char *vstr;
unsigned int vlen; unsigned int vlen;
@ -178,7 +178,7 @@ void xorObjectDigest(redisDb *db, robj *keyobj, unsigned char *digest, robj *o)
zzlNext(zl,&eptr,&sptr); zzlNext(zl,&eptr,&sptr);
} }
} else if (o->encoding == OBJ_ENCODING_SKIPLIST) { } else if (o->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = o->ptr; zset *zs = ptrFromObj(o);
dictIterator *di = dictGetIterator(zs->pdict); dictIterator *di = dictGetIterator(zs->pdict);
dictEntry *de; dictEntry *de;
@ -214,7 +214,7 @@ void xorObjectDigest(redisDb *db, robj *keyobj, unsigned char *digest, robj *o)
hashTypeReleaseIterator(hi); hashTypeReleaseIterator(hi);
} else if (o->type == OBJ_STREAM) { } else if (o->type == OBJ_STREAM) {
streamIterator si; streamIterator si;
streamIteratorStart(&si,o->ptr,NULL,NULL,0); streamIteratorStart(&si,ptrFromObj(o),NULL,NULL,0);
streamID id; streamID id;
int64_t numfields; int64_t numfields;
@ -235,7 +235,7 @@ void xorObjectDigest(redisDb *db, robj *keyobj, unsigned char *digest, robj *o)
streamIteratorStop(&si); streamIteratorStop(&si);
} else if (o->type == OBJ_MODULE) { } else if (o->type == OBJ_MODULE) {
RedisModuleDigest md; RedisModuleDigest md;
moduleValue *mv = o->ptr; moduleValue *mv = ptrFromObj(o);
moduleType *mt = mv->type; moduleType *mt = mv->type;
moduleInitDigestContext(md); moduleInitDigestContext(md);
if (mt->digest) { if (mt->digest) {
@ -298,7 +298,7 @@ void computeDatasetDigest(unsigned char *final) {
} }
void debugCommand(client *c) { void debugCommand(client *c) {
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = { const char *help[] = {
"ASSERT -- Crash by assertion failed.", "ASSERT -- Crash by assertion failed.",
"CHANGE-REPL-ID -- Change the replication IDs of the instance. Dangerous, should be used only for testing the replication subsystem.", "CHANGE-REPL-ID -- Change the replication IDs of the instance. Dangerous, should be used only for testing the replication subsystem.",
@ -326,12 +326,12 @@ void debugCommand(client *c) {
NULL NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (!strcasecmp(c->argv[1]->ptr,"segfault")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"segfault")) {
*((char*)-1) = 'x'; *((char*)-1) = 'x';
} else if (!strcasecmp(c->argv[1]->ptr,"panic")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"panic")) {
serverPanic("DEBUG PANIC called at Unix time %ld", time(NULL)); serverPanic("DEBUG PANIC called at Unix time %ld", time(NULL));
} else if (!strcasecmp(c->argv[1]->ptr,"restart") || } else if (!strcasecmp(ptrFromObj(c->argv[1]),"restart") ||
!strcasecmp(c->argv[1]->ptr,"crash-and-recover")) !strcasecmp(ptrFromObj(c->argv[1]),"crash-and-recover"))
{ {
long long delay = 0; long long delay = 0;
if (c->argc >= 3) { if (c->argc >= 3) {
@ -339,21 +339,21 @@ NULL
!= C_OK) return; != C_OK) return;
if (delay < 0) delay = 0; if (delay < 0) delay = 0;
} }
int flags = !strcasecmp(c->argv[1]->ptr,"restart") ? int flags = !strcasecmp(ptrFromObj(c->argv[1]),"restart") ?
(RESTART_SERVER_GRACEFULLY|RESTART_SERVER_CONFIG_REWRITE) : (RESTART_SERVER_GRACEFULLY|RESTART_SERVER_CONFIG_REWRITE) :
RESTART_SERVER_NONE; RESTART_SERVER_NONE;
restartServer(flags,delay); restartServer(flags,delay);
addReplyError(c,"failed to restart the server. Check server logs."); addReplyError(c,"failed to restart the server. Check server logs.");
} else if (!strcasecmp(c->argv[1]->ptr,"oom")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"oom")) {
void *ptr = zmalloc(ULONG_MAX, MALLOC_LOCAL); /* Should trigger an out of memory. */ void *ptr = zmalloc(ULONG_MAX, MALLOC_LOCAL); /* Should trigger an out of memory. */
zfree(ptr); zfree(ptr);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"assert")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"assert")) {
serverAssertWithInfo(c,c->argv[0],1 == 2); serverAssertWithInfo(c,c->argv[0],1 == 2);
} else if (!strcasecmp(c->argv[1]->ptr,"log") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"log") && c->argc == 3) {
serverLog(LL_WARNING, "DEBUG LOG: %s", (char*)c->argv[2]->ptr); serverLog(LL_WARNING, "DEBUG LOG: %s", (char*)ptrFromObj(c->argv[2]));
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"reload")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"reload")) {
rdbSaveInfo rsi, *rsiptr; rdbSaveInfo rsi, *rsiptr;
rsiptr = rdbPopulateSaveInfo(&rsi); rsiptr = rdbPopulateSaveInfo(&rsi);
if (rdbSave(rsiptr) != C_OK) { if (rdbSave(rsiptr) != C_OK) {
@ -370,7 +370,7 @@ NULL
} }
serverLog(LL_WARNING,"DB reloaded by DEBUG RELOAD"); serverLog(LL_WARNING,"DB reloaded by DEBUG RELOAD");
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"loadaof")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"loadaof")) {
if (server.aof_state != AOF_OFF) flushAppendOnlyFile(1); if (server.aof_state != AOF_OFF) flushAppendOnlyFile(1);
emptyDb(-1,EMPTYDB_NO_FLAGS,NULL); emptyDb(-1,EMPTYDB_NO_FLAGS,NULL);
protectClient(c); protectClient(c);
@ -383,12 +383,12 @@ NULL
server.dirty = 0; /* Prevent AOF / replication */ server.dirty = 0; /* Prevent AOF / replication */
serverLog(LL_WARNING,"Append Only File loaded by DEBUG LOADAOF"); serverLog(LL_WARNING,"Append Only File loaded by DEBUG LOADAOF");
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"object") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"object") && c->argc == 3) {
dictEntry *de; dictEntry *de;
robj *val; robj *val;
char *strenc; char *strenc;
if ((de = dictFind(c->db->pdict,c->argv[2]->ptr)) == NULL) { if ((de = dictFind(c->db->pdict,ptrFromObj(c->argv[2]))) == NULL) {
addReply(c,shared.nokeyerr); addReply(c,shared.nokeyerr);
return; return;
} }
@ -399,7 +399,7 @@ NULL
if (val->encoding == OBJ_ENCODING_QUICKLIST) { if (val->encoding == OBJ_ENCODING_QUICKLIST) {
char *nextra = extra; char *nextra = extra;
int remaining = sizeof(extra); int remaining = sizeof(extra);
quicklist *ql = val->ptr; quicklist *ql = val->m_ptr;
/* Add number of quicklist nodes */ /* Add number of quicklist nodes */
int used = snprintf(nextra, remaining, " ql_nodes:%lu", ql->len); int used = snprintf(nextra, remaining, " ql_nodes:%lu", ql->len);
nextra += used; nextra += used;
@ -435,12 +435,12 @@ NULL
(void*)val, val->refcount, (void*)val, val->refcount,
strenc, rdbSavedObjectLen(val), strenc, rdbSavedObjectLen(val),
val->lru, estimateObjectIdleTime(val)/1000, extra); val->lru, estimateObjectIdleTime(val)/1000, extra);
} else if (!strcasecmp(c->argv[1]->ptr,"sdslen") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"sdslen") && c->argc == 3) {
dictEntry *de; dictEntry *de;
robj *val; robj *val;
sds key; sds key;
if ((de = dictFind(c->db->pdict,c->argv[2]->ptr)) == NULL) { if ((de = dictFind(c->db->pdict,ptrFromObj(c->argv[2]))) == NULL) {
addReply(c,shared.nokeyerr); addReply(c,shared.nokeyerr);
return; return;
} }
@ -456,11 +456,11 @@ NULL
(long long) sdslen(key), (long long) sdslen(key),
(long long) sdsavail(key), (long long) sdsavail(key),
(long long) sdsZmallocSize(key), (long long) sdsZmallocSize(key),
(long long) sdslen(val->ptr), (long long) sdslen(ptrFromObj(val)),
(long long) sdsavail(val->ptr), (long long) sdsavail(ptrFromObj(val)),
(long long) getStringObjectSdsUsedMemory(val)); (long long) getStringObjectSdsUsedMemory(val));
} }
} else if (!strcasecmp(c->argv[1]->ptr,"ziplist") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"ziplist") && c->argc == 3) {
robj *o; robj *o;
if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.nokeyerr)) if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.nokeyerr))
@ -469,10 +469,10 @@ NULL
if (o->encoding != OBJ_ENCODING_ZIPLIST) { if (o->encoding != OBJ_ENCODING_ZIPLIST) {
addReplyError(c,"Not an sds encoded string."); addReplyError(c,"Not an sds encoded string.");
} else { } else {
ziplistRepr(o->ptr); ziplistRepr(ptrFromObj(o));
addReplyStatus(c,"Ziplist structure printed on stdout"); addReplyStatus(c,"Ziplist structure printed on stdout");
} }
} else if (!strcasecmp(c->argv[1]->ptr,"populate") && } else if (!strcasecmp(ptrFromObj(c->argv[1]),"populate") &&
c->argc >= 3 && c->argc <= 5) { c->argc >= 3 && c->argc <= 5) {
long keys, j; long keys, j;
robj *key, *val; robj *key, *val;
@ -484,7 +484,7 @@ NULL
for (j = 0; j < keys; j++) { for (j = 0; j < keys; j++) {
long valsize = 0; long valsize = 0;
snprintf(buf,sizeof(buf),"%s:%lu", snprintf(buf,sizeof(buf),"%s:%lu",
(c->argc == 3) ? "key" : (char*)c->argv[3]->ptr, j); (c->argc == 3) ? "key" : (char*)ptrFromObj(c->argv[3]), j);
key = createStringObject(buf,strlen(buf)); key = createStringObject(buf,strlen(buf));
if (c->argc == 5) if (c->argc == 5)
if (getLongFromObjectOrReply(c, c->argv[4], &valsize, NULL) != C_OK) if (getLongFromObjectOrReply(c, c->argv[4], &valsize, NULL) != C_OK)
@ -499,14 +499,14 @@ NULL
else { else {
int buflen = strlen(buf); int buflen = strlen(buf);
val = createStringObject(NULL,valsize); val = createStringObject(NULL,valsize);
memcpy(val->ptr, buf, valsize<=buflen? valsize: buflen); memcpy(ptrFromObj(val), buf, valsize<=buflen? valsize: buflen);
} }
dbAdd(c->db,key,val); dbAdd(c->db,key,val);
signalModifiedKey(c->db,key); signalModifiedKey(c->db,key);
decrRefCount(key); decrRefCount(key);
} }
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"digest") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"digest") && c->argc == 2) {
/* DEBUG DIGEST (form without keys specified) */ /* DEBUG DIGEST (form without keys specified) */
unsigned char digest[20]; unsigned char digest[20];
sds d = sdsempty(); sds d = sdsempty();
@ -515,7 +515,7 @@ NULL
for (int i = 0; i < 20; i++) d = sdscatprintf(d, "%02x",digest[i]); for (int i = 0; i < 20; i++) d = sdscatprintf(d, "%02x",digest[i]);
addReplyStatus(c,d); addReplyStatus(c,d);
sdsfree(d); sdsfree(d);
} else if (!strcasecmp(c->argv[1]->ptr,"digest-value") && c->argc >= 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"digest-value") && c->argc >= 2) {
/* DEBUG DIGEST-VALUE key key key ... key. */ /* DEBUG DIGEST-VALUE key key key ... key. */
addReplyArrayLen(c,c->argc-2); addReplyArrayLen(c,c->argc-2);
for (int j = 2; j < c->argc; j++) { for (int j = 2; j < c->argc; j++) {
@ -529,10 +529,10 @@ NULL
addReplyStatus(c,d); addReplyStatus(c,d);
sdsfree(d); sdsfree(d);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"protocol") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"protocol") && c->argc == 3) {
/* DEBUG PROTOCOL [string|integer|double|bignum|null|array|set|map| /* DEBUG PROTOCOL [string|integer|double|bignum|null|array|set|map|
* attrib|push|verbatim|true|false|state|err|bloberr] */ * attrib|push|verbatim|true|false|state|err|bloberr] */
char *name = c->argv[2]->ptr; char *name = ptrFromObj(c->argv[2]);
if (!strcasecmp(name,"string")) { if (!strcasecmp(name,"string")) {
addReplyBulkCString(c,"Hello World"); addReplyBulkCString(c,"Hello World");
} else if (!strcasecmp(name,"integer")) { } else if (!strcasecmp(name,"integer")) {
@ -581,8 +581,8 @@ NULL
} else { } else {
addReplyError(c,"Wrong protocol type name. Please use one of the following: string|integer|double|bignum|null|array|set|map|attrib|push|verbatim|true|false|state|err|bloberr"); addReplyError(c,"Wrong protocol type name. Please use one of the following: string|integer|double|bignum|null|array|set|map|attrib|push|verbatim|true|false|state|err|bloberr");
} }
} else if (!strcasecmp(c->argv[1]->ptr,"sleep") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"sleep") && c->argc == 3) {
double dtime = strtod(c->argv[2]->ptr,NULL); double dtime = strtod(ptrFromObj(c->argv[2]),NULL);
long long utime = dtime*1000000; long long utime = dtime*1000000;
struct timespec tv; struct timespec tv;
@ -590,24 +590,24 @@ NULL
tv.tv_nsec = (utime % 1000000) * 1000; tv.tv_nsec = (utime % 1000000) * 1000;
nanosleep(&tv, NULL); nanosleep(&tv, NULL);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"set-active-expire") && } else if (!strcasecmp(ptrFromObj(c->argv[1]),"set-active-expire") &&
c->argc == 3) c->argc == 3)
{ {
server.active_expire_enabled = atoi(c->argv[2]->ptr); server.active_expire_enabled = atoi(ptrFromObj(c->argv[2]));
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"lua-always-replicate-commands") && } else if (!strcasecmp(ptrFromObj(c->argv[1]),"lua-always-replicate-commands") &&
c->argc == 3) c->argc == 3)
{ {
server.lua_always_replicate_commands = atoi(c->argv[2]->ptr); server.lua_always_replicate_commands = atoi(ptrFromObj(c->argv[2]));
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"error") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"error") && c->argc == 3) {
sds errstr = sdsnewlen("-",1); sds errstr = sdsnewlen("-",1);
errstr = sdscatsds(errstr,c->argv[2]->ptr); errstr = sdscatsds(errstr,ptrFromObj(c->argv[2]));
errstr = sdsmapchars(errstr,"\n\r"," ",2); /* no newlines in errors. */ errstr = sdsmapchars(errstr,"\n\r"," ",2); /* no newlines in errors. */
errstr = sdscatlen(errstr,"\r\n",2); errstr = sdscatlen(errstr,"\r\n",2);
addReplySds(c,errstr); addReplySds(c,errstr);
} else if (!strcasecmp(c->argv[1]->ptr,"structsize") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"structsize") && c->argc == 2) {
sds sizes = sdsempty(); sds sizes = sdsempty();
sizes = sdscatprintf(sizes,"bits:%d ",(sizeof(void*) == 8)?64:32); sizes = sdscatprintf(sizes,"bits:%d ",(sizeof(void*) == 8)?64:32);
sizes = sdscatprintf(sizes,"robj:%d ",(int)sizeof(robj)); sizes = sdscatprintf(sizes,"robj:%d ",(int)sizeof(robj));
@ -618,7 +618,7 @@ NULL
sizes = sdscatprintf(sizes,"sdshdr32:%d ",(int)sizeof(struct sdshdr32)); sizes = sdscatprintf(sizes,"sdshdr32:%d ",(int)sizeof(struct sdshdr32));
sizes = sdscatprintf(sizes,"sdshdr64:%d ",(int)sizeof(struct sdshdr64)); sizes = sdscatprintf(sizes,"sdshdr64:%d ",(int)sizeof(struct sdshdr64));
addReplyBulkSds(c,sizes); addReplyBulkSds(c,sizes);
} else if (!strcasecmp(c->argv[1]->ptr,"htstats") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"htstats") && c->argc == 3) {
long dbid; long dbid;
sds stats = sdsempty(); sds stats = sdsempty();
char buf[4096]; char buf[4096];
@ -639,7 +639,7 @@ NULL
stats = sdscat(stats,buf); stats = sdscat(stats,buf);
addReplyBulkSds(c,stats); addReplyBulkSds(c,stats);
} else if (!strcasecmp(c->argv[1]->ptr,"htstats-key") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"htstats-key") && c->argc == 3) {
robj *o; robj *o;
dict *ht = NULL; dict *ht = NULL;
@ -650,12 +650,12 @@ NULL
switch (o->encoding) { switch (o->encoding) {
case OBJ_ENCODING_SKIPLIST: case OBJ_ENCODING_SKIPLIST:
{ {
zset *zs = o->ptr; zset *zs = ptrFromObj(o);
ht = zs->pdict; ht = zs->pdict;
} }
break; break;
case OBJ_ENCODING_HT: case OBJ_ENCODING_HT:
ht = o->ptr; ht = ptrFromObj(o);
break; break;
} }
@ -667,12 +667,12 @@ NULL
dictGetStats(buf,sizeof(buf),ht); dictGetStats(buf,sizeof(buf),ht);
addReplyBulkCString(c,buf); addReplyBulkCString(c,buf);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"change-repl-id") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"change-repl-id") && c->argc == 2) {
serverLog(LL_WARNING,"Changing replication IDs after receiving DEBUG change-repl-id"); serverLog(LL_WARNING,"Changing replication IDs after receiving DEBUG change-repl-id");
changeReplicationId(); changeReplicationId();
clearReplicationId2(); clearReplicationId2();
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"stringmatch-test") && c->argc == 2) } else if (!strcasecmp(ptrFromObj(c->argv[1]),"stringmatch-test") && c->argc == 2)
{ {
stringmatchlen_fuzz_test(); stringmatchlen_fuzz_test();
addReplyStatus(c,"Apparently Redis did not crash: test passed"); addReplyStatus(c,"Apparently Redis did not crash: test passed");
@ -710,7 +710,7 @@ void _serverAssertPrintClientInfo(const client *c) {
char *arg; char *arg;
if (c->argv[j]->type == OBJ_STRING && sdsEncodedObject(c->argv[j])) { if (c->argv[j]->type == OBJ_STRING && sdsEncodedObject(c->argv[j])) {
arg = (char*) c->argv[j]->ptr; arg = (char*) ptrFromObj(c->argv[j]);
} else { } else {
snprintf(buf,sizeof(buf),"Object type: %u, encoding: %u", snprintf(buf,sizeof(buf),"Object type: %u, encoding: %u",
c->argv[j]->type, c->argv[j]->encoding); c->argv[j]->type, c->argv[j]->encoding);
@ -726,9 +726,9 @@ void serverLogObjectDebugInfo(const robj *o) {
serverLog(LL_WARNING,"Object encoding: %d", o->encoding); serverLog(LL_WARNING,"Object encoding: %d", o->encoding);
serverLog(LL_WARNING,"Object refcount: %d", o->refcount); serverLog(LL_WARNING,"Object refcount: %d", o->refcount);
if (o->type == OBJ_STRING && sdsEncodedObject(o)) { if (o->type == OBJ_STRING && sdsEncodedObject(o)) {
serverLog(LL_WARNING,"Object raw string len: %zu", sdslen(o->ptr)); serverLog(LL_WARNING,"Object raw string len: %zu", sdslen(ptrFromObj(o)));
if (sdslen(o->ptr) < 4096) { if (sdslen(ptrFromObj(o)) < 4096) {
sds repr = sdscatrepr(sdsempty(),o->ptr,sdslen(o->ptr)); sds repr = sdscatrepr(sdsempty(),ptrFromObj(o),sdslen(ptrFromObj(o)));
serverLog(LL_WARNING,"Object raw string content: %s", repr); serverLog(LL_WARNING,"Object raw string content: %s", repr);
sdsfree(repr); sdsfree(repr);
} }
@ -741,7 +741,7 @@ void serverLogObjectDebugInfo(const robj *o) {
} else if (o->type == OBJ_ZSET) { } else if (o->type == OBJ_ZSET) {
serverLog(LL_WARNING,"Sorted set size: %d", (int) zsetLength(o)); serverLog(LL_WARNING,"Sorted set size: %d", (int) zsetLength(o));
if (o->encoding == OBJ_ENCODING_SKIPLIST) if (o->encoding == OBJ_ENCODING_SKIPLIST)
serverLog(LL_WARNING,"Skiplist level: %d", (int) ((const zset*)o->ptr)->zsl->level); serverLog(LL_WARNING,"Skiplist level: %d", (int) ((const zset*)ptrFromObj(o))->zsl->level);
} }
} }
@ -1182,7 +1182,7 @@ void logCurrentClient(void) {
decoded = getDecodedObject(cc->argv[j]); decoded = getDecodedObject(cc->argv[j]);
serverLog(LL_WARNING|LL_RAW,"argv[%d]: '%s'\n", j, serverLog(LL_WARNING|LL_RAW,"argv[%d]: '%s'\n", j,
(char*)decoded->ptr); (char*)ptrFromObj(decoded));
decrRefCount(decoded); decrRefCount(decoded);
} }
/* Check if the first argument, usually a key, is found inside the /* Check if the first argument, usually a key, is found inside the
@ -1192,10 +1192,10 @@ void logCurrentClient(void) {
dictEntry *de; dictEntry *de;
key = getDecodedObject(cc->argv[1]); key = getDecodedObject(cc->argv[1]);
de = dictFind(cc->db->pdict, key->ptr); de = dictFind(cc->db->pdict, ptrFromObj(key));
if (de) { if (de) {
val = dictGetVal(de); val = dictGetVal(de);
serverLog(LL_WARNING,"key '%s' found in DB containing the following object:", (char*)key->ptr); serverLog(LL_WARNING,"key '%s' found in DB containing the following object:", (char*)ptrFromObj(key));
serverLogObjectDebugInfo(val); serverLogObjectDebugInfo(val);
} }
decrRefCount(key); decrRefCount(key);

View File

@ -355,13 +355,13 @@ void rememberSlaveKeyWithExpire(redisDb *db, robj *key) {
} }
if (db->id > 63) return; if (db->id > 63) return;
dictEntry *de = dictAddOrFind(slaveKeysWithExpire,key->ptr); dictEntry *de = dictAddOrFind(slaveKeysWithExpire,ptrFromObj(key));
/* If the entry was just created, set it to a copy of the SDS string /* If the entry was just created, set it to a copy of the SDS string
* representing the key: we don't want to need to take those keys * representing the key: we don't want to need to take those keys
* in sync with the main DB. The keys will be removed by expireSlaveKeys() * in sync with the main DB. The keys will be removed by expireSlaveKeys()
* as it scans to find keys to remove. */ * as it scans to find keys to remove. */
if (de->key == key->ptr) { if (de->key == ptrFromObj(key)) {
de->key = sdsdup(key->ptr); de->key = sdsdup(ptrFromObj(key));
dictSetUnsignedIntegerVal(de,0); dictSetUnsignedIntegerVal(de,0);
} }

View File

@ -113,7 +113,7 @@ int extractLongLatOrReply(client *c, robj **argv, double *xy) {
int longLatFromMember(robj *zobj, robj *member, double *xy) { int longLatFromMember(robj *zobj, robj *member, double *xy) {
double score = 0; double score = 0;
if (zsetScore(zobj, member->ptr, &score) == C_ERR) return C_ERR; if (zsetScore(zobj, ptrFromObj(member), &score) == C_ERR) return C_ERR;
if (!decodeGeohash(score, xy)) return C_ERR; if (!decodeGeohash(score, xy)) return C_ERR;
return C_OK; return C_OK;
} }
@ -125,7 +125,7 @@ int longLatFromMember(robj *zobj, robj *member, double *xy) {
* If the unit is not valid, an error is reported to the client, and a value * If the unit is not valid, an error is reported to the client, and a value
* less than zero is returned. */ * less than zero is returned. */
double extractUnitOrReply(client *c, robj *unit) { double extractUnitOrReply(client *c, robj *unit) {
char *u = unit->ptr; char *u = ptrFromObj(unit);
if (!strcmp(u, "m")) { if (!strcmp(u, "m")) {
return 1; return 1;
@ -230,7 +230,7 @@ int geoGetPointsInRange(robj *zobj, double min, double max, double lon, double l
sds member; sds member;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr; unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
unsigned char *vstr = NULL; unsigned char *vstr = NULL;
unsigned int vlen = 0; unsigned int vlen = 0;
@ -259,7 +259,7 @@ int geoGetPointsInRange(robj *zobj, double min, double max, double lon, double l
zzlNext(zl, &eptr, &sptr); zzlNext(zl, &eptr, &sptr);
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
zskiplistNode *ln; zskiplistNode *ln;
@ -504,7 +504,7 @@ void georadiusGeneric(client *c, int flags) {
if (c->argc > base_args) { if (c->argc > base_args) {
int remaining = c->argc - base_args; int remaining = c->argc - base_args;
for (int i = 0; i < remaining; i++) { for (int i = 0; i < remaining; i++) {
char *arg = c->argv[base_args + i]->ptr; char *arg = ptrFromObj(c->argv[base_args + i]);
if (!strcasecmp(arg, "withdist")) { if (!strcasecmp(arg, "withdist")) {
withdist = 1; withdist = 1;
} else if (!strcasecmp(arg, "withhash")) { } else if (!strcasecmp(arg, "withhash")) {
@ -639,7 +639,7 @@ void georadiusGeneric(client *c, int flags) {
if (returned_items) { if (returned_items) {
zobj = createZsetObject(); zobj = createZsetObject();
zs = zobj->ptr; zs = zobj->m_ptr;
} }
for (i = 0; i < returned_items; i++) { for (i = 0; i < returned_items; i++) {
@ -709,7 +709,7 @@ void geohashCommand(client *c) {
addReplyArrayLen(c,c->argc-2); addReplyArrayLen(c,c->argc-2);
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
double score; double score;
if (!zobj || zsetScore(zobj, c->argv[j]->ptr, &score) == C_ERR) { if (!zobj || zsetScore(zobj, ptrFromObj(c->argv[j]), &score) == C_ERR) {
addReplyNull(c); addReplyNull(c);
} else { } else {
/* The internal format we use for geocoding is a bit different /* The internal format we use for geocoding is a bit different
@ -762,7 +762,7 @@ void geoposCommand(client *c) {
addReplyArrayLen(c,c->argc-2); addReplyArrayLen(c,c->argc-2);
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
double score; double score;
if (!zobj || zsetScore(zobj, c->argv[j]->ptr, &score) == C_ERR) { if (!zobj || zsetScore(zobj, ptrFromObj(c->argv[j]), &score) == C_ERR) {
addReplyNullArray(c); addReplyNullArray(c);
} else { } else {
/* Decode... */ /* Decode... */
@ -802,8 +802,8 @@ void geodistCommand(client *c) {
/* Get the scores. We need both otherwise NULL is returned. */ /* Get the scores. We need both otherwise NULL is returned. */
double score1, score2, xyxy[4]; double score1, score2, xyxy[4];
if (zsetScore(zobj, c->argv[2]->ptr, &score1) == C_ERR || if (zsetScore(zobj, ptrFromObj(c->argv[2]), &score1) == C_ERR ||
zsetScore(zobj, c->argv[3]->ptr, &score2) == C_ERR) zsetScore(zobj, ptrFromObj(c->argv[3]), &score2) == C_ERR)
{ {
addReplyNull(c); addReplyNull(c);
return; return;

View File

@ -582,7 +582,7 @@ void hllDenseRegHisto(uint8_t *registers, int* reghisto) {
* The function returns C_OK if the sparse representation was valid, * The function returns C_OK if the sparse representation was valid,
* otherwise C_ERR is returned if the representation was corrupted. */ * otherwise C_ERR is returned if the representation was corrupted. */
int hllSparseToDense(robj *o) { int hllSparseToDense(robj *o) {
sds sparse = o->ptr, dense; sds sparse = ptrFromObj(o), dense;
struct hllhdr *hdr, *oldhdr = (struct hllhdr*)sparse; struct hllhdr *hdr, *oldhdr = (struct hllhdr*)sparse;
int idx = 0, runlen, regval; int idx = 0, runlen, regval;
uint8_t *p = (uint8_t*)sparse, *end = p+sdslen(sparse); uint8_t *p = (uint8_t*)sparse, *end = p+sdslen(sparse);
@ -630,8 +630,8 @@ int hllSparseToDense(robj *o) {
} }
/* Free the old representation and set the new one. */ /* Free the old representation and set the new one. */
sdsfree(o->ptr); sdsfree(ptrFromObj(o));
o->ptr = dense; o->m_ptr = dense;
return C_OK; return C_OK;
} }
@ -665,12 +665,12 @@ int hllSparseSet(robj *o, long index, uint8_t count) {
* into XZERO-VAL-XZERO). Make sure there is enough space right now * into XZERO-VAL-XZERO). Make sure there is enough space right now
* so that the pointers we take during the execution of the function * so that the pointers we take during the execution of the function
* will be valid all the time. */ * will be valid all the time. */
o->ptr = sdsMakeRoomFor(o->ptr,3); o->m_ptr = sdsMakeRoomFor(ptrFromObj(o),3);
/* Step 1: we need to locate the opcode we need to modify to check /* Step 1: we need to locate the opcode we need to modify to check
* if a value update is actually needed. */ * if a value update is actually needed. */
sparse = p = ((uint8_t*)o->ptr) + HLL_HDR_SIZE; sparse = p = ((uint8_t*)ptrFromObj(o)) + HLL_HDR_SIZE;
end = p + sdslen(o->ptr) - HLL_HDR_SIZE; end = p + sdslen(ptrFromObj(o)) - HLL_HDR_SIZE;
first = 0; first = 0;
prev = NULL; /* Points to previous opcode at the end of the loop. */ prev = NULL; /* Points to previous opcode at the end of the loop. */
@ -828,9 +828,9 @@ int hllSparseSet(robj *o, long index, uint8_t count) {
int deltalen = seqlen-oldlen; int deltalen = seqlen-oldlen;
if (deltalen > 0 && if (deltalen > 0 &&
sdslen(o->ptr)+deltalen > server.hll_sparse_max_bytes) goto promote; sdslen(ptrFromObj(o))+deltalen > server.hll_sparse_max_bytes) goto promote;
if (deltalen && next) memmove(next+deltalen,next,end-next); if (deltalen && next) memmove(next+deltalen,next,end-next);
sdsIncrLen(o->ptr,deltalen); sdsIncrLen(ptrFromObj(o),deltalen);
memcpy(p,seq,seqlen); memcpy(p,seq,seqlen);
end += deltalen; end += deltalen;
@ -860,7 +860,7 @@ updated:
if (len <= HLL_SPARSE_VAL_MAX_LEN) { if (len <= HLL_SPARSE_VAL_MAX_LEN) {
HLL_SPARSE_VAL_SET(p+1,v1,len); HLL_SPARSE_VAL_SET(p+1,v1,len);
memmove(p,p+1,end-p); memmove(p,p+1,end-p);
sdsIncrLen(o->ptr,-1); sdsIncrLen(ptrFromObj(o),-1);
end--; end--;
/* After a merge we reiterate without incrementing 'p' /* After a merge we reiterate without incrementing 'p'
* in order to try to merge the just merged value with * in order to try to merge the just merged value with
@ -873,13 +873,13 @@ updated:
} }
/* Invalidate the cached cardinality. */ /* Invalidate the cached cardinality. */
hdr = o->ptr; hdr = ptrFromObj(o);
HLL_INVALIDATE_CACHE(hdr); HLL_INVALIDATE_CACHE(hdr);
return 1; return 1;
promote: /* Promote to dense representation. */ promote: /* Promote to dense representation. */
if (hllSparseToDense(o) == C_ERR) return -1; /* Corrupted HLL. */ if (hllSparseToDense(o) == C_ERR) return -1; /* Corrupted HLL. */
hdr = o->ptr; hdr = ptrFromObj(o);
/* We need to call hllDenseAdd() to perform the operation after the /* We need to call hllDenseAdd() to perform the operation after the
* conversion. However the result must be 1, since if we need to * conversion. However the result must be 1, since if we need to
@ -1043,7 +1043,7 @@ uint64_t hllCount(struct hllhdr *hdr, int *invalid) {
/* Call hllDenseAdd() or hllSparseAdd() according to the HLL encoding. */ /* Call hllDenseAdd() or hllSparseAdd() according to the HLL encoding. */
int hllAdd(robj *o, unsigned char *ele, size_t elesize) { int hllAdd(robj *o, unsigned char *ele, size_t elesize) {
struct hllhdr *hdr = o->ptr; struct hllhdr *hdr = ptrFromObj(o);
switch(hdr->encoding) { switch(hdr->encoding) {
case HLL_DENSE: return hllDenseAdd(hdr->registers,ele,elesize); case HLL_DENSE: return hllDenseAdd(hdr->registers,ele,elesize);
case HLL_SPARSE: return hllSparseAdd(o,ele,elesize); case HLL_SPARSE: return hllSparseAdd(o,ele,elesize);
@ -1060,7 +1060,7 @@ int hllAdd(robj *o, unsigned char *ele, size_t elesize) {
* If the HyperLogLog is sparse and is found to be invalid, C_ERR * If the HyperLogLog is sparse and is found to be invalid, C_ERR
* is returned, otherwise the function always succeeds. */ * is returned, otherwise the function always succeeds. */
int hllMerge(uint8_t *max, robj *hll) { int hllMerge(uint8_t *max, robj *hll) {
struct hllhdr *hdr = hll->ptr; struct hllhdr *hdr = ptrFromObj(hll);
int i; int i;
if (hdr->encoding == HLL_DENSE) { if (hdr->encoding == HLL_DENSE) {
@ -1071,7 +1071,7 @@ int hllMerge(uint8_t *max, robj *hll) {
if (val > max[i]) max[i] = val; if (val > max[i]) max[i] = val;
} }
} else { } else {
uint8_t *p = hll->ptr, *end = p + sdslen(hll->ptr); uint8_t *p = ptrFromObj(hll), *end = p + sdslen(ptrFromObj(hll));
long runlen, regval; long runlen, regval;
p += HLL_HDR_SIZE; p += HLL_HDR_SIZE;
@ -1130,7 +1130,7 @@ robj *createHLLObject(void) {
/* Create the actual object. */ /* Create the actual object. */
o = createObject(OBJ_STRING,s); o = createObject(OBJ_STRING,s);
hdr = o->ptr; hdr = ptrFromObj(o);
memcpy(hdr->magic,"HYLL",4); memcpy(hdr->magic,"HYLL",4);
hdr->encoding = HLL_SPARSE; hdr->encoding = HLL_SPARSE;
return o; return o;
@ -1148,7 +1148,7 @@ int isHLLObjectOrReply(client *c, robj *o) {
if (!sdsEncodedObject(o)) goto invalid; if (!sdsEncodedObject(o)) goto invalid;
if (stringObjectLen(o) < sizeof(*hdr)) goto invalid; if (stringObjectLen(o) < sizeof(*hdr)) goto invalid;
hdr = o->ptr; hdr = ptrFromObj(o);
/* Magic should be "HYLL". */ /* Magic should be "HYLL". */
if (hdr->magic[0] != 'H' || hdr->magic[1] != 'Y' || if (hdr->magic[0] != 'H' || hdr->magic[1] != 'Y' ||
@ -1189,8 +1189,8 @@ void pfaddCommand(client *c) {
} }
/* Perform the low level ADD operation for every element. */ /* Perform the low level ADD operation for every element. */
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
int retval = hllAdd(o, (unsigned char*)c->argv[j]->ptr, int retval = hllAdd(o, (unsigned char*)ptrFromObj(c->argv[j]),
sdslen(c->argv[j]->ptr)); sdslen(ptrFromObj(c->argv[j])));
switch(retval) { switch(retval) {
case 1: case 1:
updated++; updated++;
@ -1200,7 +1200,7 @@ void pfaddCommand(client *c) {
return; return;
} }
} }
hdr = o->ptr; hdr = ptrFromObj(o);
if (updated) { if (updated) {
signalModifiedKey(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[1]);
notifyKeyspaceEvent(NOTIFY_STRING,"pfadd",c->argv[1],c->db->id); notifyKeyspaceEvent(NOTIFY_STRING,"pfadd",c->argv[1],c->db->id);
@ -1262,7 +1262,7 @@ void pfcountCommand(client *c) {
o = dbUnshareStringValue(c->db,c->argv[1],o); o = dbUnshareStringValue(c->db,c->argv[1],o);
/* Check if the cached cardinality is valid. */ /* Check if the cached cardinality is valid. */
hdr = o->ptr; hdr = ptrFromObj(o);
if (HLL_VALID_CACHE(hdr)) { if (HLL_VALID_CACHE(hdr)) {
/* Just return the cached value. */ /* Just return the cached value. */
card = (uint64_t)hdr->card[0]; card = (uint64_t)hdr->card[0];
@ -1319,7 +1319,7 @@ void pfmergeCommand(client *c) {
/* If at least one involved HLL is dense, use the dense representation /* If at least one involved HLL is dense, use the dense representation
* as target ASAP to save time and avoid the conversion step. */ * as target ASAP to save time and avoid the conversion step. */
hdr = o->ptr; hdr = ptrFromObj(o);
if (hdr->encoding == HLL_DENSE) use_dense = 1; if (hdr->encoding == HLL_DENSE) use_dense = 1;
/* Merge with this HLL with our 'max' HHL by setting max[i] /* Merge with this HLL with our 'max' HHL by setting max[i]
@ -1356,13 +1356,13 @@ void pfmergeCommand(client *c) {
* invalidate the cached value. */ * invalidate the cached value. */
for (j = 0; j < HLL_REGISTERS; j++) { for (j = 0; j < HLL_REGISTERS; j++) {
if (max[j] == 0) continue; if (max[j] == 0) continue;
hdr = o->ptr; hdr = ptrFromObj(o);
switch(hdr->encoding) { switch(hdr->encoding) {
case HLL_DENSE: hllDenseSet(hdr->registers,j,max[j]); break; case HLL_DENSE: hllDenseSet(hdr->registers,j,max[j]); break;
case HLL_SPARSE: hllSparseSet(o,j,max[j]); break; case HLL_SPARSE: hllSparseSet(o,j,max[j]); break;
} }
} }
hdr = o->ptr; /* o->ptr may be different now, as a side effect of hdr = ptrFromObj(o); /* ptrFromObj(o) may be different now, as a side effect of
last hllSparseSet() call. */ last hllSparseSet() call. */
HLL_INVALIDATE_CACHE(hdr); HLL_INVALIDATE_CACHE(hdr);
@ -1438,7 +1438,7 @@ void pfselftestCommand(client *c) {
/* Make sure that for small cardinalities we use sparse /* Make sure that for small cardinalities we use sparse
* encoding. */ * encoding. */
if (j == checkpoint && j < server.hll_sparse_max_bytes/2) { if (j == checkpoint && j < server.hll_sparse_max_bytes/2) {
hdr2 = o->ptr; hdr2 = ptrFromObj(o);
if (hdr2->encoding != HLL_SPARSE) { if (hdr2->encoding != HLL_SPARSE) {
addReplyError(c, "TESTFAILED sparse encoding not used"); addReplyError(c, "TESTFAILED sparse encoding not used");
goto cleanup; goto cleanup;
@ -1446,7 +1446,7 @@ void pfselftestCommand(client *c) {
} }
/* Check that dense and sparse representations agree. */ /* Check that dense and sparse representations agree. */
if (j == checkpoint && hllCount(hdr,NULL) != hllCount(o->ptr,NULL)) { if (j == checkpoint && hllCount(hdr,NULL) != hllCount(ptrFromObj(o),NULL)) {
addReplyError(c, "TESTFAILED dense/sparse disagree"); addReplyError(c, "TESTFAILED dense/sparse disagree");
goto cleanup; goto cleanup;
} }
@ -1485,7 +1485,7 @@ cleanup:
/* PFDEBUG <subcommand> <key> ... args ... /* PFDEBUG <subcommand> <key> ... args ...
* Different debugging related operations about the HLL implementation. */ * Different debugging related operations about the HLL implementation. */
void pfdebugCommand(client *c) { void pfdebugCommand(client *c) {
char *cmd = c->argv[1]->ptr; char *cmd = ptrFromObj(c->argv[1]);
struct hllhdr *hdr; struct hllhdr *hdr;
robj *o; robj *o;
int j; int j;
@ -1497,7 +1497,7 @@ void pfdebugCommand(client *c) {
} }
if (isHLLObjectOrReply(c,o) != C_OK) return; if (isHLLObjectOrReply(c,o) != C_OK) return;
o = dbUnshareStringValue(c->db,c->argv[2],o); o = dbUnshareStringValue(c->db,c->argv[2],o);
hdr = o->ptr; hdr = ptrFromObj(o);
/* PFDEBUG GETREG <key> */ /* PFDEBUG GETREG <key> */
if (!strcasecmp(cmd,"getreg")) { if (!strcasecmp(cmd,"getreg")) {
@ -1511,7 +1511,7 @@ void pfdebugCommand(client *c) {
server.dirty++; /* Force propagation on encoding change. */ server.dirty++; /* Force propagation on encoding change. */
} }
hdr = o->ptr; hdr = ptrFromObj(o);
addReplyArrayLen(c,HLL_REGISTERS); addReplyArrayLen(c,HLL_REGISTERS);
for (j = 0; j < HLL_REGISTERS; j++) { for (j = 0; j < HLL_REGISTERS; j++) {
uint8_t val; uint8_t val;
@ -1524,7 +1524,7 @@ void pfdebugCommand(client *c) {
else if (!strcasecmp(cmd,"decode")) { else if (!strcasecmp(cmd,"decode")) {
if (c->argc != 3) goto arityerr; if (c->argc != 3) goto arityerr;
uint8_t *p = o->ptr, *end = p+sdslen(o->ptr); uint8_t *p = ptrFromObj(o), *end = p+sdslen(ptrFromObj(o));
sds decoded = sdsempty(); sds decoded = sdsempty();
if (hdr->encoding != HLL_SPARSE) { if (hdr->encoding != HLL_SPARSE) {

View File

@ -579,21 +579,21 @@ NULL
}; };
struct latencyTimeSeries *ts; struct latencyTimeSeries *ts;
if (!strcasecmp(c->argv[1]->ptr,"history") && c->argc == 3) { if (!strcasecmp(ptrFromObj(c->argv[1]),"history") && c->argc == 3) {
/* LATENCY HISTORY <event> */ /* LATENCY HISTORY <event> */
ts = dictFetchValue(server.latency_events,c->argv[2]->ptr); ts = dictFetchValue(server.latency_events,ptrFromObj(c->argv[2]));
if (ts == NULL) { if (ts == NULL) {
addReplyArrayLen(c,0); addReplyArrayLen(c,0);
} else { } else {
latencyCommandReplyWithSamples(c,ts); latencyCommandReplyWithSamples(c,ts);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"graph") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"graph") && c->argc == 3) {
/* LATENCY GRAPH <event> */ /* LATENCY GRAPH <event> */
sds graph; sds graph;
dictEntry *de; dictEntry *de;
char *event; char *event;
de = dictFind(server.latency_events,c->argv[2]->ptr); de = dictFind(server.latency_events,ptrFromObj(c->argv[2]));
if (de == NULL) goto nodataerr; if (de == NULL) goto nodataerr;
ts = dictGetVal(de); ts = dictGetVal(de);
event = dictGetKey(de); event = dictGetKey(de);
@ -601,16 +601,16 @@ NULL
graph = latencyCommandGenSparkeline(event,ts); graph = latencyCommandGenSparkeline(event,ts);
addReplyBulkCString(c,graph); addReplyBulkCString(c,graph);
sdsfree(graph); sdsfree(graph);
} else if (!strcasecmp(c->argv[1]->ptr,"latest") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"latest") && c->argc == 2) {
/* LATENCY LATEST */ /* LATENCY LATEST */
latencyCommandReplyWithLatestEvents(c); latencyCommandReplyWithLatestEvents(c);
} else if (!strcasecmp(c->argv[1]->ptr,"doctor") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"doctor") && c->argc == 2) {
/* LATENCY DOCTOR */ /* LATENCY DOCTOR */
sds report = createLatencyReport(); sds report = createLatencyReport();
addReplyBulkCBuffer(c,report,sdslen(report)); addReplyBulkCBuffer(c,report,sdslen(report));
sdsfree(report); sdsfree(report);
} else if (!strcasecmp(c->argv[1]->ptr,"reset") && c->argc >= 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"reset") && c->argc >= 2) {
/* LATENCY RESET */ /* LATENCY RESET */
if (c->argc == 2) { if (c->argc == 2) {
addReplyLongLong(c,latencyResetEvent(NULL)); addReplyLongLong(c,latencyResetEvent(NULL));
@ -618,10 +618,10 @@ NULL
int j, resets = 0; int j, resets = 0;
for (j = 2; j < c->argc; j++) for (j = 2; j < c->argc; j++)
resets += latencyResetEvent(c->argv[j]->ptr); resets += latencyResetEvent(ptrFromObj(c->argv[j]));
addReplyLongLong(c,resets); addReplyLongLong(c,resets);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"help") && c->argc >= 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"help") && c->argc >= 2) {
addReplyHelp(c, help); addReplyHelp(c, help);
} else { } else {
addReplySubcommandSyntaxError(c); addReplySubcommandSyntaxError(c);
@ -632,6 +632,6 @@ nodataerr:
/* Common error when the user asks for an event we have no latency /* Common error when the user asks for an event we have no latency
* information about. */ * information about. */
addReplyErrorFormat(c, addReplyErrorFormat(c,
"No samples available for event '%s'", (char*) c->argv[2]->ptr); "No samples available for event '%s'", (char*) ptrFromObj(c->argv[2]));
} }

View File

@ -30,16 +30,16 @@ size_t lazyfreeGetPendingObjectsCount(void) {
* representing the list. */ * representing the list. */
size_t lazyfreeGetFreeEffort(robj *obj) { size_t lazyfreeGetFreeEffort(robj *obj) {
if (obj->type == OBJ_LIST) { if (obj->type == OBJ_LIST) {
quicklist *ql = obj->ptr; quicklist *ql = ptrFromObj(obj);
return ql->len; return ql->len;
} else if (obj->type == OBJ_SET && obj->encoding == OBJ_ENCODING_HT) { } else if (obj->type == OBJ_SET && obj->encoding == OBJ_ENCODING_HT) {
dict *ht = obj->ptr; dict *ht = ptrFromObj(obj);
return dictSize(ht); return dictSize(ht);
} else if (obj->type == OBJ_ZSET && obj->encoding == OBJ_ENCODING_SKIPLIST){ } else if (obj->type == OBJ_ZSET && obj->encoding == OBJ_ENCODING_SKIPLIST){
zset *zs = obj->ptr; zset *zs = ptrFromObj(obj);
return zs->zsl->length; return zs->zsl->length;
} else if (obj->type == OBJ_HASH && obj->encoding == OBJ_ENCODING_HT) { } else if (obj->type == OBJ_HASH && obj->encoding == OBJ_ENCODING_HT) {
dict *ht = obj->ptr; dict *ht = ptrFromObj(obj);
return dictSize(ht); return dictSize(ht);
} else { } else {
return 1; /* Everything else is a single allocation. */ return 1; /* Everything else is a single allocation. */
@ -54,12 +54,12 @@ size_t lazyfreeGetFreeEffort(robj *obj) {
int dbAsyncDelete(redisDb *db, robj *key) { int dbAsyncDelete(redisDb *db, robj *key) {
/* Deleting an entry from the expires dict will not free the sds of /* Deleting an entry from the expires dict will not free the sds of
* the key, because it is shared with the main dictionary. */ * the key, because it is shared with the main dictionary. */
if (dictSize(db->expires) > 0) dictDelete(db->expires,key->ptr); if (dictSize(db->expires) > 0) dictDelete(db->expires,ptrFromObj(key));
/* If the value is composed of a few allocations, to free in a lazy way /* If the value is composed of a few allocations, to free in a lazy way
* is actually just slower... So under a certain limit we just free * is actually just slower... So under a certain limit we just free
* the object synchronously. */ * the object synchronously. */
dictEntry *de = dictUnlink(db->pdict,key->ptr); dictEntry *de = dictUnlink(db->pdict,ptrFromObj(key));
if (de) { if (de) {
robj *val = dictGetVal(de); robj *val = dictGetVal(de);
size_t free_effort = lazyfreeGetFreeEffort(val); size_t free_effort = lazyfreeGetFreeEffort(val);

View File

@ -392,7 +392,7 @@ int moduleCreateEmptyKey(RedisModuleKey *key, int type) {
switch(type) { switch(type) {
case REDISMODULE_KEYTYPE_LIST: case REDISMODULE_KEYTYPE_LIST:
obj = createQuicklistObject(); obj = createQuicklistObject();
quicklistSetOptions(obj->ptr, server.list_max_ziplist_size, quicklistSetOptions(obj->m_ptr, server.list_max_ziplist_size,
server.list_compress_depth); server.list_compress_depth);
break; break;
case REDISMODULE_KEYTYPE_ZSET: case REDISMODULE_KEYTYPE_ZSET:
@ -938,8 +938,8 @@ const char *RM_StringPtrLen(const RedisModuleString *str, size_t *len) {
if (len) *len = strlen(errmsg); if (len) *len = strlen(errmsg);
return errmsg; return errmsg;
} }
if (len) *len = sdslen(str->ptr); if (len) *len = sdslen(ptrFromObj(str));
return str->ptr; return ptrFromObj(str);
} }
/* -------------------------------------------------------------------------- /* --------------------------------------------------------------------------
@ -951,7 +951,7 @@ const char *RM_StringPtrLen(const RedisModuleString *str, size_t *len) {
* as a valid, strict long long (no spaces before/after), REDISMODULE_ERR * as a valid, strict long long (no spaces before/after), REDISMODULE_ERR
* is returned. */ * is returned. */
int RM_StringToLongLong(const RedisModuleString *str, long long *ll) { int RM_StringToLongLong(const RedisModuleString *str, long long *ll) {
return string2ll(str->ptr,sdslen(str->ptr),ll) ? REDISMODULE_OK : return string2ll(ptrFromObj(str),sdslen(ptrFromObj(str)),ll) ? REDISMODULE_OK :
REDISMODULE_ERR; REDISMODULE_ERR;
} }
@ -983,11 +983,11 @@ RedisModuleString *moduleAssertUnsharedString(RedisModuleString *str) {
if (str->encoding == OBJ_ENCODING_EMBSTR) { if (str->encoding == OBJ_ENCODING_EMBSTR) {
/* Note: here we "leak" the additional allocation that was /* Note: here we "leak" the additional allocation that was
* used in order to store the embedded string in the object. */ * used in order to store the embedded string in the object. */
str->ptr = sdsnewlen(str->ptr,sdslen(str->ptr)); str->m_ptr = sdsnewlen(ptrFromObj(str),sdslen(ptrFromObj(str)));
str->encoding = OBJ_ENCODING_RAW; str->encoding = OBJ_ENCODING_RAW;
} else if (str->encoding == OBJ_ENCODING_INT) { } else if (str->encoding == OBJ_ENCODING_INT) {
/* Convert the string from integer to raw encoding. */ /* Convert the string from integer to raw encoding. */
str->ptr = sdsfromlonglong((long)str->ptr); str->m_ptr = sdsfromlonglong((long)str->m_ptr);
str->encoding = OBJ_ENCODING_RAW; str->encoding = OBJ_ENCODING_RAW;
} }
return str; return str;
@ -1000,7 +1000,7 @@ int RM_StringAppendBuffer(RedisModuleCtx *ctx, RedisModuleString *str, const cha
UNUSED(ctx); UNUSED(ctx);
str = moduleAssertUnsharedString(str); str = moduleAssertUnsharedString(str);
if (str == NULL) return REDISMODULE_ERR; if (str == NULL) return REDISMODULE_ERR;
str->ptr = sdscatlen(str->ptr,buf,len); str->m_ptr = sdscatlen(str->m_ptr,buf,len);
return REDISMODULE_OK; return REDISMODULE_OK;
} }
@ -1024,7 +1024,7 @@ int RM_StringAppendBuffer(RedisModuleCtx *ctx, RedisModuleString *str, const cha
int RM_WrongArity(RedisModuleCtx *ctx) { int RM_WrongArity(RedisModuleCtx *ctx) {
addReplyErrorFormat(ctx->client, addReplyErrorFormat(ctx->client,
"wrong number of arguments for '%s' command", "wrong number of arguments for '%s' command",
(char*)ctx->client->argv[0]->ptr); (char*)ptrFromObj(ctx->client->argv[0]));
return REDISMODULE_OK; return REDISMODULE_OK;
} }
@ -1650,8 +1650,8 @@ char *RM_StringDMA(RedisModuleKey *key, size_t *len, int mode) {
if ((mode & REDISMODULE_WRITE) || key->value->encoding != OBJ_ENCODING_RAW) if ((mode & REDISMODULE_WRITE) || key->value->encoding != OBJ_ENCODING_RAW)
key->value = dbUnshareStringValue(key->db, key->key, key->value); key->value = dbUnshareStringValue(key->db, key->key, key->value);
*len = sdslen(key->value->ptr); *len = sdslen(ptrFromObj(key->value));
return key->value->ptr; return ptrFromObj(key->value);
} }
/* If the string is open for writing and is of string type, resize it, padding /* If the string is open for writing and is of string type, resize it, padding
@ -1684,14 +1684,14 @@ int RM_StringTruncate(RedisModuleKey *key, size_t newlen) {
} else { } else {
/* Unshare and resize. */ /* Unshare and resize. */
key->value = dbUnshareStringValue(key->db, key->key, key->value); key->value = dbUnshareStringValue(key->db, key->key, key->value);
size_t curlen = sdslen(key->value->ptr); size_t curlen = sdslen(ptrFromObj(key->value));
if (newlen > curlen) { if (newlen > curlen) {
key->value->ptr = sdsgrowzero(key->value->ptr,newlen); key->value->m_ptr = sdsgrowzero(ptrFromObj(key->value),newlen);
} else if (newlen < curlen) { } else if (newlen < curlen) {
sdsrange(key->value->ptr,0,newlen-1); sdsrange(ptrFromObj(key->value),0,newlen-1);
/* If the string is too wasteful, reallocate it. */ /* If the string is too wasteful, reallocate it. */
if (sdslen(key->value->ptr) < sdsavail(key->value->ptr)) if (sdslen(ptrFromObj(key->value)) < sdsavail(ptrFromObj(key->value)))
key->value->ptr = sdsRemoveFreeSpace(key->value->ptr); key->value->m_ptr = sdsRemoveFreeSpace(ptrFromObj(key->value));
} }
} }
return REDISMODULE_OK; return REDISMODULE_OK;
@ -1790,7 +1790,7 @@ int RM_ZsetAdd(RedisModuleKey *key, double score, RedisModuleString *ele, int *f
if (key->value && key->value->type != OBJ_ZSET) return REDISMODULE_ERR; if (key->value && key->value->type != OBJ_ZSET) return REDISMODULE_ERR;
if (key->value == NULL) moduleCreateEmptyKey(key,REDISMODULE_KEYTYPE_ZSET); if (key->value == NULL) moduleCreateEmptyKey(key,REDISMODULE_KEYTYPE_ZSET);
if (flagsptr) flags = RM_ZsetAddFlagsToCoreFlags(*flagsptr); if (flagsptr) flags = RM_ZsetAddFlagsToCoreFlags(*flagsptr);
if (zsetAdd(key->value,score,ele->ptr,&flags,NULL) == 0) { if (zsetAdd(key->value,score,ptrFromObj(ele),&flags,NULL) == 0) {
if (flagsptr) *flagsptr = 0; if (flagsptr) *flagsptr = 0;
return REDISMODULE_ERR; return REDISMODULE_ERR;
} }
@ -1818,7 +1818,7 @@ int RM_ZsetIncrby(RedisModuleKey *key, double score, RedisModuleString *ele, int
if (key->value == NULL) moduleCreateEmptyKey(key,REDISMODULE_KEYTYPE_ZSET); if (key->value == NULL) moduleCreateEmptyKey(key,REDISMODULE_KEYTYPE_ZSET);
if (flagsptr) flags = RM_ZsetAddFlagsToCoreFlags(*flagsptr); if (flagsptr) flags = RM_ZsetAddFlagsToCoreFlags(*flagsptr);
flags |= ZADD_INCR; flags |= ZADD_INCR;
if (zsetAdd(key->value,score,ele->ptr,&flags,newscore) == 0) { if (zsetAdd(key->value,score,ptrFromObj(ele),&flags,newscore) == 0) {
if (flagsptr) *flagsptr = 0; if (flagsptr) *flagsptr = 0;
return REDISMODULE_ERR; return REDISMODULE_ERR;
} }
@ -1852,7 +1852,7 @@ int RM_ZsetIncrby(RedisModuleKey *key, double score, RedisModuleString *ele, int
int RM_ZsetRem(RedisModuleKey *key, RedisModuleString *ele, int *deleted) { int RM_ZsetRem(RedisModuleKey *key, RedisModuleString *ele, int *deleted) {
if (!(key->mode & REDISMODULE_WRITE)) return REDISMODULE_ERR; if (!(key->mode & REDISMODULE_WRITE)) return REDISMODULE_ERR;
if (key->value && key->value->type != OBJ_ZSET) return REDISMODULE_ERR; if (key->value && key->value->type != OBJ_ZSET) return REDISMODULE_ERR;
if (key->value != NULL && zsetDel(key->value,ele->ptr)) { if (key->value != NULL && zsetDel(key->value,ptrFromObj(ele))) {
if (deleted) *deleted = 1; if (deleted) *deleted = 1;
} else { } else {
if (deleted) *deleted = 0; if (deleted) *deleted = 0;
@ -1871,7 +1871,7 @@ int RM_ZsetRem(RedisModuleKey *key, RedisModuleString *ele, int *deleted) {
int RM_ZsetScore(RedisModuleKey *key, RedisModuleString *ele, double *score) { int RM_ZsetScore(RedisModuleKey *key, RedisModuleString *ele, double *score) {
if (key->value == NULL) return REDISMODULE_ERR; if (key->value == NULL) return REDISMODULE_ERR;
if (key->value->type != OBJ_ZSET) return REDISMODULE_ERR; if (key->value->type != OBJ_ZSET) return REDISMODULE_ERR;
if (zsetScore(key->value,ele->ptr,score) == C_ERR) return REDISMODULE_ERR; if (zsetScore(key->value,ptrFromObj(ele),score) == C_ERR) return REDISMODULE_ERR;
return REDISMODULE_OK; return REDISMODULE_OK;
} }
@ -1923,10 +1923,10 @@ int zsetInitScoreRange(RedisModuleKey *key, double min, double max, int minex, i
zrs->maxex = maxex; zrs->maxex = maxex;
if (key->value->encoding == OBJ_ENCODING_ZIPLIST) { if (key->value->encoding == OBJ_ENCODING_ZIPLIST) {
key->zcurrent = first ? zzlFirstInRange(key->value->ptr,zrs) : key->zcurrent = first ? zzlFirstInRange(ptrFromObj(key->value),zrs) :
zzlLastInRange(key->value->ptr,zrs); zzlLastInRange(ptrFromObj(key->value),zrs);
} else if (key->value->encoding == OBJ_ENCODING_SKIPLIST) { } else if (key->value->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = key->value->ptr; zset *zs = ptrFromObj(key->value);
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
key->zcurrent = first ? zslFirstInRange(zsl,zrs) : key->zcurrent = first ? zslFirstInRange(zsl,zrs) :
zslLastInRange(zsl,zrs); zslLastInRange(zsl,zrs);
@ -1987,10 +1987,10 @@ int zsetInitLexRange(RedisModuleKey *key, RedisModuleString *min, RedisModuleStr
key->ztype = REDISMODULE_ZSET_RANGE_LEX; key->ztype = REDISMODULE_ZSET_RANGE_LEX;
if (key->value->encoding == OBJ_ENCODING_ZIPLIST) { if (key->value->encoding == OBJ_ENCODING_ZIPLIST) {
key->zcurrent = first ? zzlFirstInLexRange(key->value->ptr,zlrs) : key->zcurrent = first ? zzlFirstInLexRange(ptrFromObj(key->value),zlrs) :
zzlLastInLexRange(key->value->ptr,zlrs); zzlLastInLexRange(ptrFromObj(key->value),zlrs);
} else if (key->value->encoding == OBJ_ENCODING_SKIPLIST) { } else if (key->value->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = key->value->ptr; zset *zs = ptrFromObj(key->value);
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
key->zcurrent = first ? zslFirstInLexRange(zsl,zlrs) : key->zcurrent = first ? zslFirstInLexRange(zsl,zlrs) :
zslLastInLexRange(zsl,zlrs); zslLastInLexRange(zsl,zlrs);
@ -2036,7 +2036,7 @@ RedisModuleString *RM_ZsetRangeCurrentElement(RedisModuleKey *key, double *score
eptr = key->zcurrent; eptr = key->zcurrent;
sds ele = ziplistGetObject(eptr); sds ele = ziplistGetObject(eptr);
if (score) { if (score) {
sptr = ziplistNext(key->value->ptr,eptr); sptr = ziplistNext(ptrFromObj(key->value),eptr);
*score = zzlGetScore(sptr); *score = zzlGetScore(sptr);
} }
str = createObject(OBJ_STRING,ele); str = createObject(OBJ_STRING,ele);
@ -2058,7 +2058,7 @@ int RM_ZsetRangeNext(RedisModuleKey *key) {
if (!key->ztype || !key->zcurrent) return 0; /* No active iterator. */ if (!key->ztype || !key->zcurrent) return 0; /* No active iterator. */
if (key->value->encoding == OBJ_ENCODING_ZIPLIST) { if (key->value->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = key->value->ptr; unsigned char *zl = ptrFromObj(key->value);
unsigned char *eptr = key->zcurrent; unsigned char *eptr = key->zcurrent;
unsigned char *next; unsigned char *next;
next = ziplistNext(zl,eptr); /* Skip element. */ next = ziplistNext(zl,eptr); /* Skip element. */
@ -2121,7 +2121,7 @@ int RM_ZsetRangePrev(RedisModuleKey *key) {
if (!key->ztype || !key->zcurrent) return 0; /* No active iterator. */ if (!key->ztype || !key->zcurrent) return 0; /* No active iterator. */
if (key->value->encoding == OBJ_ENCODING_ZIPLIST) { if (key->value->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = key->value->ptr; unsigned char *zl = ptrFromObj(key->value);
unsigned char *eptr = key->zcurrent; unsigned char *eptr = key->zcurrent;
unsigned char *prev; unsigned char *prev;
prev = ziplistPrev(zl,eptr); /* Go back to previous score. */ prev = ziplistPrev(zl,eptr); /* Go back to previous score. */
@ -2256,7 +2256,7 @@ int RM_HashSet(RedisModuleKey *key, int flags, ...) {
/* Handle XX and NX */ /* Handle XX and NX */
if (flags & (REDISMODULE_HASH_XX|REDISMODULE_HASH_NX)) { if (flags & (REDISMODULE_HASH_XX|REDISMODULE_HASH_NX)) {
int exists = hashTypeExists(key->value, field->ptr); int exists = hashTypeExists(key->value, ptrFromObj(field));
if (((flags & REDISMODULE_HASH_XX) && !exists) || if (((flags & REDISMODULE_HASH_XX) && !exists) ||
((flags & REDISMODULE_HASH_NX) && exists)) ((flags & REDISMODULE_HASH_NX) && exists))
{ {
@ -2267,7 +2267,7 @@ int RM_HashSet(RedisModuleKey *key, int flags, ...) {
/* Handle deletion if value is REDISMODULE_HASH_DELETE. */ /* Handle deletion if value is REDISMODULE_HASH_DELETE. */
if (value == REDISMODULE_HASH_DELETE) { if (value == REDISMODULE_HASH_DELETE) {
updated += hashTypeDelete(key->value, field->ptr); updated += hashTypeDelete(key->value, ptrFromObj(field));
if (flags & REDISMODULE_HASH_CFIELDS) decrRefCount(field); if (flags & REDISMODULE_HASH_CFIELDS) decrRefCount(field);
continue; continue;
} }
@ -2281,12 +2281,12 @@ int RM_HashSet(RedisModuleKey *key, int flags, ...) {
robj *argv[2] = {field,value}; robj *argv[2] = {field,value};
hashTypeTryConversion(key->value,argv,0,1); hashTypeTryConversion(key->value,argv,0,1);
updated += hashTypeSet(key->value, field->ptr, value->ptr, low_flags); updated += hashTypeSet(key->value, ptrFromObj(field), ptrFromObj(value), low_flags);
/* If CFIELDS is active, SDS string ownership is now of hashTypeSet(), /* If CFIELDS is active, SDS string ownership is now of hashTypeSet(),
* however we still have to release the 'field' object shell. */ * however we still have to release the 'field' object shell. */
if (flags & REDISMODULE_HASH_CFIELDS) { if (flags & REDISMODULE_HASH_CFIELDS) {
field->ptr = NULL; /* Prevent the SDS string from being freed. */ field->m_ptr = NULL; /* Prevent the SDS string from being freed. */
decrRefCount(field); decrRefCount(field);
} }
} }
@ -2358,13 +2358,13 @@ int RM_HashGet(RedisModuleKey *key, int flags, ...) {
if (flags & REDISMODULE_HASH_EXISTS) { if (flags & REDISMODULE_HASH_EXISTS) {
existsptr = va_arg(ap,int*); existsptr = va_arg(ap,int*);
if (key->value) if (key->value)
*existsptr = hashTypeExists(key->value,field->ptr); *existsptr = hashTypeExists(key->value,ptrFromObj(field));
else else
*existsptr = 0; *existsptr = 0;
} else { } else {
valueptr = va_arg(ap,RedisModuleString**); valueptr = va_arg(ap,RedisModuleString**);
if (key->value) { if (key->value) {
*valueptr = hashTypeGetValueObject(key->value,field->ptr); *valueptr = hashTypeGetValueObject(key->value,ptrFromObj(field));
if (*valueptr) { if (*valueptr) {
robj *decoded = getDecodedObject(*valueptr); robj *decoded = getDecodedObject(*valueptr);
decrRefCount(*valueptr); decrRefCount(*valueptr);
@ -3035,7 +3035,7 @@ moduleType *RM_ModuleTypeGetType(RedisModuleKey *key) {
if (key == NULL || if (key == NULL ||
key->value == NULL || key->value == NULL ||
RM_KeyType(key) != REDISMODULE_KEYTYPE_MODULE) return NULL; RM_KeyType(key) != REDISMODULE_KEYTYPE_MODULE) return NULL;
moduleValue *mv = key->value->ptr; moduleValue *mv = ptrFromObj(key->value);
return mv->type; return mv->type;
} }
@ -3049,7 +3049,7 @@ void *RM_ModuleTypeGetValue(RedisModuleKey *key) {
if (key == NULL || if (key == NULL ||
key->value == NULL || key->value == NULL ||
RM_KeyType(key) != REDISMODULE_KEYTYPE_MODULE) return NULL; RM_KeyType(key) != REDISMODULE_KEYTYPE_MODULE) return NULL;
moduleValue *mv = key->value->ptr; moduleValue *mv = ptrFromObj(key->value);
return mv->value; return mv->value;
} }
@ -4407,12 +4407,12 @@ int RM_DictReplaceC(RedisModuleDict *d, void *key, size_t keylen, void *ptr) {
/* Like RedisModule_DictSetC() but takes the key as a RedisModuleString. */ /* Like RedisModule_DictSetC() but takes the key as a RedisModuleString. */
int RM_DictSet(RedisModuleDict *d, RedisModuleString *key, void *ptr) { int RM_DictSet(RedisModuleDict *d, RedisModuleString *key, void *ptr) {
return RM_DictSetC(d,key->ptr,sdslen(key->ptr),ptr); return RM_DictSetC(d,ptrFromObj(key),sdslen(ptrFromObj(key)),ptr);
} }
/* Like RedisModule_DictReplaceC() but takes the key as a RedisModuleString. */ /* Like RedisModule_DictReplaceC() but takes the key as a RedisModuleString. */
int RM_DictReplace(RedisModuleDict *d, RedisModuleString *key, void *ptr) { int RM_DictReplace(RedisModuleDict *d, RedisModuleString *key, void *ptr) {
return RM_DictReplaceC(d,key->ptr,sdslen(key->ptr),ptr); return RM_DictReplaceC(d,ptrFromObj(key),sdslen(ptrFromObj(key)),ptr);
} }
/* Return the value stored at the specified key. The function returns NULL /* Return the value stored at the specified key. The function returns NULL
@ -4428,7 +4428,7 @@ void *RM_DictGetC(RedisModuleDict *d, void *key, size_t keylen, int *nokey) {
/* Like RedisModule_DictGetC() but takes the key as a RedisModuleString. */ /* Like RedisModule_DictGetC() but takes the key as a RedisModuleString. */
void *RM_DictGet(RedisModuleDict *d, RedisModuleString *key, int *nokey) { void *RM_DictGet(RedisModuleDict *d, RedisModuleString *key, int *nokey) {
return RM_DictGetC(d,key->ptr,sdslen(key->ptr),nokey); return RM_DictGetC(d,ptrFromObj(key),sdslen(ptrFromObj(key)),nokey);
} }
/* Remove the specified key from the dictionary, returning REDISMODULE_OK if /* Remove the specified key from the dictionary, returning REDISMODULE_OK if
@ -4445,7 +4445,7 @@ int RM_DictDelC(RedisModuleDict *d, void *key, size_t keylen, void *oldval) {
/* Like RedisModule_DictDelC() but gets the key as a RedisModuleString. */ /* Like RedisModule_DictDelC() but gets the key as a RedisModuleString. */
int RM_DictDel(RedisModuleDict *d, RedisModuleString *key, void *oldval) { int RM_DictDel(RedisModuleDict *d, RedisModuleString *key, void *oldval) {
return RM_DictDelC(d,key->ptr,sdslen(key->ptr),oldval); return RM_DictDelC(d,ptrFromObj(key),sdslen(ptrFromObj(key)),oldval);
} }
/* Return an interator, setup in order to start iterating from the specified /* Return an interator, setup in order to start iterating from the specified
@ -4479,7 +4479,7 @@ RedisModuleDictIter *RM_DictIteratorStartC(RedisModuleDict *d, const char *op, v
/* Exactly like RedisModule_DictIteratorStartC, but the key is passed as a /* Exactly like RedisModule_DictIteratorStartC, but the key is passed as a
* RedisModuleString. */ * RedisModuleString. */
RedisModuleDictIter *RM_DictIteratorStart(RedisModuleDict *d, const char *op, RedisModuleString *key) { RedisModuleDictIter *RM_DictIteratorStart(RedisModuleDict *d, const char *op, RedisModuleString *key) {
return RM_DictIteratorStartC(d,op,key->ptr,sdslen(key->ptr)); return RM_DictIteratorStartC(d,op,ptrFromObj(key),sdslen(ptrFromObj(key)));
} }
/* Release the iterator created with RedisModule_DictIteratorStart(). This call /* Release the iterator created with RedisModule_DictIteratorStart(). This call
@ -4503,7 +4503,7 @@ int RM_DictIteratorReseekC(RedisModuleDictIter *di, const char *op, void *key, s
/* Like RedisModule_DictIteratorReseekC() but takes the key as as a /* Like RedisModule_DictIteratorReseekC() but takes the key as as a
* RedisModuleString. */ * RedisModuleString. */
int RM_DictIteratorReseek(RedisModuleDictIter *di, const char *op, RedisModuleString *key) { int RM_DictIteratorReseek(RedisModuleDictIter *di, const char *op, RedisModuleString *key) {
return RM_DictIteratorReseekC(di,op,key->ptr,sdslen(key->ptr)); return RM_DictIteratorReseekC(di,op,ptrFromObj(key),sdslen(ptrFromObj(key)));
} }
/* Return the current item of the dictionary iterator 'di' and steps to the /* Return the current item of the dictionary iterator 'di' and steps to the
@ -4594,7 +4594,7 @@ int RM_DictCompareC(RedisModuleDictIter *di, const char *op, void *key, size_t k
* iterator key as a RedisModuleString. */ * iterator key as a RedisModuleString. */
int RM_DictCompare(RedisModuleDictIter *di, const char *op, RedisModuleString *key) { int RM_DictCompare(RedisModuleDictIter *di, const char *op, RedisModuleString *key) {
if (raxEOF(&di->ri)) return REDISMODULE_ERR; if (raxEOF(&di->ri)) return REDISMODULE_ERR;
int res = raxCompare(&di->ri,op,key->ptr,sdslen(key->ptr)); int res = raxCompare(&di->ri,op,ptrFromObj(key),sdslen(ptrFromObj(key)));
return res ? REDISMODULE_OK : REDISMODULE_ERR; return res ? REDISMODULE_OK : REDISMODULE_ERR;
} }
@ -4844,7 +4844,7 @@ void addReplyLoadedModules(client *c) {
* *
* MODULE LOAD <path> [args...] */ * MODULE LOAD <path> [args...] */
void moduleCommand(client *c) { void moduleCommand(client *c) {
char *subcmd = c->argv[1]->ptr; char *subcmd = ptrFromObj(c->argv[1]);
if (c->argc == 2 && !strcasecmp(subcmd,"help")) { if (c->argc == 2 && !strcasecmp(subcmd,"help")) {
const char *help[] = { const char *help[] = {
"LIST -- Return a list of loaded modules.", "LIST -- Return a list of loaded modules.",
@ -4863,13 +4863,13 @@ NULL
argv = &c->argv[3]; argv = &c->argv[3];
} }
if (moduleLoad(c->argv[2]->ptr,(void **)argv,argc) == C_OK) if (moduleLoad(ptrFromObj(c->argv[2]),(void **)argv,argc) == C_OK)
addReply(c,shared.ok); addReply(c,shared.ok);
else else
addReplyError(c, addReplyError(c,
"Error loading the extension. Please check the server logs."); "Error loading the extension. Please check the server logs.");
} else if (!strcasecmp(subcmd,"unload") && c->argc == 3) { } else if (!strcasecmp(subcmd,"unload") && c->argc == 3) {
if (moduleUnload(c->argv[2]->ptr) == C_OK) if (moduleUnload(ptrFromObj(c->argv[2])) == C_OK)
addReply(c,shared.ok); addReply(c,shared.ok);
else { else {
char *errmsg; char *errmsg;

View File

@ -329,7 +329,7 @@ void touchWatchedKeysOnFlush(int dbid) {
* key exists, mark the client as dirty, as the key will be * key exists, mark the client as dirty, as the key will be
* removed. */ * removed. */
if (dbid == -1 || wk->db->id == dbid) { if (dbid == -1 || wk->db->id == dbid) {
if (dictFind(wk->db->pdict, wk->key->ptr) != NULL) if (dictFind(wk->db->pdict, ptrFromObj(wk->key)) != NULL)
c->flags |= CLIENT_DIRTY_CAS; c->flags |= CLIENT_DIRTY_CAS;
} }
} }

View File

@ -48,7 +48,7 @@ size_t sdsZmallocSize(sds s) {
size_t getStringObjectSdsUsedMemory(robj *o) { size_t getStringObjectSdsUsedMemory(robj *o) {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING); serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
switch(o->encoding) { switch(o->encoding) {
case OBJ_ENCODING_RAW: return sdsZmallocSize(o->ptr); case OBJ_ENCODING_RAW: return sdsZmallocSize(ptrFromObj(o));
case OBJ_ENCODING_EMBSTR: return zmalloc_size(o)-sizeof(robj); case OBJ_ENCODING_EMBSTR: return zmalloc_size(o)-sizeof(robj);
default: return 0; /* Just integer encoding for now. */ default: return 0; /* Just integer encoding for now. */
} }
@ -302,14 +302,14 @@ void addReply(client *c, robj *obj) {
if (prepareClientToWrite(c) != C_OK) return; if (prepareClientToWrite(c) != C_OK) return;
if (sdsEncodedObject(obj)) { if (sdsEncodedObject(obj)) {
if (_addReplyToBuffer(c,obj->ptr,sdslen(obj->ptr)) != C_OK) if (_addReplyToBuffer(c,ptrFromObj(obj),sdslen(ptrFromObj(obj))) != C_OK)
_addReplyProtoToList(c,obj->ptr,sdslen(obj->ptr)); _addReplyProtoToList(c,ptrFromObj(obj),sdslen(ptrFromObj(obj)));
} else if (obj->encoding == OBJ_ENCODING_INT) { } else if (obj->encoding == OBJ_ENCODING_INT) {
/* For integer encoded strings we just convert it into a string /* For integer encoded strings we just convert it into a string
* using our optimized function, and attach the resulting string * using our optimized function, and attach the resulting string
* to the output buffer. */ * to the output buffer. */
char buf[32]; char buf[32];
size_t len = ll2string(buf,sizeof(buf),(long)obj->ptr); size_t len = ll2string(buf,sizeof(buf),(long)ptrFromObj(obj));
if (_addReplyToBuffer(c,buf,len) != C_OK) if (_addReplyToBuffer(c,buf,len) != C_OK)
_addReplyProtoToList(c,buf,len); _addReplyProtoToList(c,buf,len);
} else { } else {
@ -639,9 +639,9 @@ void addReplyBulkLen(client *c, robj *obj) {
size_t len; size_t len;
if (sdsEncodedObject(obj)) { if (sdsEncodedObject(obj)) {
len = sdslen(obj->ptr); len = sdslen(ptrFromObj(obj));
} else { } else {
long n = (long)obj->ptr; long n = (long)ptrFromObj(obj);
/* Compute how many bytes will take this integer as a radix 10 string */ /* Compute how many bytes will take this integer as a radix 10 string */
len = 1; len = 1;
@ -733,7 +733,7 @@ void addReplyVerbatim(client *c, const char *s, size_t len, const char *ext) {
* subcommands in response to the 'help' subcommand. The help array * subcommands in response to the 'help' subcommand. The help array
* is terminated by NULL sentinel. */ * is terminated by NULL sentinel. */
void addReplyHelp(client *c, const char **help) { void addReplyHelp(client *c, const char **help) {
sds cmd = sdsnew((char*) c->argv[0]->ptr); sds cmd = sdsnew((char*) ptrFromObj(c->argv[0]));
void *blenp = addReplyDeferredLen(c); void *blenp = addReplyDeferredLen(c);
int blen = 0; int blen = 0;
@ -752,11 +752,11 @@ void addReplyHelp(client *c, const char **help) {
* This function is typically invoked by from commands that support * This function is typically invoked by from commands that support
* subcommands in response to an unknown subcommand or argument error. */ * subcommands in response to an unknown subcommand or argument error. */
void addReplySubcommandSyntaxError(client *c) { void addReplySubcommandSyntaxError(client *c) {
sds cmd = sdsnew((char*) c->argv[0]->ptr); sds cmd = sdsnew((char*) ptrFromObj(c->argv[0]));
sdstoupper(cmd); sdstoupper(cmd);
addReplyErrorFormat(c, addReplyErrorFormat(c,
"Unknown subcommand or wrong number of arguments for '%s'. Try %s HELP.", "Unknown subcommand or wrong number of arguments for '%s'. Try %s HELP.",
(char*)c->argv[1]->ptr,cmd); (char*)ptrFromObj(c->argv[1]),cmd);
sdsfree(cmd); sdsfree(cmd);
} }
@ -1785,7 +1785,7 @@ sds catClientInfoString(sds s, client *client) {
(unsigned long long) client->id, (unsigned long long) client->id,
getClientPeerId(client), getClientPeerId(client),
client->fd, client->fd,
client->name ? (char*)client->name->ptr : "", client->name ? (char*)ptrFromObj(client->name) : "",
(long long)(server.unixtime - client->ctime), (long long)(server.unixtime - client->ctime),
(long long)(server.unixtime - client->lastinteraction), (long long)(server.unixtime - client->lastinteraction),
flags, flags,
@ -1823,7 +1823,7 @@ void clientCommand(client *c) {
listIter li; listIter li;
client *client; client *client;
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = { const char *help[] = {
"id -- Return the ID of the current connection.", "id -- Return the ID of the current connection.",
"getname -- Return the name of the current connection.", "getname -- Return the name of the current connection.",
@ -1841,17 +1841,17 @@ void clientCommand(client *c) {
NULL NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (!strcasecmp(c->argv[1]->ptr,"id") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"id") && c->argc == 2) {
/* CLIENT ID */ /* CLIENT ID */
addReplyLongLong(c,c->id); addReplyLongLong(c,c->id);
} else if (!strcasecmp(c->argv[1]->ptr,"list")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"list")) {
/* CLIENT LIST */ /* CLIENT LIST */
int type = -1; int type = -1;
if (c->argc == 4 && !strcasecmp(c->argv[2]->ptr,"type")) { if (c->argc == 4 && !strcasecmp(ptrFromObj(c->argv[2]),"type")) {
type = getClientTypeByName(c->argv[3]->ptr); type = getClientTypeByName(ptrFromObj(c->argv[3]));
if (type == -1) { if (type == -1) {
addReplyErrorFormat(c,"Unknown client type '%s'", addReplyErrorFormat(c,"Unknown client type '%s'",
(char*) c->argv[3]->ptr); (char*) ptrFromObj(c->argv[3]));
return; return;
} }
} else if (c->argc != 2) { } else if (c->argc != 2) {
@ -1861,21 +1861,21 @@ NULL
sds o = getAllClientsInfoString(type); sds o = getAllClientsInfoString(type);
addReplyBulkCBuffer(c,o,sdslen(o)); addReplyBulkCBuffer(c,o,sdslen(o));
sdsfree(o); sdsfree(o);
} else if (!strcasecmp(c->argv[1]->ptr,"reply") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"reply") && c->argc == 3) {
/* CLIENT REPLY ON|OFF|SKIP */ /* CLIENT REPLY ON|OFF|SKIP */
if (!strcasecmp(c->argv[2]->ptr,"on")) { if (!strcasecmp(ptrFromObj(c->argv[2]),"on")) {
c->flags &= ~(CLIENT_REPLY_SKIP|CLIENT_REPLY_OFF); c->flags &= ~(CLIENT_REPLY_SKIP|CLIENT_REPLY_OFF);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[2]->ptr,"off")) { } else if (!strcasecmp(ptrFromObj(c->argv[2]),"off")) {
c->flags |= CLIENT_REPLY_OFF; c->flags |= CLIENT_REPLY_OFF;
} else if (!strcasecmp(c->argv[2]->ptr,"skip")) { } else if (!strcasecmp(ptrFromObj(c->argv[2]),"skip")) {
if (!(c->flags & CLIENT_REPLY_OFF)) if (!(c->flags & CLIENT_REPLY_OFF))
c->flags |= CLIENT_REPLY_SKIP_NEXT; c->flags |= CLIENT_REPLY_SKIP_NEXT;
} else { } else {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
return; return;
} }
} else if (!strcasecmp(c->argv[1]->ptr,"kill")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"kill")) {
/* CLIENT KILL <ip:port> /* CLIENT KILL <ip:port>
* CLIENT KILL <option> [value] ... <option> [value] */ * CLIENT KILL <option> [value] ... <option> [value] */
char *addr = NULL; char *addr = NULL;
@ -1886,7 +1886,7 @@ NULL
if (c->argc == 3) { if (c->argc == 3) {
/* Old style syntax: CLIENT KILL <addr> */ /* Old style syntax: CLIENT KILL <addr> */
addr = c->argv[2]->ptr; addr = ptrFromObj(c->argv[2]);
skipme = 0; /* With the old form, you can kill yourself. */ skipme = 0; /* With the old form, you can kill yourself. */
} else if (c->argc > 3) { } else if (c->argc > 3) {
int i = 2; /* Next option index. */ int i = 2; /* Next option index. */
@ -1895,25 +1895,25 @@ NULL
while(i < c->argc) { while(i < c->argc) {
int moreargs = c->argc > i+1; int moreargs = c->argc > i+1;
if (!strcasecmp(c->argv[i]->ptr,"id") && moreargs) { if (!strcasecmp(ptrFromObj(c->argv[i]),"id") && moreargs) {
long long tmp; long long tmp;
if (getLongLongFromObjectOrReply(c,c->argv[i+1],&tmp,NULL) if (getLongLongFromObjectOrReply(c,c->argv[i+1],&tmp,NULL)
!= C_OK) return; != C_OK) return;
id = tmp; id = tmp;
} else if (!strcasecmp(c->argv[i]->ptr,"type") && moreargs) { } else if (!strcasecmp(ptrFromObj(c->argv[i]),"type") && moreargs) {
type = getClientTypeByName(c->argv[i+1]->ptr); type = getClientTypeByName(ptrFromObj(c->argv[i+1]));
if (type == -1) { if (type == -1) {
addReplyErrorFormat(c,"Unknown client type '%s'", addReplyErrorFormat(c,"Unknown client type '%s'",
(char*) c->argv[i+1]->ptr); (char*) ptrFromObj(c->argv[i+1]));
return; return;
} }
} else if (!strcasecmp(c->argv[i]->ptr,"addr") && moreargs) { } else if (!strcasecmp(ptrFromObj(c->argv[i]),"addr") && moreargs) {
addr = c->argv[i+1]->ptr; addr = ptrFromObj(c->argv[i+1]);
} else if (!strcasecmp(c->argv[i]->ptr,"skipme") && moreargs) { } else if (!strcasecmp(ptrFromObj(c->argv[i]),"skipme") && moreargs) {
if (!strcasecmp(c->argv[i+1]->ptr,"yes")) { if (!strcasecmp(ptrFromObj(c->argv[i+1]),"yes")) {
skipme = 1; skipme = 1;
} else if (!strcasecmp(c->argv[i+1]->ptr,"no")) { } else if (!strcasecmp(ptrFromObj(c->argv[i+1]),"no")) {
skipme = 0; skipme = 0;
} else { } else {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
@ -1961,7 +1961,7 @@ NULL
/* If this client has to be closed, flag it as CLOSE_AFTER_REPLY /* If this client has to be closed, flag it as CLOSE_AFTER_REPLY
* only after we queued the reply to its output buffers. */ * only after we queued the reply to its output buffers. */
if (close_this_client) c->flags |= CLIENT_CLOSE_AFTER_REPLY; if (close_this_client) c->flags |= CLIENT_CLOSE_AFTER_REPLY;
} else if (!strcasecmp(c->argv[1]->ptr,"unblock") && (c->argc == 3 || } else if (!strcasecmp(ptrFromObj(c->argv[1]),"unblock") && (c->argc == 3 ||
c->argc == 4)) c->argc == 4))
{ {
/* CLIENT UNBLOCK <id> [timeout|error] */ /* CLIENT UNBLOCK <id> [timeout|error] */
@ -1969,9 +1969,9 @@ NULL
int unblock_error = 0; int unblock_error = 0;
if (c->argc == 4) { if (c->argc == 4) {
if (!strcasecmp(c->argv[3]->ptr,"timeout")) { if (!strcasecmp(ptrFromObj(c->argv[3]),"timeout")) {
unblock_error = 0; unblock_error = 0;
} else if (!strcasecmp(c->argv[3]->ptr,"error")) { } else if (!strcasecmp(ptrFromObj(c->argv[3]),"error")) {
unblock_error = 1; unblock_error = 1;
} else { } else {
addReplyError(c, addReplyError(c,
@ -1993,9 +1993,9 @@ NULL
} else { } else {
addReply(c,shared.czero); addReply(c,shared.czero);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"setname") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"setname") && c->argc == 3) {
int j, len = sdslen(c->argv[2]->ptr); int j, len = sdslen(ptrFromObj(c->argv[2]));
char *p = c->argv[2]->ptr; char *p = ptrFromObj(c->argv[2]);
/* Setting the client name to an empty string actually removes /* Setting the client name to an empty string actually removes
* the current name. */ * the current name. */
@ -2021,12 +2021,12 @@ NULL
c->name = c->argv[2]; c->name = c->argv[2];
incrRefCount(c->name); incrRefCount(c->name);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"getname") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"getname") && c->argc == 2) {
if (c->name) if (c->name)
addReplyBulk(c,c->name); addReplyBulk(c,c->name);
else else
addReplyNull(c); addReplyNull(c);
} else if (!strcasecmp(c->argv[1]->ptr,"pause") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"pause") && c->argc == 3) {
long long duration; long long duration;
if (getTimeoutFromObjectOrReply(c,c->argv[2],&duration,UNIT_MILLISECONDS) if (getTimeoutFromObjectOrReply(c,c->argv[2],&duration,UNIT_MILLISECONDS)
@ -2034,7 +2034,7 @@ NULL
pauseClients(duration); pauseClients(duration);
addReply(c,shared.ok); addReply(c,shared.ok);
} else { } else {
addReplyErrorFormat(c, "Unknown subcommand or wrong number of arguments for '%s'. Try CLIENT HELP", (char*)c->argv[1]->ptr); addReplyErrorFormat(c, "Unknown subcommand or wrong number of arguments for '%s'. Try CLIENT HELP", (char*)ptrFromObj(c->argv[1]));
} }
} }
@ -2140,7 +2140,7 @@ void rewriteClientCommandVector(client *c, int argc, ...) {
/* Replace argv and argc with our new versions. */ /* Replace argv and argc with our new versions. */
c->argv = argv; c->argv = argv;
c->argc = argc; c->argc = argc;
c->cmd = lookupCommandOrOriginal(c->argv[0]->ptr); c->cmd = lookupCommandOrOriginal(ptrFromObj(c->argv[0]));
serverAssertWithInfo(c,NULL,c->cmd != NULL); serverAssertWithInfo(c,NULL,c->cmd != NULL);
va_end(ap); va_end(ap);
} }
@ -2151,7 +2151,7 @@ void replaceClientCommandVector(client *c, int argc, robj **argv) {
zfree(c->argv); zfree(c->argv);
c->argv = argv; c->argv = argv;
c->argc = argc; c->argc = argc;
c->cmd = lookupCommandOrOriginal(c->argv[0]->ptr); c->cmd = lookupCommandOrOriginal(ptrFromObj(c->argv[0]));
serverAssertWithInfo(c,NULL,c->cmd != NULL); serverAssertWithInfo(c,NULL,c->cmd != NULL);
} }
@ -2181,7 +2181,7 @@ void rewriteClientCommandArgument(client *c, int i, robj *newval) {
/* If this is the command name make sure to fix c->cmd. */ /* If this is the command name make sure to fix c->cmd. */
if (i == 0) { if (i == 0) {
c->cmd = lookupCommandOrOriginal(c->argv[0]->ptr); c->cmd = lookupCommandOrOriginal(ptrFromObj(c->argv[0]));
serverAssertWithInfo(c,NULL,c->cmd != NULL); serverAssertWithInfo(c,NULL,c->cmd != NULL);
} }
} }

View File

@ -117,7 +117,7 @@ void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) {
len = ll2string(buf,sizeof(buf),dbid); len = ll2string(buf,sizeof(buf),dbid);
chan = sdscatlen(chan, buf, len); chan = sdscatlen(chan, buf, len);
chan = sdscatlen(chan, "__:", 3); chan = sdscatlen(chan, "__:", 3);
chan = sdscatsds(chan, key->ptr); chan = sdscatsds(chan, ptrFromObj(key));
chanobj = createObject(OBJ_STRING, chan); chanobj = createObject(OBJ_STRING, chan);
pubsubPublishMessage(chanobj, eventobj); pubsubPublishMessage(chanobj, eventobj);
decrRefCount(chanobj); decrRefCount(chanobj);
@ -129,7 +129,7 @@ void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) {
if (len == -1) len = ll2string(buf,sizeof(buf),dbid); if (len == -1) len = ll2string(buf,sizeof(buf),dbid);
chan = sdscatlen(chan, buf, len); chan = sdscatlen(chan, buf, len);
chan = sdscatlen(chan, "__:", 3); chan = sdscatlen(chan, "__:", 3);
chan = sdscatsds(chan, eventobj->ptr); chan = sdscatsds(chan, ptrFromObj(eventobj));
chanobj = createObject(OBJ_STRING, chan); chanobj = createObject(OBJ_STRING, chan);
pubsubPublishMessage(chanobj, key); pubsubPublishMessage(chanobj, key);
decrRefCount(chanobj); decrRefCount(chanobj);

View File

@ -42,7 +42,7 @@ robj *createObject(int type, void *ptr) {
robj *o = zmalloc(sizeof(*o), MALLOC_SHARED); robj *o = zmalloc(sizeof(*o), MALLOC_SHARED);
o->type = type; o->type = type;
o->encoding = OBJ_ENCODING_RAW; o->encoding = OBJ_ENCODING_RAW;
o->ptr = ptr; o->m_ptr = ptr;
o->refcount = 1; o->refcount = 1;
/* Set the LRU to the current lruclock (minutes resolution), or /* Set the LRU to the current lruclock (minutes resolution), or
@ -73,7 +73,7 @@ robj *makeObjectShared(robj *o) {
} }
/* Create a string object with encoding OBJ_ENCODING_RAW, that is a plain /* Create a string object with encoding OBJ_ENCODING_RAW, that is a plain
* string object where o->ptr points to a proper sds string. */ * string object where ptrFromObj(o) points to a proper sds string. */
robj *createRawStringObject(const char *ptr, size_t len) { robj *createRawStringObject(const char *ptr, size_t len) {
return createObject(OBJ_STRING, sdsnewlen(ptr,len)); return createObject(OBJ_STRING, sdsnewlen(ptr,len));
} }
@ -82,12 +82,11 @@ robj *createRawStringObject(const char *ptr, size_t len) {
* an object where the sds string is actually an unmodifiable string * an object where the sds string is actually an unmodifiable string
* allocated in the same chunk as the object itself. */ * allocated in the same chunk as the object itself. */
robj *createEmbeddedStringObject(const char *ptr, size_t len) { robj *createEmbeddedStringObject(const char *ptr, size_t len) {
robj *o = zmalloc(sizeof(robj)+sizeof(struct sdshdr8)+len+1, MALLOC_SHARED); robj *o = zmalloc(sizeof(robj)+sizeof(struct sdshdr8)+len+1-sizeof(o->m_ptr), MALLOC_SHARED);
struct sdshdr8 *sh = (void*)(o+1); struct sdshdr8 *sh = (void*)(&o->m_ptr);
o->type = OBJ_STRING; o->type = OBJ_STRING;
o->encoding = OBJ_ENCODING_EMBSTR; o->encoding = OBJ_ENCODING_EMBSTR;
o->ptr = sh+1;
o->refcount = 1; o->refcount = 1;
if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) { if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) {
o->lru = (LFUGetTimeInMinutes()<<8) | LFU_INIT_VAL; o->lru = (LFUGetTimeInMinutes()<<8) | LFU_INIT_VAL;
@ -148,7 +147,7 @@ robj *createStringObjectFromLongLongWithOptions(long long value, int valueobj) {
if (value >= LONG_MIN && value <= LONG_MAX) { if (value >= LONG_MIN && value <= LONG_MAX) {
o = createObject(OBJ_STRING, NULL); o = createObject(OBJ_STRING, NULL);
o->encoding = OBJ_ENCODING_INT; o->encoding = OBJ_ENCODING_INT;
o->ptr = (void*)((long)value); o->m_ptr = (void*)((long)value);
} else { } else {
o = createObject(OBJ_STRING,sdsfromlonglong(value)); o = createObject(OBJ_STRING,sdsfromlonglong(value));
} }
@ -197,13 +196,13 @@ robj *dupStringObject(const robj *o) {
switch(o->encoding) { switch(o->encoding) {
case OBJ_ENCODING_RAW: case OBJ_ENCODING_RAW:
return createRawStringObject(o->ptr,sdslen(o->ptr)); return createRawStringObject(ptrFromObj(o),sdslen(ptrFromObj(o)));
case OBJ_ENCODING_EMBSTR: case OBJ_ENCODING_EMBSTR:
return createEmbeddedStringObject(o->ptr,sdslen(o->ptr)); return createEmbeddedStringObject(ptrFromObj(o),sdslen(ptrFromObj(o)));
case OBJ_ENCODING_INT: case OBJ_ENCODING_INT:
d = createObject(OBJ_STRING, NULL); d = createObject(OBJ_STRING, NULL);
d->encoding = OBJ_ENCODING_INT; d->encoding = OBJ_ENCODING_INT;
d->ptr = o->ptr; d->m_ptr = ptrFromObj(o);
return d; return d;
default: default:
serverPanic("Wrong encoding."); serverPanic("Wrong encoding.");
@ -280,13 +279,13 @@ robj *createModuleObject(moduleType *mt, void *value) {
void freeStringObject(robj *o) { void freeStringObject(robj *o) {
if (o->encoding == OBJ_ENCODING_RAW) { if (o->encoding == OBJ_ENCODING_RAW) {
sdsfree(o->ptr); sdsfree(ptrFromObj(o));
} }
} }
void freeListObject(robj *o) { void freeListObject(robj *o) {
if (o->encoding == OBJ_ENCODING_QUICKLIST) { if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklistRelease(o->ptr); quicklistRelease(ptrFromObj(o));
} else { } else {
serverPanic("Unknown list encoding type"); serverPanic("Unknown list encoding type");
} }
@ -295,10 +294,10 @@ void freeListObject(robj *o) {
void freeSetObject(robj *o) { void freeSetObject(robj *o) {
switch (o->encoding) { switch (o->encoding) {
case OBJ_ENCODING_HT: case OBJ_ENCODING_HT:
dictRelease((dict*) o->ptr); dictRelease((dict*) ptrFromObj(o));
break; break;
case OBJ_ENCODING_INTSET: case OBJ_ENCODING_INTSET:
zfree(o->ptr); zfree(ptrFromObj(o));
break; break;
default: default:
serverPanic("Unknown set encoding type"); serverPanic("Unknown set encoding type");
@ -309,13 +308,13 @@ void freeZsetObject(robj *o) {
zset *zs; zset *zs;
switch (o->encoding) { switch (o->encoding) {
case OBJ_ENCODING_SKIPLIST: case OBJ_ENCODING_SKIPLIST:
zs = o->ptr; zs = ptrFromObj(o);
dictRelease(zs->pdict); dictRelease(zs->pdict);
zslFree(zs->zsl); zslFree(zs->zsl);
zfree(zs); zfree(zs);
break; break;
case OBJ_ENCODING_ZIPLIST: case OBJ_ENCODING_ZIPLIST:
zfree(o->ptr); zfree(ptrFromObj(o));
break; break;
default: default:
serverPanic("Unknown sorted set encoding"); serverPanic("Unknown sorted set encoding");
@ -325,10 +324,10 @@ void freeZsetObject(robj *o) {
void freeHashObject(robj *o) { void freeHashObject(robj *o) {
switch (o->encoding) { switch (o->encoding) {
case OBJ_ENCODING_HT: case OBJ_ENCODING_HT:
dictRelease((dict*) o->ptr); dictRelease((dict*) ptrFromObj(o));
break; break;
case OBJ_ENCODING_ZIPLIST: case OBJ_ENCODING_ZIPLIST:
zfree(o->ptr); zfree(ptrFromObj(o));
break; break;
default: default:
serverPanic("Unknown hash encoding type"); serverPanic("Unknown hash encoding type");
@ -337,13 +336,13 @@ void freeHashObject(robj *o) {
} }
void freeModuleObject(robj *o) { void freeModuleObject(robj *o) {
moduleValue *mv = o->ptr; moduleValue *mv = ptrFromObj(o);
mv->type->free(mv->value); mv->type->free(mv->value);
zfree(mv); zfree(mv);
} }
void freeStreamObject(robj *o) { void freeStreamObject(robj *o) {
freeStream(o->ptr); freeStream(ptrFromObj(o));
} }
void incrRefCount(robj *o) { void incrRefCount(robj *o) {
@ -408,17 +407,17 @@ int isSdsRepresentableAsLongLong(sds s, long long *llval) {
int isObjectRepresentableAsLongLong(robj *o, long long *llval) { int isObjectRepresentableAsLongLong(robj *o, long long *llval) {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING); serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
if (o->encoding == OBJ_ENCODING_INT) { if (o->encoding == OBJ_ENCODING_INT) {
if (llval) *llval = (long) o->ptr; if (llval) *llval = (long) ptrFromObj(o);
return C_OK; return C_OK;
} else { } else {
return isSdsRepresentableAsLongLong(o->ptr,llval); return isSdsRepresentableAsLongLong(ptrFromObj(o),llval);
} }
} }
/* Try to encode a string object in order to save space */ /* Try to encode a string object in order to save space */
robj *tryObjectEncoding(robj *o) { robj *tryObjectEncoding(robj *o) {
long value; long value;
sds s = o->ptr; sds s = ptrFromObj(o);
size_t len; size_t len;
/* Make sure this is a string object, the only type we encode /* Make sure this is a string object, the only type we encode
@ -455,9 +454,9 @@ robj *tryObjectEncoding(robj *o) {
incrRefCount(shared.integers[value]); incrRefCount(shared.integers[value]);
return shared.integers[value]; return shared.integers[value];
} else { } else {
if (o->encoding == OBJ_ENCODING_RAW) sdsfree(o->ptr); if (o->encoding == OBJ_ENCODING_RAW) sdsfree(ptrFromObj(o));
o->encoding = OBJ_ENCODING_INT; o->encoding = OBJ_ENCODING_INT;
o->ptr = (void*) value; o->m_ptr = (void*) value;
return o; return o;
} }
} }
@ -487,7 +486,7 @@ robj *tryObjectEncoding(robj *o) {
if (o->encoding == OBJ_ENCODING_RAW && if (o->encoding == OBJ_ENCODING_RAW &&
sdsavail(s) > len/10) sdsavail(s) > len/10)
{ {
o->ptr = sdsRemoveFreeSpace(o->ptr); o->m_ptr = sdsRemoveFreeSpace(ptrFromObj(o));
} }
/* Return the original object. */ /* Return the original object. */
@ -506,7 +505,7 @@ robj *getDecodedObject(robj *o) {
if (o->type == OBJ_STRING && o->encoding == OBJ_ENCODING_INT) { if (o->type == OBJ_STRING && o->encoding == OBJ_ENCODING_INT) {
char buf[32]; char buf[32];
ll2string(buf,32,(long)o->ptr); ll2string(buf,32,(long)ptrFromObj(o));
dec = createStringObject(buf,strlen(buf)); dec = createStringObject(buf,strlen(buf));
return dec; return dec;
} else { } else {
@ -532,17 +531,17 @@ int compareStringObjectsWithFlags(robj *a, robj *b, int flags) {
if (a == b) return 0; if (a == b) return 0;
if (sdsEncodedObject(a)) { if (sdsEncodedObject(a)) {
astr = a->ptr; astr = ptrFromObj(a);
alen = sdslen(astr); alen = sdslen(astr);
} else { } else {
alen = ll2string(bufa,sizeof(bufa),(long) a->ptr); alen = ll2string(bufa,sizeof(bufa),(long) ptrFromObj(a));
astr = bufa; astr = bufa;
} }
if (sdsEncodedObject(b)) { if (sdsEncodedObject(b)) {
bstr = b->ptr; bstr = ptrFromObj(b);
blen = sdslen(bstr); blen = sdslen(bstr);
} else { } else {
blen = ll2string(bufb,sizeof(bufb),(long) b->ptr); blen = ll2string(bufb,sizeof(bufb),(long) ptrFromObj(b));
bstr = bufb; bstr = bufb;
} }
if (flags & REDIS_COMPARE_COLL) { if (flags & REDIS_COMPARE_COLL) {
@ -576,7 +575,7 @@ int equalStringObjects(robj *a, robj *b) {
b->encoding == OBJ_ENCODING_INT){ b->encoding == OBJ_ENCODING_INT){
/* If both strings are integer encoded just check if the stored /* If both strings are integer encoded just check if the stored
* long is the same. */ * long is the same. */
return a->ptr == b->ptr; return a->m_ptr == b->m_ptr;
} else { } else {
return compareStringObjects(a,b) == 0; return compareStringObjects(a,b) == 0;
} }
@ -585,9 +584,9 @@ int equalStringObjects(robj *a, robj *b) {
size_t stringObjectLen(robj *o) { size_t stringObjectLen(robj *o) {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING); serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
if (sdsEncodedObject(o)) { if (sdsEncodedObject(o)) {
return sdslen(o->ptr); return sdslen(ptrFromObj(o));
} else { } else {
return sdigits10((long)o->ptr); return sdigits10((long)ptrFromObj(o));
} }
} }
@ -601,16 +600,16 @@ int getDoubleFromObject(const robj *o, double *target) {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING); serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
if (sdsEncodedObject(o)) { if (sdsEncodedObject(o)) {
errno = 0; errno = 0;
value = strtod(o->ptr, &eptr); value = strtod(ptrFromObj(o), &eptr);
if (sdslen(o->ptr) == 0 || if (sdslen(ptrFromObj(o)) == 0 ||
isspace(((const char*)o->ptr)[0]) || isspace(((const char*)ptrFromObj(o))[0]) ||
(size_t)(eptr-(char*)o->ptr) != sdslen(o->ptr) || (size_t)(eptr-(char*)ptrFromObj(o)) != sdslen(ptrFromObj(o)) ||
(errno == ERANGE && (errno == ERANGE &&
(value == HUGE_VAL || value == -HUGE_VAL || value == 0)) || (value == HUGE_VAL || value == -HUGE_VAL || value == 0)) ||
isnan(value)) isnan(value))
return C_ERR; return C_ERR;
} else if (o->encoding == OBJ_ENCODING_INT) { } else if (o->encoding == OBJ_ENCODING_INT) {
value = (long)o->ptr; value = (long)ptrFromObj(o);
} else { } else {
serverPanic("Unknown string encoding"); serverPanic("Unknown string encoding");
} }
@ -643,16 +642,16 @@ int getLongDoubleFromObject(robj *o, long double *target) {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING); serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
if (sdsEncodedObject(o)) { if (sdsEncodedObject(o)) {
errno = 0; errno = 0;
value = strtold(o->ptr, &eptr); value = strtold(ptrFromObj(o), &eptr);
if (sdslen(o->ptr) == 0 || if (sdslen(ptrFromObj(o)) == 0 ||
isspace(((const char*)o->ptr)[0]) || isspace(((const char*)ptrFromObj(o))[0]) ||
(size_t)(eptr-(char*)o->ptr) != sdslen(o->ptr) || (size_t)(eptr-(char*)ptrFromObj(o)) != sdslen(ptrFromObj(o)) ||
(errno == ERANGE && (errno == ERANGE &&
(value == HUGE_VAL || value == -HUGE_VAL || value == 0)) || (value == HUGE_VAL || value == -HUGE_VAL || value == 0)) ||
isnan(value)) isnan(value))
return C_ERR; return C_ERR;
} else if (o->encoding == OBJ_ENCODING_INT) { } else if (o->encoding == OBJ_ENCODING_INT) {
value = (long)o->ptr; value = (long)ptrFromObj(o);
} else { } else {
serverPanic("Unknown string encoding"); serverPanic("Unknown string encoding");
} }
@ -683,9 +682,9 @@ int getLongLongFromObject(robj *o, long long *target) {
} else { } else {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING); serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
if (sdsEncodedObject(o)) { if (sdsEncodedObject(o)) {
if (string2ll(o->ptr,sdslen(o->ptr),&value) == 0) return C_ERR; if (string2ll(ptrFromObj(o),sdslen(ptrFromObj(o)),&value) == 0) return C_ERR;
} else if (o->encoding == OBJ_ENCODING_INT) { } else if (o->encoding == OBJ_ENCODING_INT) {
value = (long)o->ptr; value = (long)ptrFromObj(o);
} else { } else {
serverPanic("Unknown string encoding"); serverPanic("Unknown string encoding");
} }
@ -780,15 +779,15 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
if(o->encoding == OBJ_ENCODING_INT) { if(o->encoding == OBJ_ENCODING_INT) {
asize = sizeof(*o); asize = sizeof(*o);
} else if(o->encoding == OBJ_ENCODING_RAW) { } else if(o->encoding == OBJ_ENCODING_RAW) {
asize = sdsAllocSize(o->ptr)+sizeof(*o); asize = sdsAllocSize(ptrFromObj(o))+sizeof(*o);
} else if(o->encoding == OBJ_ENCODING_EMBSTR) { } else if(o->encoding == OBJ_ENCODING_EMBSTR) {
asize = sdslen(o->ptr)+2+sizeof(*o); asize = sdslen(ptrFromObj(o))+2+sizeof(*o);
} else { } else {
serverPanic("Unknown string encoding"); serverPanic("Unknown string encoding");
} }
} else if (o->type == OBJ_LIST) { } else if (o->type == OBJ_LIST) {
if (o->encoding == OBJ_ENCODING_QUICKLIST) { if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklist *ql = o->ptr; quicklist *ql = ptrFromObj(o);
quicklistNode *node = ql->head; quicklistNode *node = ql->head;
asize = sizeof(*o)+sizeof(quicklist); asize = sizeof(*o)+sizeof(quicklist);
do { do {
@ -797,13 +796,13 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
} while ((node = node->next) && samples < sample_size); } while ((node = node->next) && samples < sample_size);
asize += (double)elesize/samples*ql->len; asize += (double)elesize/samples*ql->len;
} else if (o->encoding == OBJ_ENCODING_ZIPLIST) { } else if (o->encoding == OBJ_ENCODING_ZIPLIST) {
asize = sizeof(*o)+ziplistBlobLen(o->ptr); asize = sizeof(*o)+ziplistBlobLen(ptrFromObj(o));
} else { } else {
serverPanic("Unknown list encoding"); serverPanic("Unknown list encoding");
} }
} else if (o->type == OBJ_SET) { } else if (o->type == OBJ_SET) {
if (o->encoding == OBJ_ENCODING_HT) { if (o->encoding == OBJ_ENCODING_HT) {
d = o->ptr; d = ptrFromObj(o);
di = dictGetIterator(d); di = dictGetIterator(d);
asize = sizeof(*o)+sizeof(dict)+(sizeof(struct dictEntry*)*dictSlots(d)); asize = sizeof(*o)+sizeof(dict)+(sizeof(struct dictEntry*)*dictSlots(d));
while((de = dictNext(di)) != NULL && samples < sample_size) { while((de = dictNext(di)) != NULL && samples < sample_size) {
@ -814,17 +813,17 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
dictReleaseIterator(di); dictReleaseIterator(di);
if (samples) asize += (double)elesize/samples*dictSize(d); if (samples) asize += (double)elesize/samples*dictSize(d);
} else if (o->encoding == OBJ_ENCODING_INTSET) { } else if (o->encoding == OBJ_ENCODING_INTSET) {
intset *is = o->ptr; intset *is = ptrFromObj(o);
asize = sizeof(*o)+sizeof(*is)+is->encoding*is->length; asize = sizeof(*o)+sizeof(*is)+is->encoding*is->length;
} else { } else {
serverPanic("Unknown set encoding"); serverPanic("Unknown set encoding");
} }
} else if (o->type == OBJ_ZSET) { } else if (o->type == OBJ_ZSET) {
if (o->encoding == OBJ_ENCODING_ZIPLIST) { if (o->encoding == OBJ_ENCODING_ZIPLIST) {
asize = sizeof(*o)+(ziplistBlobLen(o->ptr)); asize = sizeof(*o)+(ziplistBlobLen(ptrFromObj(o)));
} else if (o->encoding == OBJ_ENCODING_SKIPLIST) { } else if (o->encoding == OBJ_ENCODING_SKIPLIST) {
d = ((zset*)o->ptr)->pdict; d = ((zset*)ptrFromObj(o))->pdict;
zskiplist *zsl = ((zset*)o->ptr)->zsl; zskiplist *zsl = ((zset*)ptrFromObj(o))->zsl;
zskiplistNode *znode = zsl->header->level[0].forward; zskiplistNode *znode = zsl->header->level[0].forward;
asize = sizeof(*o)+sizeof(zset)+(sizeof(struct dictEntry*)*dictSlots(d)); asize = sizeof(*o)+sizeof(zset)+(sizeof(struct dictEntry*)*dictSlots(d));
while(znode != NULL && samples < sample_size) { while(znode != NULL && samples < sample_size) {
@ -839,9 +838,9 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
} }
} else if (o->type == OBJ_HASH) { } else if (o->type == OBJ_HASH) {
if (o->encoding == OBJ_ENCODING_ZIPLIST) { if (o->encoding == OBJ_ENCODING_ZIPLIST) {
asize = sizeof(*o)+(ziplistBlobLen(o->ptr)); asize = sizeof(*o)+(ziplistBlobLen(ptrFromObj(o)));
} else if (o->encoding == OBJ_ENCODING_HT) { } else if (o->encoding == OBJ_ENCODING_HT) {
d = o->ptr; d = ptrFromObj(o);
di = dictGetIterator(d); di = dictGetIterator(d);
asize = sizeof(*o)+sizeof(dict)+(sizeof(struct dictEntry*)*dictSlots(d)); asize = sizeof(*o)+sizeof(dict)+(sizeof(struct dictEntry*)*dictSlots(d));
while((de = dictNext(di)) != NULL && samples < sample_size) { while((de = dictNext(di)) != NULL && samples < sample_size) {
@ -857,7 +856,7 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
serverPanic("Unknown hash encoding"); serverPanic("Unknown hash encoding");
} }
} else if (o->type == OBJ_STREAM) { } else if (o->type == OBJ_STREAM) {
stream *s = o->ptr; stream *s = ptrFromObj(o);
asize = sizeof(*o); asize = sizeof(*o);
asize += streamRadixTreeMemoryUsage(s->prax); asize += streamRadixTreeMemoryUsage(s->prax);
@ -918,7 +917,7 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
raxStop(&ri); raxStop(&ri);
} }
} else if (o->type == OBJ_MODULE) { } else if (o->type == OBJ_MODULE) {
moduleValue *mv = o->ptr; moduleValue *mv = ptrFromObj(o);
moduleType *mt = mv->type; moduleType *mt = mv->type;
if (mt->mem_usage != NULL) { if (mt->mem_usage != NULL) {
asize = mt->mem_usage(mv->value); asize = mt->mem_usage(mv->value);
@ -1222,7 +1221,7 @@ void objectSetLRUOrLFU(robj *val, long long lfu_freq, long long lru_idle,
robj *objectCommandLookup(client *c, robj *key) { robj *objectCommandLookup(client *c, robj *key) {
dictEntry *de; dictEntry *de;
if ((de = dictFind(c->db->pdict,key->ptr)) == NULL) return NULL; if ((de = dictFind(c->db->pdict,ptrFromObj(key))) == NULL) return NULL;
return (robj*) dictGetVal(de); return (robj*) dictGetVal(de);
} }
@ -1238,7 +1237,7 @@ robj *objectCommandLookupOrReply(client *c, robj *key, robj *reply) {
void objectCommand(client *c) { void objectCommand(client *c) {
robj *o; robj *o;
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = { const char *help[] = {
"ENCODING <key> -- Return the kind of internal representation used in order to store the value associated with a key.", "ENCODING <key> -- Return the kind of internal representation used in order to store the value associated with a key.",
"FREQ <key> -- Return the access frequency index of the key. The returned integer is proportional to the logarithm of the recent access frequency of the key.", "FREQ <key> -- Return the access frequency index of the key. The returned integer is proportional to the logarithm of the recent access frequency of the key.",
@ -1247,15 +1246,15 @@ void objectCommand(client *c) {
NULL NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (!strcasecmp(c->argv[1]->ptr,"refcount") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"refcount") && c->argc == 3) {
if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.null[c->resp])) if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.null[c->resp]))
== NULL) return; == NULL) return;
addReplyLongLong(c,o->refcount); addReplyLongLong(c,o->refcount);
} else if (!strcasecmp(c->argv[1]->ptr,"encoding") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"encoding") && c->argc == 3) {
if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.null[c->resp])) if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.null[c->resp]))
== NULL) return; == NULL) return;
addReplyBulkCString(c,strEncoding(o->encoding)); addReplyBulkCString(c,strEncoding(o->encoding));
} else if (!strcasecmp(c->argv[1]->ptr,"idletime") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"idletime") && c->argc == 3) {
if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.null[c->resp])) if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.null[c->resp]))
== NULL) return; == NULL) return;
if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) { if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) {
@ -1263,7 +1262,7 @@ NULL
return; return;
} }
addReplyLongLong(c,estimateObjectIdleTime(o)/1000); addReplyLongLong(c,estimateObjectIdleTime(o)/1000);
} else if (!strcasecmp(c->argv[1]->ptr,"freq") && c->argc == 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"freq") && c->argc == 3) {
if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.null[c->resp])) if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.null[c->resp]))
== NULL) return; == NULL) return;
if (!(server.maxmemory_policy & MAXMEMORY_FLAG_LFU)) { if (!(server.maxmemory_policy & MAXMEMORY_FLAG_LFU)) {
@ -1285,7 +1284,7 @@ NULL
* *
* Usage: MEMORY usage <key> */ * Usage: MEMORY usage <key> */
void memoryCommand(client *c) { void memoryCommand(client *c) {
if (!strcasecmp(c->argv[1]->ptr,"help") && c->argc == 2) { if (!strcasecmp(ptrFromObj(c->argv[1]),"help") && c->argc == 2) {
const char *help[] = { const char *help[] = {
"DOCTOR - Return memory problems reports.", "DOCTOR - Return memory problems reports.",
"MALLOC-STATS -- Return internal statistics report from the memory allocator.", "MALLOC-STATS -- Return internal statistics report from the memory allocator.",
@ -1295,11 +1294,11 @@ void memoryCommand(client *c) {
NULL NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (!strcasecmp(c->argv[1]->ptr,"usage") && c->argc >= 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"usage") && c->argc >= 3) {
dictEntry *de; dictEntry *de;
long long samples = OBJ_COMPUTE_SIZE_DEF_SAMPLES; long long samples = OBJ_COMPUTE_SIZE_DEF_SAMPLES;
for (int j = 3; j < c->argc; j++) { for (int j = 3; j < c->argc; j++) {
if (!strcasecmp(c->argv[j]->ptr,"samples") && if (!strcasecmp(ptrFromObj(c->argv[j]),"samples") &&
j+1 < c->argc) j+1 < c->argc)
{ {
if (getLongLongFromObjectOrReply(c,c->argv[j+1],&samples,NULL) if (getLongLongFromObjectOrReply(c,c->argv[j+1],&samples,NULL)
@ -1315,7 +1314,7 @@ NULL
return; return;
} }
} }
if ((de = dictFind(c->db->pdict,c->argv[2]->ptr)) == NULL) { if ((de = dictFind(c->db->pdict,ptrFromObj(c->argv[2]))) == NULL) {
addReplyNull(c); addReplyNull(c);
return; return;
} }
@ -1323,7 +1322,7 @@ NULL
usage += sdsAllocSize(dictGetKey(de)); usage += sdsAllocSize(dictGetKey(de));
usage += sizeof(dictEntry); usage += sizeof(dictEntry);
addReplyLongLong(c,usage); addReplyLongLong(c,usage);
} else if (!strcasecmp(c->argv[1]->ptr,"stats") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"stats") && c->argc == 2) {
struct redisMemOverhead *mh = getMemoryOverheadData(); struct redisMemOverhead *mh = getMemoryOverheadData();
addReplyMapLen(c,25+mh->num_dbs); addReplyMapLen(c,25+mh->num_dbs);
@ -1417,7 +1416,7 @@ NULL
addReplyLongLong(c,mh->total_frag_bytes); addReplyLongLong(c,mh->total_frag_bytes);
freeMemoryOverheadData(mh); freeMemoryOverheadData(mh);
} else if (!strcasecmp(c->argv[1]->ptr,"malloc-stats") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"malloc-stats") && c->argc == 2) {
#if defined(USE_JEMALLOC) #if defined(USE_JEMALLOC)
sds info = sdsempty(); sds info = sdsempty();
je_malloc_stats_print(inputCatSds, &info, NULL); je_malloc_stats_print(inputCatSds, &info, NULL);
@ -1425,10 +1424,10 @@ NULL
#else #else
addReplyBulkCString(c,"Stats not supported for the current allocator"); addReplyBulkCString(c,"Stats not supported for the current allocator");
#endif #endif
} else if (!strcasecmp(c->argv[1]->ptr,"doctor") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"doctor") && c->argc == 2) {
sds report = getMemoryDoctorReport(); sds report = getMemoryDoctorReport();
addReplyBulkSds(c,report); addReplyBulkSds(c,report);
} else if (!strcasecmp(c->argv[1]->ptr,"purge") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"purge") && c->argc == 2) {
#if defined(USE_JEMALLOC) #if defined(USE_JEMALLOC)
char tmp[32]; char tmp[32];
unsigned narenas = 0; unsigned narenas = 0;
@ -1446,6 +1445,6 @@ NULL
/* Nothing to do for other allocators. */ /* Nothing to do for other allocators. */
#endif #endif
} else { } else {
addReplyErrorFormat(c, "Unknown subcommand or wrong number of arguments for '%s'. Try MEMORY HELP", (char*)c->argv[1]->ptr); addReplyErrorFormat(c, "Unknown subcommand or wrong number of arguments for '%s'. Try MEMORY HELP", (char*)ptrFromObj(c->argv[1]));
} }
} }

View File

@ -304,10 +304,10 @@ int pubsubPublishMessage(robj *channel, robj *message) {
while ((ln = listNext(&li)) != NULL) { while ((ln = listNext(&li)) != NULL) {
pubsubPattern *pat = ln->value; pubsubPattern *pat = ln->value;
if (stringmatchlen((char*)pat->pattern->ptr, if (stringmatchlen((char*)ptrFromObj(pat->pattern),
sdslen(pat->pattern->ptr), sdslen(ptrFromObj(pat->pattern)),
(char*)channel->ptr, (char*)ptrFromObj(channel),
sdslen(channel->ptr),0)) sdslen(ptrFromObj(channel)),0))
{ {
addReplyPubsubPatMessage(pat->pclient, addReplyPubsubPatMessage(pat->pclient,
pat->pattern,channel,message); pat->pattern,channel,message);
@ -374,7 +374,7 @@ void publishCommand(client *c) {
/* PUBSUB command for Pub/Sub introspection. */ /* PUBSUB command for Pub/Sub introspection. */
void pubsubCommand(client *c) { void pubsubCommand(client *c) {
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = { const char *help[] = {
"CHANNELS [<pattern>] -- Return the currently active channels matching a pattern (default: all).", "CHANNELS [<pattern>] -- Return the currently active channels matching a pattern (default: all).",
"NUMPAT -- Return number of subscriptions to patterns.", "NUMPAT -- Return number of subscriptions to patterns.",
@ -382,11 +382,11 @@ void pubsubCommand(client *c) {
NULL NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (!strcasecmp(c->argv[1]->ptr,"channels") && } else if (!strcasecmp(ptrFromObj(c->argv[1]),"channels") &&
(c->argc == 2 || c->argc == 3)) (c->argc == 2 || c->argc == 3))
{ {
/* PUBSUB CHANNELS [<pattern>] */ /* PUBSUB CHANNELS [<pattern>] */
sds pat = (c->argc == 2) ? NULL : c->argv[2]->ptr; sds pat = (c->argc == 2) ? NULL : ptrFromObj(c->argv[2]);
dictIterator *di = dictGetIterator(server.pubsub_channels); dictIterator *di = dictGetIterator(server.pubsub_channels);
dictEntry *de; dictEntry *de;
long mblen = 0; long mblen = 0;
@ -395,7 +395,7 @@ NULL
replylen = addReplyDeferredLen(c); replylen = addReplyDeferredLen(c);
while((de = dictNext(di)) != NULL) { while((de = dictNext(di)) != NULL) {
robj *cobj = dictGetKey(de); robj *cobj = dictGetKey(de);
sds channel = cobj->ptr; sds channel = ptrFromObj(cobj);
if (!pat || stringmatchlen(pat, sdslen(pat), if (!pat || stringmatchlen(pat, sdslen(pat),
channel, sdslen(channel),0)) channel, sdslen(channel),0))
@ -406,7 +406,7 @@ NULL
} }
dictReleaseIterator(di); dictReleaseIterator(di);
setDeferredArrayLen(c,replylen,mblen); setDeferredArrayLen(c,replylen,mblen);
} else if (!strcasecmp(c->argv[1]->ptr,"numsub") && c->argc >= 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"numsub") && c->argc >= 2) {
/* PUBSUB NUMSUB [Channel_1 ... Channel_N] */ /* PUBSUB NUMSUB [Channel_1 ... Channel_N] */
int j; int j;
@ -417,7 +417,7 @@ NULL
addReplyBulk(c,c->argv[j]); addReplyBulk(c,c->argv[j]);
addReplyLongLong(c,l ? listLength(l) : 0); addReplyLongLong(c,l ? listLength(l) : 0);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"numpat") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"numpat") && c->argc == 2) {
/* PUBSUB NUMPAT */ /* PUBSUB NUMPAT */
addReplyLongLong(c,listLength(server.pubsub_patterns)); addReplyLongLong(c,listLength(server.pubsub_patterns));
} else { } else {

102
src/rdb.c
View File

@ -459,10 +459,10 @@ ssize_t rdbSaveStringObject(rio *rdb, robj *obj) {
/* Avoid to decode the object, then encode it again, if the /* Avoid to decode the object, then encode it again, if the
* object is already integer encoded. */ * object is already integer encoded. */
if (obj->encoding == OBJ_ENCODING_INT) { if (obj->encoding == OBJ_ENCODING_INT) {
return rdbSaveLongLongAsStringObject(rdb,(long)obj->ptr); return rdbSaveLongLongAsStringObject(rdb,(long)ptrFromObj(obj));
} else { } else {
serverAssertWithInfo(NULL,obj,sdsEncodedObject(obj)); serverAssertWithInfo(NULL,obj,sdsEncodedObject(obj));
return rdbSaveRawString(rdb,obj->ptr,sdslen(obj->ptr)); return rdbSaveRawString(rdb,ptrFromObj(obj),sdslen(ptrFromObj(obj)));
} }
} }
@ -472,7 +472,7 @@ ssize_t rdbSaveStringObject(rio *rdb, robj *obj) {
* RDB_LOAD_ENC: If the returned type is a Redis object, try to * RDB_LOAD_ENC: If the returned type is a Redis object, try to
* encode it in a special way to be more memory * encode it in a special way to be more memory
* efficient. When this flag is passed the function * efficient. When this flag is passed the function
* no longer guarantees that obj->ptr is an SDS string. * no longer guarantees that ptrFromObj(obj) is an SDS string.
* RDB_LOAD_PLAIN: Return a plain string allocated with zmalloc() * RDB_LOAD_PLAIN: Return a plain string allocated with zmalloc()
* instead of a Redis object with an sds in it. * instead of a Redis object with an sds in it.
* RDB_LOAD_SDS: Return an SDS string instead of a Redis object. * RDB_LOAD_SDS: Return an SDS string instead of a Redis object.
@ -515,7 +515,7 @@ void *rdbGenericLoadStringObject(rio *rdb, int flags, size_t *lenptr) {
} else { } else {
robj *o = encode ? createStringObject(SDS_NOINIT,len) : robj *o = encode ? createStringObject(SDS_NOINIT,len) :
createRawStringObject(SDS_NOINIT,len); createRawStringObject(SDS_NOINIT,len);
if (len && rioRead(rdb,o->ptr,len) == 0) { if (len && rioRead(rdb,ptrFromObj(o),len) == 0) {
decrRefCount(o); decrRefCount(o);
return NULL; return NULL;
} }
@ -762,7 +762,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} else if (o->type == OBJ_LIST) { } else if (o->type == OBJ_LIST) {
/* Save a list value */ /* Save a list value */
if (o->encoding == OBJ_ENCODING_QUICKLIST) { if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklist *ql = o->ptr; quicklist *ql = ptrFromObj(o);
quicklistNode *node = ql->head; quicklistNode *node = ql->head;
if ((n = rdbSaveLen(rdb,ql->len)) == -1) return -1; if ((n = rdbSaveLen(rdb,ql->len)) == -1) return -1;
@ -786,7 +786,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} else if (o->type == OBJ_SET) { } else if (o->type == OBJ_SET) {
/* Save a set value */ /* Save a set value */
if (o->encoding == OBJ_ENCODING_HT) { if (o->encoding == OBJ_ENCODING_HT) {
dict *set = o->ptr; dict *set = ptrFromObj(o);
dictIterator *di = dictGetIterator(set); dictIterator *di = dictGetIterator(set);
dictEntry *de; dictEntry *de;
@ -808,9 +808,9 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} }
dictReleaseIterator(di); dictReleaseIterator(di);
} else if (o->encoding == OBJ_ENCODING_INTSET) { } else if (o->encoding == OBJ_ENCODING_INTSET) {
size_t l = intsetBlobLen((intset*)o->ptr); size_t l = intsetBlobLen((intset*)ptrFromObj(o));
if ((n = rdbSaveRawString(rdb,o->ptr,l)) == -1) return -1; if ((n = rdbSaveRawString(rdb,ptrFromObj(o),l)) == -1) return -1;
nwritten += n; nwritten += n;
} else { } else {
serverPanic("Unknown set encoding"); serverPanic("Unknown set encoding");
@ -818,12 +818,12 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} else if (o->type == OBJ_ZSET) { } else if (o->type == OBJ_ZSET) {
/* Save a sorted set value */ /* Save a sorted set value */
if (o->encoding == OBJ_ENCODING_ZIPLIST) { if (o->encoding == OBJ_ENCODING_ZIPLIST) {
size_t l = ziplistBlobLen((unsigned char*)o->ptr); size_t l = ziplistBlobLen((unsigned char*)ptrFromObj(o));
if ((n = rdbSaveRawString(rdb,o->ptr,l)) == -1) return -1; if ((n = rdbSaveRawString(rdb,ptrFromObj(o),l)) == -1) return -1;
nwritten += n; nwritten += n;
} else if (o->encoding == OBJ_ENCODING_SKIPLIST) { } else if (o->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = o->ptr; zset *zs = ptrFromObj(o);
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
if ((n = rdbSaveLen(rdb,zsl->length)) == -1) return -1; if ((n = rdbSaveLen(rdb,zsl->length)) == -1) return -1;
@ -854,16 +854,16 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} else if (o->type == OBJ_HASH) { } else if (o->type == OBJ_HASH) {
/* Save a hash value */ /* Save a hash value */
if (o->encoding == OBJ_ENCODING_ZIPLIST) { if (o->encoding == OBJ_ENCODING_ZIPLIST) {
size_t l = ziplistBlobLen((unsigned char*)o->ptr); size_t l = ziplistBlobLen((unsigned char*)ptrFromObj(o));
if ((n = rdbSaveRawString(rdb,o->ptr,l)) == -1) return -1; if ((n = rdbSaveRawString(rdb,ptrFromObj(o),l)) == -1) return -1;
nwritten += n; nwritten += n;
} else if (o->encoding == OBJ_ENCODING_HT) { } else if (o->encoding == OBJ_ENCODING_HT) {
dictIterator *di = dictGetIterator(o->ptr); dictIterator *di = dictGetIterator(ptrFromObj(o));
dictEntry *de; dictEntry *de;
if ((n = rdbSaveLen(rdb,dictSize((dict*)o->ptr))) == -1) { if ((n = rdbSaveLen(rdb,dictSize((dict*)ptrFromObj(o)))) == -1) {
dictReleaseIterator(di); dictReleaseIterator(di);
return -1; return -1;
} }
@ -894,7 +894,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} }
} else if (o->type == OBJ_STREAM) { } else if (o->type == OBJ_STREAM) {
/* Store how many listpacks we have inside the radix tree. */ /* Store how many listpacks we have inside the radix tree. */
stream *s = o->ptr; stream *s = ptrFromObj(o);
rax *rax = s->prax; rax *rax = s->prax;
if ((n = rdbSaveLen(rdb,raxSize(rax))) == -1) return -1; if ((n = rdbSaveLen(rdb,raxSize(rax))) == -1) return -1;
nwritten += n; nwritten += n;
@ -965,7 +965,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} else if (o->type == OBJ_MODULE) { } else if (o->type == OBJ_MODULE) {
/* Save a module-specific value. */ /* Save a module-specific value. */
RedisModuleIO io; RedisModuleIO io;
moduleValue *mv = o->ptr; moduleValue *mv = ptrFromObj(o);
moduleType *mt = mv->type; moduleType *mt = mv->type;
moduleInitIOContext(io,mt,rdb); moduleInitIOContext(io,mt,rdb);
@ -1167,7 +1167,7 @@ int rdbSaveRio(rio *rdb, int *error, int flags, rdbSaveInfo *rsi) {
di = dictGetIterator(server.lua_scripts); di = dictGetIterator(server.lua_scripts);
while((de = dictNext(di)) != NULL) { while((de = dictNext(di)) != NULL) {
robj *body = dictGetVal(de); robj *body = dictGetVal(de);
if (rdbSaveAuxField(rdb,"lua",3,body->ptr,sdslen(body->ptr)) == -1) if (rdbSaveAuxField(rdb,"lua",3,ptrFromObj(body),sdslen(ptrFromObj(body))) == -1)
goto werr; goto werr;
} }
dictReleaseIterator(di); dictReleaseIterator(di);
@ -1415,15 +1415,15 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
if ((len = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL; if ((len = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL;
o = createQuicklistObject(); o = createQuicklistObject();
quicklistSetOptions(o->ptr, server.list_max_ziplist_size, quicklistSetOptions(ptrFromObj(o), server.list_max_ziplist_size,
server.list_compress_depth); server.list_compress_depth);
/* Load every single element of the list */ /* Load every single element of the list */
while(len--) { while(len--) {
if ((ele = rdbLoadEncodedStringObject(rdb)) == NULL) return NULL; if ((ele = rdbLoadEncodedStringObject(rdb)) == NULL) return NULL;
dec = getDecodedObject(ele); dec = getDecodedObject(ele);
size_t len = sdslen(dec->ptr); size_t len = sdslen(ptrFromObj(dec));
quicklistPushTail(o->ptr, dec->ptr, len); quicklistPushTail(ptrFromObj(o), ptrFromObj(dec), len);
decrRefCount(dec); decrRefCount(dec);
decrRefCount(ele); decrRefCount(ele);
} }
@ -1437,7 +1437,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
/* It's faster to expand the dict to the right size asap in order /* It's faster to expand the dict to the right size asap in order
* to avoid rehashing */ * to avoid rehashing */
if (len > DICT_HT_INITIAL_SIZE) if (len > DICT_HT_INITIAL_SIZE)
dictExpand(o->ptr,len); dictExpand(ptrFromObj(o),len);
} else { } else {
o = createIntsetObject(); o = createIntsetObject();
} }
@ -1453,17 +1453,17 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
if (o->encoding == OBJ_ENCODING_INTSET) { if (o->encoding == OBJ_ENCODING_INTSET) {
/* Fetch integer value from element. */ /* Fetch integer value from element. */
if (isSdsRepresentableAsLongLong(sdsele,&llval) == C_OK) { if (isSdsRepresentableAsLongLong(sdsele,&llval) == C_OK) {
o->ptr = intsetAdd(o->ptr,llval,NULL); o->m_ptr = intsetAdd(ptrFromObj(o),llval,NULL);
} else { } else {
setTypeConvert(o,OBJ_ENCODING_HT); setTypeConvert(o,OBJ_ENCODING_HT);
dictExpand(o->ptr,len); dictExpand(ptrFromObj(o),len);
} }
} }
/* This will also be called when the set was just converted /* This will also be called when the set was just converted
* to a regular hash table encoded set. */ * to a regular hash table encoded set. */
if (o->encoding == OBJ_ENCODING_HT) { if (o->encoding == OBJ_ENCODING_HT) {
dictAdd((dict*)o->ptr,sdsele,NULL); dictAdd((dict*)ptrFromObj(o),sdsele,NULL);
} else { } else {
sdsfree(sdsele); sdsfree(sdsele);
} }
@ -1476,7 +1476,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
if ((zsetlen = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL; if ((zsetlen = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL;
o = createZsetObject(); o = createZsetObject();
zs = o->ptr; zs = ptrFromObj(o);
if (zsetlen > DICT_HT_INITIAL_SIZE) if (zsetlen > DICT_HT_INITIAL_SIZE)
dictExpand(zs->pdict,zsetlen); dictExpand(zs->pdict,zsetlen);
@ -1531,9 +1531,9 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
== NULL) return NULL; == NULL) return NULL;
/* Add pair to ziplist */ /* Add pair to ziplist */
o->ptr = ziplistPush(o->ptr, (unsigned char*)field, o->m_ptr = ziplistPush(ptrFromObj(o), (unsigned char*)field,
sdslen(field), ZIPLIST_TAIL); sdslen(field), ZIPLIST_TAIL);
o->ptr = ziplistPush(o->ptr, (unsigned char*)value, o->m_ptr = ziplistPush(ptrFromObj(o), (unsigned char*)value,
sdslen(value), ZIPLIST_TAIL); sdslen(value), ZIPLIST_TAIL);
/* Convert to hash table if size threshold is exceeded */ /* Convert to hash table if size threshold is exceeded */
@ -1550,7 +1550,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
} }
if (o->encoding == OBJ_ENCODING_HT && len > DICT_HT_INITIAL_SIZE) if (o->encoding == OBJ_ENCODING_HT && len > DICT_HT_INITIAL_SIZE)
dictExpand(o->ptr,len); dictExpand(ptrFromObj(o),len);
/* Load remaining fields and values into the hash table */ /* Load remaining fields and values into the hash table */
while (o->encoding == OBJ_ENCODING_HT && len > 0) { while (o->encoding == OBJ_ENCODING_HT && len > 0) {
@ -1562,7 +1562,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
== NULL) return NULL; == NULL) return NULL;
/* Add pair to hash table */ /* Add pair to hash table */
ret = dictAdd((dict*)o->ptr, field, value); ret = dictAdd((dict*)ptrFromObj(o), field, value);
if (ret == DICT_ERR) { if (ret == DICT_ERR) {
rdbExitReportCorruptRDB("Duplicate keys detected"); rdbExitReportCorruptRDB("Duplicate keys detected");
} }
@ -1573,14 +1573,14 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
} else if (rdbtype == RDB_TYPE_LIST_QUICKLIST) { } else if (rdbtype == RDB_TYPE_LIST_QUICKLIST) {
if ((len = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL; if ((len = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL;
o = createQuicklistObject(); o = createQuicklistObject();
quicklistSetOptions(o->ptr, server.list_max_ziplist_size, quicklistSetOptions(ptrFromObj(o), server.list_max_ziplist_size,
server.list_compress_depth); server.list_compress_depth);
while (len--) { while (len--) {
unsigned char *zl = unsigned char *zl =
rdbGenericLoadStringObject(rdb,RDB_LOAD_PLAIN,NULL); rdbGenericLoadStringObject(rdb,RDB_LOAD_PLAIN,NULL);
if (zl == NULL) return NULL; if (zl == NULL) return NULL;
quicklistAppendZiplist(o->ptr, zl); quicklistAppendZiplist(ptrFromObj(o), zl);
} }
} else if (rdbtype == RDB_TYPE_HASH_ZIPMAP || } else if (rdbtype == RDB_TYPE_HASH_ZIPMAP ||
rdbtype == RDB_TYPE_LIST_ZIPLIST || rdbtype == RDB_TYPE_LIST_ZIPLIST ||
@ -1605,7 +1605,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
* when loading dumps created by Redis 2.4 gets deprecated. */ * when loading dumps created by Redis 2.4 gets deprecated. */
{ {
unsigned char *zl = ziplistNew(); unsigned char *zl = ziplistNew();
unsigned char *zi = zipmapRewind(o->ptr); unsigned char *zi = zipmapRewind(ptrFromObj(o));
unsigned char *fstr, *vstr; unsigned char *fstr, *vstr;
unsigned int flen, vlen; unsigned int flen, vlen;
unsigned int maxlen = 0; unsigned int maxlen = 0;
@ -1617,8 +1617,8 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
zl = ziplistPush(zl, vstr, vlen, ZIPLIST_TAIL); zl = ziplistPush(zl, vstr, vlen, ZIPLIST_TAIL);
} }
zfree(o->ptr); zfree(ptrFromObj(o));
o->ptr = zl; o->m_ptr = zl;
o->type = OBJ_HASH; o->type = OBJ_HASH;
o->encoding = OBJ_ENCODING_ZIPLIST; o->encoding = OBJ_ENCODING_ZIPLIST;
@ -1637,7 +1637,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
case RDB_TYPE_SET_INTSET: case RDB_TYPE_SET_INTSET:
o->type = OBJ_SET; o->type = OBJ_SET;
o->encoding = OBJ_ENCODING_INTSET; o->encoding = OBJ_ENCODING_INTSET;
if (intsetLen(o->ptr) > server.set_max_intset_entries) if (intsetLen(ptrFromObj(o)) > server.set_max_intset_entries)
setTypeConvert(o,OBJ_ENCODING_HT); setTypeConvert(o,OBJ_ENCODING_HT);
break; break;
case RDB_TYPE_ZSET_ZIPLIST: case RDB_TYPE_ZSET_ZIPLIST:
@ -1658,7 +1658,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
} }
} else if (rdbtype == RDB_TYPE_STREAM_LISTPACKS) { } else if (rdbtype == RDB_TYPE_STREAM_LISTPACKS) {
o = createStreamObject(); o = createStreamObject();
stream *s = o->ptr; stream *s = ptrFromObj(o);
uint64_t listpacks = rdbLoadLen(rdb,NULL); uint64_t listpacks = rdbLoadLen(rdb,NULL);
while(listpacks--) { while(listpacks--) {
@ -1961,34 +1961,34 @@ int rdbLoadRio(rio *rdb, rdbSaveInfo *rsi, int loading_aof) {
if ((auxkey = rdbLoadStringObject(rdb)) == NULL) goto eoferr; if ((auxkey = rdbLoadStringObject(rdb)) == NULL) goto eoferr;
if ((auxval = rdbLoadStringObject(rdb)) == NULL) goto eoferr; if ((auxval = rdbLoadStringObject(rdb)) == NULL) goto eoferr;
if (((char*)auxkey->ptr)[0] == '%') { if (((char*)ptrFromObj(auxkey))[0] == '%') {
/* All the fields with a name staring with '%' are considered /* All the fields with a name staring with '%' are considered
* information fields and are logged at startup with a log * information fields and are logged at startup with a log
* level of NOTICE. */ * level of NOTICE. */
serverLog(LL_NOTICE,"RDB '%s': %s", serverLog(LL_NOTICE,"RDB '%s': %s",
(char*)auxkey->ptr, (char*)ptrFromObj(auxkey),
(char*)auxval->ptr); (char*)ptrFromObj(auxval));
} else if (!strcasecmp(auxkey->ptr,"repl-stream-db")) { } else if (!strcasecmp(ptrFromObj(auxkey),"repl-stream-db")) {
if (rsi) rsi->repl_stream_db = atoi(auxval->ptr); if (rsi) rsi->repl_stream_db = atoi(ptrFromObj(auxval));
} else if (!strcasecmp(auxkey->ptr,"repl-id")) { } else if (!strcasecmp(ptrFromObj(auxkey),"repl-id")) {
if (rsi && sdslen(auxval->ptr) == CONFIG_RUN_ID_SIZE) { if (rsi && sdslen(ptrFromObj(auxval)) == CONFIG_RUN_ID_SIZE) {
memcpy(rsi->repl_id,auxval->ptr,CONFIG_RUN_ID_SIZE+1); memcpy(rsi->repl_id,ptrFromObj(auxval),CONFIG_RUN_ID_SIZE+1);
rsi->repl_id_is_set = 1; rsi->repl_id_is_set = 1;
} }
} else if (!strcasecmp(auxkey->ptr,"repl-offset")) { } else if (!strcasecmp(ptrFromObj(auxkey),"repl-offset")) {
if (rsi) rsi->repl_offset = strtoll(auxval->ptr,NULL,10); if (rsi) rsi->repl_offset = strtoll(ptrFromObj(auxval),NULL,10);
} else if (!strcasecmp(auxkey->ptr,"lua")) { } else if (!strcasecmp(ptrFromObj(auxkey),"lua")) {
/* Load the script back in memory. */ /* Load the script back in memory. */
if (luaCreateFunction(NULL,server.lua,auxval) == NULL) { if (luaCreateFunction(NULL,server.lua,auxval) == NULL) {
rdbExitReportCorruptRDB( rdbExitReportCorruptRDB(
"Can't load Lua script from RDB file! " "Can't load Lua script from RDB file! "
"BODY: %s", auxval->ptr); "BODY: %s", ptrFromObj(auxval));
} }
} else { } else {
/* We ignore fields we don't understand, as by AUX field /* We ignore fields we don't understand, as by AUX field
* contract. */ * contract. */
serverLog(LL_DEBUG,"Unrecognized RDB AUX field: '%s'", serverLog(LL_DEBUG,"Unrecognized RDB AUX field: '%s'",
(char*)auxkey->ptr); (char*)ptrFromObj(auxkey));
} }
decrRefCount(auxkey); decrRefCount(auxkey);
@ -2438,7 +2438,7 @@ void bgsaveCommand(client *c) {
/* The SCHEDULE option changes the behavior of BGSAVE when an AOF rewrite /* The SCHEDULE option changes the behavior of BGSAVE when an AOF rewrite
* is in progress. Instead of returning an error a BGSAVE gets scheduled. */ * is in progress. Instead of returning an error a BGSAVE gets scheduled. */
if (c->argc > 1) { if (c->argc > 1) {
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"schedule")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"schedule")) {
schedule = 1; schedule = 1;
} else { } else {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);

View File

@ -113,7 +113,7 @@ void rdbCheckError(const char *fmt, ...) {
rdb_check_doing_string[rdbstate.doing]); rdb_check_doing_string[rdbstate.doing]);
if (rdbstate.key) if (rdbstate.key)
printf("[additional info] Reading key '%s'\n", printf("[additional info] Reading key '%s'\n",
(char*)rdbstate.key->ptr); (char*)ptrFromObj(rdbstate.key));
if (rdbstate.key_type != -1) if (rdbstate.key_type != -1)
printf("[additional info] Reading type %d (%s)\n", printf("[additional info] Reading type %d (%s)\n",
rdbstate.key_type, rdbstate.key_type,
@ -266,7 +266,7 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) {
if ((auxval = rdbLoadStringObject(&rdb)) == NULL) goto eoferr; if ((auxval = rdbLoadStringObject(&rdb)) == NULL) goto eoferr;
rdbCheckInfo("AUX FIELD %s = '%s'", rdbCheckInfo("AUX FIELD %s = '%s'",
(char*)auxkey->ptr, (char*)auxval->ptr); (char*)ptrFromObj(auxkey), (char*)ptrFromObj(auxval));
decrRefCount(auxkey); decrRefCount(auxkey);
decrRefCount(auxval); decrRefCount(auxval);
continue; /* Read type again. */ continue; /* Read type again. */

View File

@ -156,11 +156,11 @@ void feedReplicationBacklogWithObject(robj *o) {
size_t len; size_t len;
if (o->encoding == OBJ_ENCODING_INT) { if (o->encoding == OBJ_ENCODING_INT) {
len = ll2string(llstr,sizeof(llstr),(long)o->ptr); len = ll2string(llstr,sizeof(llstr),(long)ptrFromObj(o));
p = llstr; p = llstr;
} else { } else {
len = sdslen(o->ptr); len = sdslen(ptrFromObj(o));
p = o->ptr; p = ptrFromObj(o);
} }
feedReplicationBacklog(p,len); feedReplicationBacklog(p,len);
} }
@ -320,10 +320,10 @@ void replicationFeedMonitors(client *c, list *monitors, int dictid, robj **argv,
for (j = 0; j < argc; j++) { for (j = 0; j < argc; j++) {
if (argv[j]->encoding == OBJ_ENCODING_INT) { if (argv[j]->encoding == OBJ_ENCODING_INT) {
cmdrepr = sdscatprintf(cmdrepr, "\"%ld\"", (long)argv[j]->ptr); cmdrepr = sdscatprintf(cmdrepr, "\"%ld\"", (long)ptrFromObj(argv[j]));
} else { } else {
cmdrepr = sdscatrepr(cmdrepr,(char*)argv[j]->ptr, cmdrepr = sdscatrepr(cmdrepr,(char*)ptrFromObj(argv[j]),
sdslen(argv[j]->ptr)); sdslen(ptrFromObj(argv[j])));
} }
if (j != argc-1) if (j != argc-1)
cmdrepr = sdscatlen(cmdrepr," ",1); cmdrepr = sdscatlen(cmdrepr," ",1);
@ -446,7 +446,7 @@ int replicationSetupSlaveForFullResync(client *slave, long long offset) {
* with the usual full resync. */ * with the usual full resync. */
int masterTryPartialResynchronization(client *c) { int masterTryPartialResynchronization(client *c) {
long long psync_offset, psync_len; long long psync_offset, psync_len;
char *master_replid = c->argv[1]->ptr; char *master_replid = ptrFromObj(c->argv[1]);
char buf[128]; char buf[128];
int buflen; int buflen;
@ -656,12 +656,12 @@ void syncCommand(client *c) {
* *
* So the slave knows the new replid and offset to try a PSYNC later * So the slave knows the new replid and offset to try a PSYNC later
* if the connection with the master is lost. */ * if the connection with the master is lost. */
if (!strcasecmp(c->argv[0]->ptr,"psync")) { if (!strcasecmp(ptrFromObj(c->argv[0]),"psync")) {
if (masterTryPartialResynchronization(c) == C_OK) { if (masterTryPartialResynchronization(c) == C_OK) {
server.stat_sync_partial_ok++; server.stat_sync_partial_ok++;
return; /* No full resync needed, return. */ return; /* No full resync needed, return. */
} else { } else {
char *master_replid = c->argv[1]->ptr; char *master_replid = ptrFromObj(c->argv[1]);
/* Increment stats for failed PSYNCs, but only if the /* Increment stats for failed PSYNCs, but only if the
* replid is not "?", as this is used by slaves to force a full * replid is not "?", as this is used by slaves to force a full
@ -785,15 +785,15 @@ void replconfCommand(client *c) {
/* Process every option-value pair. */ /* Process every option-value pair. */
for (j = 1; j < c->argc; j+=2) { for (j = 1; j < c->argc; j+=2) {
if (!strcasecmp(c->argv[j]->ptr,"listening-port")) { if (!strcasecmp(ptrFromObj(c->argv[j]),"listening-port")) {
long port; long port;
if ((getLongFromObjectOrReply(c,c->argv[j+1], if ((getLongFromObjectOrReply(c,c->argv[j+1],
&port,NULL) != C_OK)) &port,NULL) != C_OK))
return; return;
c->slave_listening_port = port; c->slave_listening_port = port;
} else if (!strcasecmp(c->argv[j]->ptr,"ip-address")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"ip-address")) {
sds ip = c->argv[j+1]->ptr; sds ip = ptrFromObj(c->argv[j+1]);
if (sdslen(ip) < sizeof(c->slave_ip)) { if (sdslen(ip) < sizeof(c->slave_ip)) {
memcpy(c->slave_ip,ip,sdslen(ip)+1); memcpy(c->slave_ip,ip,sdslen(ip)+1);
} else { } else {
@ -801,13 +801,13 @@ void replconfCommand(client *c) {
"replica instance is too long: %zd bytes", sdslen(ip)); "replica instance is too long: %zd bytes", sdslen(ip));
return; return;
} }
} else if (!strcasecmp(c->argv[j]->ptr,"capa")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"capa")) {
/* Ignore capabilities not understood by this master. */ /* Ignore capabilities not understood by this master. */
if (!strcasecmp(c->argv[j+1]->ptr,"eof")) if (!strcasecmp(ptrFromObj(c->argv[j+1]),"eof"))
c->slave_capa |= SLAVE_CAPA_EOF; c->slave_capa |= SLAVE_CAPA_EOF;
else if (!strcasecmp(c->argv[j+1]->ptr,"psync2")) else if (!strcasecmp(ptrFromObj(c->argv[j+1]),"psync2"))
c->slave_capa |= SLAVE_CAPA_PSYNC2; c->slave_capa |= SLAVE_CAPA_PSYNC2;
} else if (!strcasecmp(c->argv[j]->ptr,"ack")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"ack")) {
/* REPLCONF ACK is used by slave to inform the master the amount /* REPLCONF ACK is used by slave to inform the master the amount
* of replication stream that it processed so far. It is an * of replication stream that it processed so far. It is an
* internal only command that normal clients should never use. */ * internal only command that normal clients should never use. */
@ -826,14 +826,14 @@ void replconfCommand(client *c) {
putSlaveOnline(c); putSlaveOnline(c);
/* Note: this command does not reply anything! */ /* Note: this command does not reply anything! */
return; return;
} else if (!strcasecmp(c->argv[j]->ptr,"getack")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"getack")) {
/* REPLCONF GETACK is used in order to request an ACK ASAP /* REPLCONF GETACK is used in order to request an ACK ASAP
* to the slave. */ * to the slave. */
if (server.masterhost && server.master) replicationSendAck(); if (server.masterhost && server.master) replicationSendAck();
return; return;
} else { } else {
addReplyErrorFormat(c,"Unrecognized REPLCONF option: %s", addReplyErrorFormat(c,"Unrecognized REPLCONF option: %s",
(char*)c->argv[j]->ptr); (char*)ptrFromObj(c->argv[j]));
return; return;
} }
} }
@ -2020,8 +2020,8 @@ void replicaofCommand(client *c) {
/* The special host/port combination "NO" "ONE" turns the instance /* The special host/port combination "NO" "ONE" turns the instance
* into a master. Otherwise the new master address is set. */ * into a master. Otherwise the new master address is set. */
if (!strcasecmp(c->argv[1]->ptr,"no") && if (!strcasecmp(ptrFromObj(c->argv[1]),"no") &&
!strcasecmp(c->argv[2]->ptr,"one")) { !strcasecmp(ptrFromObj(c->argv[2]),"one")) {
if (server.masterhost) { if (server.masterhost) {
replicationUnsetMaster(); replicationUnsetMaster();
sds client = catClientInfoString(sdsempty(),c); sds client = catClientInfoString(sdsempty(),c);
@ -2036,7 +2036,7 @@ void replicaofCommand(client *c) {
return; return;
/* Check if we are already attached to the specified slave */ /* Check if we are already attached to the specified slave */
if (server.masterhost && !strcasecmp(server.masterhost,c->argv[1]->ptr) if (server.masterhost && !strcasecmp(server.masterhost,ptrFromObj(c->argv[1]))
&& server.masterport == port) { && server.masterport == port) {
serverLog(LL_NOTICE,"REPLICAOF would result into synchronization with the master we are already connected with. No operation performed."); serverLog(LL_NOTICE,"REPLICAOF would result into synchronization with the master we are already connected with. No operation performed.");
addReplySds(c,sdsnew("+OK Already connected to specified master\r\n")); addReplySds(c,sdsnew("+OK Already connected to specified master\r\n"));
@ -2044,7 +2044,7 @@ void replicaofCommand(client *c) {
} }
/* There was no previous master or the user specified a different one, /* There was no previous master or the user specified a different one,
* we can continue. */ * we can continue. */
replicationSetMaster(c->argv[1]->ptr, port); replicationSetMaster(ptrFromObj(c->argv[1]), port);
sds client = catClientInfoString(sdsempty(),c); sds client = catClientInfoString(sdsempty(),c);
serverLog(LL_NOTICE,"REPLICAOF %s:%d enabled (user request from '%s')", serverLog(LL_NOTICE,"REPLICAOF %s:%d enabled (user request from '%s')",
server.masterhost, server.masterport, client); server.masterhost, server.masterport, client);

View File

@ -432,7 +432,7 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
if (j < LUA_CMD_OBJCACHE_SIZE && cached_objects[j] && if (j < LUA_CMD_OBJCACHE_SIZE && cached_objects[j] &&
cached_objects_len[j] >= obj_len) cached_objects_len[j] >= obj_len)
{ {
sds s = cached_objects[j]->ptr; sds s = ptrFromObj(cached_objects[j]);
argv[j] = cached_objects[j]; argv[j] = cached_objects[j];
cached_objects[j] = NULL; cached_objects[j] = NULL;
memcpy(s,obj_s,obj_len+1); memcpy(s,obj_s,obj_len+1);
@ -472,14 +472,14 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
break; break;
} else { } else {
cmdlog = sdscatlen(cmdlog," ",1); cmdlog = sdscatlen(cmdlog," ",1);
cmdlog = sdscatsds(cmdlog,c->argv[j]->ptr); cmdlog = sdscatsds(cmdlog,ptrFromObj(c->argv[j]));
} }
} }
ldbLog(cmdlog); ldbLog(cmdlog);
} }
/* Command lookup */ /* Command lookup */
cmd = lookupCommand(argv[0]->ptr); cmd = lookupCommand(ptrFromObj(argv[0]));
if (!cmd || ((cmd->arity > 0 && cmd->arity != argc) || if (!cmd || ((cmd->arity > 0 && cmd->arity != argc) ||
(argc < -cmd->arity))) (argc < -cmd->arity)))
{ {
@ -524,11 +524,11 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
!server.loading && !server.loading &&
!(server.lua_caller->flags & CLIENT_MASTER)) !(server.lua_caller->flags & CLIENT_MASTER))
{ {
luaPushError(lua, shared.roslaveerr->ptr); luaPushError(lua, ptrFromObj(shared.roslaveerr));
goto cleanup; goto cleanup;
} else if (deny_write_type != DISK_ERROR_TYPE_NONE) { } else if (deny_write_type != DISK_ERROR_TYPE_NONE) {
if (deny_write_type == DISK_ERROR_TYPE_RDB) { if (deny_write_type == DISK_ERROR_TYPE_RDB) {
luaPushError(lua, shared.bgsaveerr->ptr); luaPushError(lua, ptrFromObj(shared.bgsaveerr));
} else { } else {
sds aof_write_err = sdscatfmt(sdsempty(), sds aof_write_err = sdscatfmt(sdsempty(),
"-MISCONF Errors writing to the AOF file: %s\r\n", "-MISCONF Errors writing to the AOF file: %s\r\n",
@ -551,7 +551,7 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
(cmd->flags & CMD_DENYOOM)) (cmd->flags & CMD_DENYOOM))
{ {
if (getMaxmemoryState(NULL,NULL,NULL,NULL) != C_OK) { if (getMaxmemoryState(NULL,NULL,NULL,NULL) != C_OK) {
luaPushError(lua, shared.oomerr->ptr); luaPushError(lua, ptrFromObj(shared.oomerr));
goto cleanup; goto cleanup;
} }
} }
@ -652,9 +652,9 @@ cleanup:
o->refcount == 1 && o->refcount == 1 &&
(o->encoding == OBJ_ENCODING_RAW || (o->encoding == OBJ_ENCODING_RAW ||
o->encoding == OBJ_ENCODING_EMBSTR) && o->encoding == OBJ_ENCODING_EMBSTR) &&
sdslen(o->ptr) <= LUA_CMD_OBJCACHE_MAX_LEN) sdslen(ptrFromObj(o)) <= LUA_CMD_OBJCACHE_MAX_LEN)
{ {
sds s = o->ptr; sds s = ptrFromObj(o);
if (cached_objects[j]) decrRefCount(cached_objects[j]); if (cached_objects[j]) decrRefCount(cached_objects[j]);
cached_objects[j] = o; cached_objects[j] = o;
cached_objects_len[j] = sdsalloc(s); cached_objects_len[j] = sdsalloc(s);
@ -1136,7 +1136,7 @@ void luaSetGlobalArray(lua_State *lua, char *var, robj **elev, int elec) {
lua_newtable(lua); lua_newtable(lua);
for (j = 0; j < elec; j++) { for (j = 0; j < elec; j++) {
lua_pushlstring(lua,(char*)elev[j]->ptr,sdslen(elev[j]->ptr)); lua_pushlstring(lua,(char*)ptrFromObj(elev[j]),sdslen(ptrFromObj(elev[j])));
lua_rawseti(lua,-2,j+1); lua_rawseti(lua,-2,j+1);
} }
lua_setglobal(lua,var); lua_setglobal(lua,var);
@ -1212,7 +1212,7 @@ sds luaCreateFunction(client *c, lua_State *lua, robj *body) {
funcname[0] = 'f'; funcname[0] = 'f';
funcname[1] = '_'; funcname[1] = '_';
sha1hex(funcname+2,body->ptr,sdslen(body->ptr)); sha1hex(funcname+2,ptrFromObj(body),sdslen(ptrFromObj(body)));
sds sha = sdsnewlen(funcname+2,40); sds sha = sdsnewlen(funcname+2,40);
if ((de = dictFind(server.lua_scripts,sha)) != NULL) { if ((de = dictFind(server.lua_scripts,sha)) != NULL) {
@ -1224,7 +1224,7 @@ sds luaCreateFunction(client *c, lua_State *lua, robj *body) {
funcdef = sdscat(funcdef,"function "); funcdef = sdscat(funcdef,"function ");
funcdef = sdscatlen(funcdef,funcname,42); funcdef = sdscatlen(funcdef,funcname,42);
funcdef = sdscatlen(funcdef,"() ",3); funcdef = sdscatlen(funcdef,"() ",3);
funcdef = sdscatlen(funcdef,body->ptr,sdslen(body->ptr)); funcdef = sdscatlen(funcdef,ptrFromObj(body),sdslen(ptrFromObj(body)));
funcdef = sdscatlen(funcdef,"\nend",4); funcdef = sdscatlen(funcdef,"\nend",4);
if (luaL_loadbuffer(lua,funcdef,sdslen(funcdef),"@user_script")) { if (luaL_loadbuffer(lua,funcdef,sdslen(funcdef),"@user_script")) {
@ -1328,11 +1328,11 @@ void evalGenericCommand(client *c, int evalsha) {
funcname[1] = '_'; funcname[1] = '_';
if (!evalsha) { if (!evalsha) {
/* Hash the code if this is an EVAL call */ /* Hash the code if this is an EVAL call */
sha1hex(funcname+2,c->argv[1]->ptr,sdslen(c->argv[1]->ptr)); sha1hex(funcname+2,ptrFromObj(c->argv[1]),sdslen(ptrFromObj(c->argv[1])));
} else { } else {
/* We already have the SHA if it is a EVALSHA */ /* We already have the SHA if it is a EVALSHA */
int j; int j;
char *sha = c->argv[1]->ptr; char *sha = ptrFromObj(c->argv[1]);
/* Convert to lowercase. We don't use tolower since the function /* Convert to lowercase. We don't use tolower since the function
* managed to always show up in the profiler output consuming * managed to always show up in the profiler output consuming
@ -1464,13 +1464,13 @@ void evalGenericCommand(client *c, int evalsha) {
* flush our cache of scripts that can be replicated as EVALSHA, while * flush our cache of scripts that can be replicated as EVALSHA, while
* for AOF we need to do so every time we rewrite the AOF file. */ * for AOF we need to do so every time we rewrite the AOF file. */
if (evalsha && !server.lua_replicate_commands) { if (evalsha && !server.lua_replicate_commands) {
if (!replicationScriptCacheExists(c->argv[1]->ptr)) { if (!replicationScriptCacheExists(ptrFromObj(c->argv[1]))) {
/* This script is not in our script cache, replicate it as /* This script is not in our script cache, replicate it as
* EVAL, then add it into the script cache, as from now on * EVAL, then add it into the script cache, as from now on
* slaves and AOF know about it. */ * slaves and AOF know about it. */
robj *script = dictFetchValue(server.lua_scripts,c->argv[1]->ptr); robj *script = dictFetchValue(server.lua_scripts,ptrFromObj(c->argv[1]));
replicationScriptCacheAdd(c->argv[1]->ptr); replicationScriptCacheAdd(ptrFromObj(c->argv[1]));
serverAssertWithInfo(c,NULL,script != NULL); serverAssertWithInfo(c,NULL,script != NULL);
/* If the script did not produce any changes in the dataset we want /* If the script did not produce any changes in the dataset we want
@ -1500,7 +1500,7 @@ void evalCommand(client *c) {
} }
void evalShaCommand(client *c) { void evalShaCommand(client *c) {
if (sdslen(c->argv[1]->ptr) != 40) { if (sdslen(ptrFromObj(c->argv[1])) != 40) {
/* We know that a match is not possible if the provided SHA is /* We know that a match is not possible if the provided SHA is
* not the right length. So we return an error ASAP, this way * not the right length. So we return an error ASAP, this way
* evalGenericCommand() can be implemented without string length * evalGenericCommand() can be implemented without string length
@ -1517,7 +1517,7 @@ void evalShaCommand(client *c) {
} }
void scriptCommand(client *c) { void scriptCommand(client *c) {
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = { const char *help[] = {
"DEBUG (yes|sync|no) -- Set the debug mode for subsequent scripts executed.", "DEBUG (yes|sync|no) -- Set the debug mode for subsequent scripts executed.",
"EXISTS <sha1> [<sha1> ...] -- Return information about the existence of the scripts in the script cache.", "EXISTS <sha1> [<sha1> ...] -- Return information about the existence of the scripts in the script cache.",
@ -1527,27 +1527,27 @@ void scriptCommand(client *c) {
NULL NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"flush")) { } else if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"flush")) {
scriptingReset(); scriptingReset();
addReply(c,shared.ok); addReply(c,shared.ok);
replicationScriptCacheFlush(); replicationScriptCacheFlush();
server.dirty++; /* Propagating this command is a good idea. */ server.dirty++; /* Propagating this command is a good idea. */
} else if (c->argc >= 2 && !strcasecmp(c->argv[1]->ptr,"exists")) { } else if (c->argc >= 2 && !strcasecmp(ptrFromObj(c->argv[1]),"exists")) {
int j; int j;
addReplyArrayLen(c, c->argc-2); addReplyArrayLen(c, c->argc-2);
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
if (dictFind(server.lua_scripts,c->argv[j]->ptr)) if (dictFind(server.lua_scripts,ptrFromObj(c->argv[j])))
addReply(c,shared.cone); addReply(c,shared.cone);
else else
addReply(c,shared.czero); addReply(c,shared.czero);
} }
} else if (c->argc == 3 && !strcasecmp(c->argv[1]->ptr,"load")) { } else if (c->argc == 3 && !strcasecmp(ptrFromObj(c->argv[1]),"load")) {
sds sha = luaCreateFunction(c,server.lua,c->argv[2]); sds sha = luaCreateFunction(c,server.lua,c->argv[2]);
if (sha == NULL) return; /* The error was sent by luaCreateFunction(). */ if (sha == NULL) return; /* The error was sent by luaCreateFunction(). */
addReplyBulkCBuffer(c,sha,40); addReplyBulkCBuffer(c,sha,40);
forceCommandPropagation(c,PROPAGATE_REPL|PROPAGATE_AOF); forceCommandPropagation(c,PROPAGATE_REPL|PROPAGATE_AOF);
} else if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"kill")) { } else if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"kill")) {
if (server.lua_caller == NULL) { if (server.lua_caller == NULL) {
addReplySds(c,sdsnew("-NOTBUSY No scripts in execution right now.\r\n")); addReplySds(c,sdsnew("-NOTBUSY No scripts in execution right now.\r\n"));
} else if (server.lua_caller->flags & CLIENT_MASTER) { } else if (server.lua_caller->flags & CLIENT_MASTER) {
@ -1558,18 +1558,18 @@ NULL
server.lua_kill = 1; server.lua_kill = 1;
addReply(c,shared.ok); addReply(c,shared.ok);
} }
} else if (c->argc == 3 && !strcasecmp(c->argv[1]->ptr,"debug")) { } else if (c->argc == 3 && !strcasecmp(ptrFromObj(c->argv[1]),"debug")) {
if (clientHasPendingReplies(c)) { if (clientHasPendingReplies(c)) {
addReplyError(c,"SCRIPT DEBUG must be called outside a pipeline"); addReplyError(c,"SCRIPT DEBUG must be called outside a pipeline");
return; return;
} }
if (!strcasecmp(c->argv[2]->ptr,"no")) { if (!strcasecmp(ptrFromObj(c->argv[2]),"no")) {
ldbDisable(c); ldbDisable(c);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[2]->ptr,"yes")) { } else if (!strcasecmp(ptrFromObj(c->argv[2]),"yes")) {
ldbEnable(c); ldbEnable(c);
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[2]->ptr,"sync")) { } else if (!strcasecmp(ptrFromObj(c->argv[2]),"sync")) {
ldbEnable(c); ldbEnable(c);
addReply(c,shared.ok); addReply(c,shared.ok);
c->flags |= CLIENT_LUA_DEBUG_SYNC; c->flags |= CLIENT_LUA_DEBUG_SYNC;
@ -1724,7 +1724,7 @@ int ldbStartSession(client *c) {
/* First argument of EVAL is the script itself. We split it into different /* First argument of EVAL is the script itself. We split it into different
* lines since this is the way the debugger accesses the source code. */ * lines since this is the way the debugger accesses the source code. */
sds srcstring = sdsdup(c->argv[1]->ptr); sds srcstring = sdsdup(ptrFromObj(c->argv[1]));
size_t srclen = sdslen(srcstring); size_t srclen = sdslen(srcstring);
while(srclen && (srcstring[srclen-1] == '\n' || while(srclen && (srcstring[srclen-1] == '\n' ||
srcstring[srclen-1] == '\r')) srcstring[srclen-1] == '\r'))

View File

@ -2950,7 +2950,7 @@ sentinelRedisInstance *sentinelGetMasterByNameOrReplyError(client *c,
{ {
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
ri = dictFetchValue(sentinel.masters,name->ptr); ri = dictFetchValue(sentinel.masters,ptrFromObj(name));
if (!ri) { if (!ri) {
addReplyError(c,"No such master with that name"); addReplyError(c,"No such master with that name");
return NULL; return NULL;
@ -2984,11 +2984,11 @@ int sentinelIsQuorumReachable(sentinelRedisInstance *master, int *usableptr) {
} }
void sentinelCommand(client *c) { void sentinelCommand(client *c) {
if (!strcasecmp(c->argv[1]->ptr,"masters")) { if (!strcasecmp(ptrFromObj(c->argv[1]),"masters")) {
/* SENTINEL MASTERS */ /* SENTINEL MASTERS */
if (c->argc != 2) goto numargserr; if (c->argc != 2) goto numargserr;
addReplyDictOfRedisInstances(c,sentinel.masters); addReplyDictOfRedisInstances(c,sentinel.masters);
} else if (!strcasecmp(c->argv[1]->ptr,"master")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"master")) {
/* SENTINEL MASTER <name> */ /* SENTINEL MASTER <name> */
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
@ -2996,8 +2996,8 @@ void sentinelCommand(client *c) {
if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2]))
== NULL) return; == NULL) return;
addReplySentinelRedisInstance(c,ri); addReplySentinelRedisInstance(c,ri);
} else if (!strcasecmp(c->argv[1]->ptr,"slaves") || } else if (!strcasecmp(ptrFromObj(c->argv[1]),"slaves") ||
!strcasecmp(c->argv[1]->ptr,"replicas")) !strcasecmp(ptrFromObj(c->argv[1]),"replicas"))
{ {
/* SENTINEL REPLICAS <master-name> */ /* SENTINEL REPLICAS <master-name> */
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
@ -3006,7 +3006,7 @@ void sentinelCommand(client *c) {
if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) == NULL) if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) == NULL)
return; return;
addReplyDictOfRedisInstances(c,ri->slaves); addReplyDictOfRedisInstances(c,ri->slaves);
} else if (!strcasecmp(c->argv[1]->ptr,"sentinels")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"sentinels")) {
/* SENTINEL SENTINELS <master-name> */ /* SENTINEL SENTINELS <master-name> */
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
@ -3014,7 +3014,7 @@ void sentinelCommand(client *c) {
if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) == NULL) if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) == NULL)
return; return;
addReplyDictOfRedisInstances(c,ri->sentinels); addReplyDictOfRedisInstances(c,ri->sentinels);
} else if (!strcasecmp(c->argv[1]->ptr,"is-master-down-by-addr")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"is-master-down-by-addr")) {
/* SENTINEL IS-MASTER-DOWN-BY-ADDR <ip> <port> <current-epoch> <runid> /* SENTINEL IS-MASTER-DOWN-BY-ADDR <ip> <port> <current-epoch> <runid>
* *
* Arguments: * Arguments:
@ -3045,7 +3045,7 @@ void sentinelCommand(client *c) {
!= C_OK) != C_OK)
return; return;
ri = getSentinelRedisInstanceByAddrAndRunID(sentinel.masters, ri = getSentinelRedisInstanceByAddrAndRunID(sentinel.masters,
c->argv[2]->ptr,port,NULL); ptrFromObj(c->argv[2]),port,NULL);
/* It exists? Is actually a master? Is subjectively down? It's down. /* It exists? Is actually a master? Is subjectively down? It's down.
* Note: if we are in tilt mode we always reply with "0". */ * Note: if we are in tilt mode we always reply with "0". */
@ -3055,9 +3055,9 @@ void sentinelCommand(client *c) {
/* Vote for the master (or fetch the previous vote) if the request /* Vote for the master (or fetch the previous vote) if the request
* includes a runid, otherwise the sender is not seeking for a vote. */ * includes a runid, otherwise the sender is not seeking for a vote. */
if (ri && ri->flags & SRI_MASTER && strcasecmp(c->argv[5]->ptr,"*")) { if (ri && ri->flags & SRI_MASTER && strcasecmp(ptrFromObj(c->argv[5]),"*")) {
leader = sentinelVoteLeader(ri,(uint64_t)req_epoch, leader = sentinelVoteLeader(ri,(uint64_t)req_epoch,
c->argv[5]->ptr, ptrFromObj(c->argv[5]),
&leader_epoch); &leader_epoch);
} }
@ -3068,16 +3068,16 @@ void sentinelCommand(client *c) {
addReplyBulkCString(c, leader ? leader : "*"); addReplyBulkCString(c, leader ? leader : "*");
addReplyLongLong(c, (long long)leader_epoch); addReplyLongLong(c, (long long)leader_epoch);
if (leader) sdsfree(leader); if (leader) sdsfree(leader);
} else if (!strcasecmp(c->argv[1]->ptr,"reset")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"reset")) {
/* SENTINEL RESET <pattern> */ /* SENTINEL RESET <pattern> */
if (c->argc != 3) goto numargserr; if (c->argc != 3) goto numargserr;
addReplyLongLong(c,sentinelResetMastersByPattern(c->argv[2]->ptr,SENTINEL_GENERATE_EVENT)); addReplyLongLong(c,sentinelResetMastersByPattern(ptrFromObj(c->argv[2]),SENTINEL_GENERATE_EVENT));
} else if (!strcasecmp(c->argv[1]->ptr,"get-master-addr-by-name")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"get-master-addr-by-name")) {
/* SENTINEL GET-MASTER-ADDR-BY-NAME <master-name> */ /* SENTINEL GET-MASTER-ADDR-BY-NAME <master-name> */
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
if (c->argc != 3) goto numargserr; if (c->argc != 3) goto numargserr;
ri = sentinelGetMasterByName(c->argv[2]->ptr); ri = sentinelGetMasterByName(ptrFromObj(c->argv[2]));
if (ri == NULL) { if (ri == NULL) {
addReplyNullArray(c); addReplyNullArray(c);
} else { } else {
@ -3087,7 +3087,7 @@ void sentinelCommand(client *c) {
addReplyBulkCString(c,addr->ip); addReplyBulkCString(c,addr->ip);
addReplyBulkLongLong(c,addr->port); addReplyBulkLongLong(c,addr->port);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"failover")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"failover")) {
/* SENTINEL FAILOVER <master-name> */ /* SENTINEL FAILOVER <master-name> */
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
@ -3107,12 +3107,12 @@ void sentinelCommand(client *c) {
sentinelStartFailover(ri); sentinelStartFailover(ri);
ri->flags |= SRI_FORCE_FAILOVER; ri->flags |= SRI_FORCE_FAILOVER;
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"pending-scripts")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"pending-scripts")) {
/* SENTINEL PENDING-SCRIPTS */ /* SENTINEL PENDING-SCRIPTS */
if (c->argc != 2) goto numargserr; if (c->argc != 2) goto numargserr;
sentinelPendingScriptsCommand(c); sentinelPendingScriptsCommand(c);
} else if (!strcasecmp(c->argv[1]->ptr,"monitor")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"monitor")) {
/* SENTINEL MONITOR <name> <ip> <port> <quorum> */ /* SENTINEL MONITOR <name> <ip> <port> <quorum> */
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
long quorum, port; long quorum, port;
@ -3132,14 +3132,14 @@ void sentinelCommand(client *c) {
/* Make sure the IP field is actually a valid IP before passing it /* Make sure the IP field is actually a valid IP before passing it
* to createSentinelRedisInstance(), otherwise we may trigger a * to createSentinelRedisInstance(), otherwise we may trigger a
* DNS lookup at runtime. */ * DNS lookup at runtime. */
if (anetResolveIP(NULL,c->argv[3]->ptr,ip,sizeof(ip)) == ANET_ERR) { if (anetResolveIP(NULL,ptrFromObj(c->argv[3]),ip,sizeof(ip)) == ANET_ERR) {
addReplyError(c,"Invalid IP address specified"); addReplyError(c,"Invalid IP address specified");
return; return;
} }
/* Parameters are valid. Try to create the master instance. */ /* Parameters are valid. Try to create the master instance. */
ri = createSentinelRedisInstance(c->argv[2]->ptr,SRI_MASTER, ri = createSentinelRedisInstance(ptrFromObj(c->argv[2]),SRI_MASTER,
c->argv[3]->ptr,port,quorum,NULL); ptrFromObj(c->argv[3]),port,quorum,NULL);
if (ri == NULL) { if (ri == NULL) {
switch(errno) { switch(errno) {
case EBUSY: case EBUSY:
@ -3157,12 +3157,12 @@ void sentinelCommand(client *c) {
sentinelEvent(LL_WARNING,"+monitor",ri,"%@ quorum %d",ri->quorum); sentinelEvent(LL_WARNING,"+monitor",ri,"%@ quorum %d",ri->quorum);
addReply(c,shared.ok); addReply(c,shared.ok);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"flushconfig")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"flushconfig")) {
if (c->argc != 2) goto numargserr; if (c->argc != 2) goto numargserr;
sentinelFlushConfig(); sentinelFlushConfig();
addReply(c,shared.ok); addReply(c,shared.ok);
return; return;
} else if (!strcasecmp(c->argv[1]->ptr,"remove")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"remove")) {
/* SENTINEL REMOVE <name> */ /* SENTINEL REMOVE <name> */
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
@ -3170,10 +3170,10 @@ void sentinelCommand(client *c) {
if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2]))
== NULL) return; == NULL) return;
sentinelEvent(LL_WARNING,"-monitor",ri,"%@"); sentinelEvent(LL_WARNING,"-monitor",ri,"%@");
dictDelete(sentinel.masters,c->argv[2]->ptr); dictDelete(sentinel.masters,ptrFromObj(c->argv[2]));
sentinelFlushConfig(); sentinelFlushConfig();
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"ckquorum")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"ckquorum")) {
/* SENTINEL CKQUORUM <name> */ /* SENTINEL CKQUORUM <name> */
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
int usable; int usable;
@ -3200,10 +3200,10 @@ void sentinelCommand(client *c) {
e = sdscat(e,"\r\n"); e = sdscat(e,"\r\n");
addReplySds(c,e); addReplySds(c,e);
} }
} else if (!strcasecmp(c->argv[1]->ptr,"set")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"set")) {
if (c->argc < 3) goto numargserr; if (c->argc < 3) goto numargserr;
sentinelSetCommand(c); sentinelSetCommand(c);
} else if (!strcasecmp(c->argv[1]->ptr,"info-cache")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"info-cache")) {
/* SENTINEL INFO-CACHE <name> */ /* SENTINEL INFO-CACHE <name> */
if (c->argc < 2) goto numargserr; if (c->argc < 2) goto numargserr;
mstime_t now = mstime(); mstime_t now = mstime();
@ -3219,7 +3219,7 @@ void sentinelCommand(client *c) {
for (int i = 2; i < c->argc; i++) { for (int i = 2; i < c->argc; i++) {
sentinelRedisInstance *ri; sentinelRedisInstance *ri;
ri = sentinelGetMasterByName(c->argv[i]->ptr); ri = sentinelGetMasterByName(ptrFromObj(c->argv[i]));
if (!ri) continue; /* ignore non-existing names */ if (!ri) continue; /* ignore non-existing names */
dictAdd(masters_local, ri->name, ri); dictAdd(masters_local, ri->name, ri);
} }
@ -3265,24 +3265,24 @@ void sentinelCommand(client *c) {
} }
dictReleaseIterator(di); dictReleaseIterator(di);
if (masters_local != sentinel.masters) dictRelease(masters_local); if (masters_local != sentinel.masters) dictRelease(masters_local);
} else if (!strcasecmp(c->argv[1]->ptr,"simulate-failure")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"simulate-failure")) {
/* SENTINEL SIMULATE-FAILURE <flag> <flag> ... <flag> */ /* SENTINEL SIMULATE-FAILURE <flag> <flag> ... <flag> */
int j; int j;
sentinel.simfailure_flags = SENTINEL_SIMFAILURE_NONE; sentinel.simfailure_flags = SENTINEL_SIMFAILURE_NONE;
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
if (!strcasecmp(c->argv[j]->ptr,"crash-after-election")) { if (!strcasecmp(ptrFromObj(c->argv[j]),"crash-after-election")) {
sentinel.simfailure_flags |= sentinel.simfailure_flags |=
SENTINEL_SIMFAILURE_CRASH_AFTER_ELECTION; SENTINEL_SIMFAILURE_CRASH_AFTER_ELECTION;
serverLog(LL_WARNING,"Failure simulation: this Sentinel " serverLog(LL_WARNING,"Failure simulation: this Sentinel "
"will crash after being successfully elected as failover " "will crash after being successfully elected as failover "
"leader"); "leader");
} else if (!strcasecmp(c->argv[j]->ptr,"crash-after-promotion")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"crash-after-promotion")) {
sentinel.simfailure_flags |= sentinel.simfailure_flags |=
SENTINEL_SIMFAILURE_CRASH_AFTER_PROMOTION; SENTINEL_SIMFAILURE_CRASH_AFTER_PROMOTION;
serverLog(LL_WARNING,"Failure simulation: this Sentinel " serverLog(LL_WARNING,"Failure simulation: this Sentinel "
"will crash after promoting the selected replica to master"); "will crash after promoting the selected replica to master");
} else if (!strcasecmp(c->argv[j]->ptr,"help")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"help")) {
addReplyArrayLen(c,2); addReplyArrayLen(c,2);
addReplyBulkCString(c,"crash-after-election"); addReplyBulkCString(c,"crash-after-election");
addReplyBulkCString(c,"crash-after-promotion"); addReplyBulkCString(c,"crash-after-promotion");
@ -3294,13 +3294,13 @@ void sentinelCommand(client *c) {
addReply(c,shared.ok); addReply(c,shared.ok);
} else { } else {
addReplyErrorFormat(c,"Unknown sentinel subcommand '%s'", addReplyErrorFormat(c,"Unknown sentinel subcommand '%s'",
(char*)c->argv[1]->ptr); (char*)ptrFromObj(c->argv[1]));
} }
return; return;
numargserr: numargserr:
addReplyErrorFormat(c,"Wrong number of arguments for 'sentinel %s'", addReplyErrorFormat(c,"Wrong number of arguments for 'sentinel %s'",
(char*)c->argv[1]->ptr); (char*)ptrFromObj(c->argv[1]));
} }
#define info_section_from_redis(section_name) do { \ #define info_section_from_redis(section_name) do { \
@ -3321,7 +3321,7 @@ void sentinelInfoCommand(client *c) {
} }
int defsections = 0, allsections = 0; int defsections = 0, allsections = 0;
char *section = c->argc == 2 ? c->argv[1]->ptr : NULL; char *section = c->argc == 2 ? ptrFromObj(c->argv[1]) : NULL;
if (section) { if (section) {
allsections = !strcasecmp(section,"all"); allsections = !strcasecmp(section,"all");
defsections = !strcasecmp(section,"default"); defsections = !strcasecmp(section,"default");
@ -3409,7 +3409,7 @@ void sentinelSetCommand(client *c) {
/* Process option - value pairs. */ /* Process option - value pairs. */
for (j = 3; j < c->argc; j++) { for (j = 3; j < c->argc; j++) {
int moreargs = (c->argc-1) - j; int moreargs = (c->argc-1) - j;
option = c->argv[j]->ptr; option = ptrFromObj(c->argv[j]);
long long ll; long long ll;
int old_j = j; /* Used to know what to log as an event. */ int old_j = j; /* Used to know what to log as an event. */
@ -3443,7 +3443,7 @@ void sentinelSetCommand(client *c) {
changes++; changes++;
} else if (!strcasecmp(option,"notification-script") && moreargs > 0) { } else if (!strcasecmp(option,"notification-script") && moreargs > 0) {
/* notification-script <path> */ /* notification-script <path> */
char *value = c->argv[++j]->ptr; char *value = ptrFromObj(c->argv[++j]);
if (sentinel.deny_scripts_reconfig) { if (sentinel.deny_scripts_reconfig) {
addReplyError(c, addReplyError(c,
"Reconfiguration of scripts path is denied for " "Reconfiguration of scripts path is denied for "
@ -3463,7 +3463,7 @@ void sentinelSetCommand(client *c) {
changes++; changes++;
} else if (!strcasecmp(option,"client-reconfig-script") && moreargs > 0) { } else if (!strcasecmp(option,"client-reconfig-script") && moreargs > 0) {
/* client-reconfig-script <path> */ /* client-reconfig-script <path> */
char *value = c->argv[++j]->ptr; char *value = ptrFromObj(c->argv[++j]);
if (sentinel.deny_scripts_reconfig) { if (sentinel.deny_scripts_reconfig) {
addReplyError(c, addReplyError(c,
"Reconfiguration of scripts path is denied for " "Reconfiguration of scripts path is denied for "
@ -3484,7 +3484,7 @@ void sentinelSetCommand(client *c) {
changes++; changes++;
} else if (!strcasecmp(option,"auth-pass") && moreargs > 0) { } else if (!strcasecmp(option,"auth-pass") && moreargs > 0) {
/* auth-pass <password> */ /* auth-pass <password> */
char *value = c->argv[++j]->ptr; char *value = ptrFromObj(c->argv[++j]);
sdsfree(ri->auth_pass); sdsfree(ri->auth_pass);
ri->auth_pass = strlen(value) ? sdsnew(value) : NULL; ri->auth_pass = strlen(value) ? sdsnew(value) : NULL;
changes++; changes++;
@ -3499,8 +3499,8 @@ void sentinelSetCommand(client *c) {
changes++; changes++;
} else if (!strcasecmp(option,"rename-command") && moreargs > 1) { } else if (!strcasecmp(option,"rename-command") && moreargs > 1) {
/* rename-command <oldname> <newname> */ /* rename-command <oldname> <newname> */
sds oldname = c->argv[++j]->ptr; sds oldname = ptrFromObj(c->argv[++j]);
sds newname = c->argv[++j]->ptr; sds newname = ptrFromObj(c->argv[++j]);
if ((sdslen(oldname) == 0) || (sdslen(newname) == 0)) { if ((sdslen(oldname) == 0) || (sdslen(newname) == 0)) {
badarg = sdslen(newname) ? j-1 : j; badarg = sdslen(newname) ? j-1 : j;
@ -3529,16 +3529,16 @@ void sentinelSetCommand(client *c) {
int numargs = j-old_j+1; int numargs = j-old_j+1;
switch(numargs) { switch(numargs) {
case 2: case 2:
sentinelEvent(LL_WARNING,"+set",ri,"%@ %s %s",c->argv[old_j]->ptr, sentinelEvent(LL_WARNING,"+set",ri,"%@ %s %s",ptrFromObj(c->argv[old_j]),
c->argv[old_j+1]->ptr); ptrFromObj(c->argv[old_j+1]));
break; break;
case 3: case 3:
sentinelEvent(LL_WARNING,"+set",ri,"%@ %s %s %s",c->argv[old_j]->ptr, sentinelEvent(LL_WARNING,"+set",ri,"%@ %s %s %s",ptrFromObj(c->argv[old_j]),
c->argv[old_j+1]->ptr, ptrFromObj(c->argv[old_j+1]),
c->argv[old_j+2]->ptr); ptrFromObj(c->argv[old_j+2]));
break; break;
default: default:
sentinelEvent(LL_WARNING,"+set",ri,"%@ %s",c->argv[old_j]->ptr); sentinelEvent(LL_WARNING,"+set",ri,"%@ %s",ptrFromObj(c->argv[old_j]));
break; break;
} }
} }
@ -3550,7 +3550,7 @@ void sentinelSetCommand(client *c) {
badfmt: /* Bad format errors */ badfmt: /* Bad format errors */
if (changes) sentinelFlushConfig(); if (changes) sentinelFlushConfig();
addReplyErrorFormat(c,"Invalid argument '%s' for SENTINEL SET '%s'", addReplyErrorFormat(c,"Invalid argument '%s' for SENTINEL SET '%s'",
(char*)c->argv[badarg]->ptr,option); (char*)ptrFromObj(c->argv[badarg]),option);
} }
/* Our fake PUBLISH command: it is actually useful only to receive hello messages /* Our fake PUBLISH command: it is actually useful only to receive hello messages
@ -3560,11 +3560,11 @@ badfmt: /* Bad format errors */
* Because we have a Sentinel PUBLISH, the code to send hello messages is the same * Because we have a Sentinel PUBLISH, the code to send hello messages is the same
* for all the three kind of instances: masters, slaves, sentinels. */ * for all the three kind of instances: masters, slaves, sentinels. */
void sentinelPublishCommand(client *c) { void sentinelPublishCommand(client *c) {
if (strcmp(c->argv[1]->ptr,SENTINEL_HELLO_CHANNEL)) { if (strcmp(ptrFromObj(c->argv[1]),SENTINEL_HELLO_CHANNEL)) {
addReplyError(c, "Only HELLO messages are accepted by Sentinel instances."); addReplyError(c, "Only HELLO messages are accepted by Sentinel instances.");
return; return;
} }
sentinelProcessHelloMessage(c->argv[2]->ptr,sdslen(c->argv[2]->ptr)); sentinelProcessHelloMessage(ptrFromObj(c->argv[2]),sdslen(ptrFromObj(c->argv[2])));
addReplyLongLong(c,1); addReplyLongLong(c,1);
} }

View File

@ -1184,12 +1184,13 @@ int dictObjKeyCompare(void *privdata, const void *key1,
const void *key2) const void *key2)
{ {
const robj *o1 = key1, *o2 = key2; const robj *o1 = key1, *o2 = key2;
return dictSdsKeyCompare(privdata,o1->ptr,o2->ptr); return dictSdsKeyCompare(privdata,ptrFromObj(o1),ptrFromObj(o2));
} }
uint64_t dictObjHash(const void *key) { uint64_t dictObjHash(const void *key) {
const robj *o = key; const robj *o = key;
return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr)); void *ptr = ptrFromObj(o);
return dictGenHashFunction(ptr, sdslen((sds)ptr));
} }
uint64_t dictSdsHash(const void *key) { uint64_t dictSdsHash(const void *key) {
@ -1208,11 +1209,11 @@ int dictEncObjKeyCompare(void *privdata, const void *key1,
if (o1->encoding == OBJ_ENCODING_INT && if (o1->encoding == OBJ_ENCODING_INT &&
o2->encoding == OBJ_ENCODING_INT) o2->encoding == OBJ_ENCODING_INT)
return o1->ptr == o2->ptr; return ptrFromObj(o1) == ptrFromObj(o2);
o1 = getDecodedObject(o1); o1 = getDecodedObject(o1);
o2 = getDecodedObject(o2); o2 = getDecodedObject(o2);
cmp = dictSdsKeyCompare(privdata,o1->ptr,o2->ptr); cmp = dictSdsKeyCompare(privdata,ptrFromObj(o1),ptrFromObj(o2));
decrRefCount(o1); decrRefCount(o1);
decrRefCount(o2); decrRefCount(o2);
return cmp; return cmp;
@ -1222,19 +1223,19 @@ uint64_t dictEncObjHash(const void *key) {
robj *o = (robj*) key; robj *o = (robj*) key;
if (sdsEncodedObject(o)) { if (sdsEncodedObject(o)) {
return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr)); return dictGenHashFunction(ptrFromObj(o), sdslen((sds)ptrFromObj(o)));
} else { } else {
if (o->encoding == OBJ_ENCODING_INT) { if (o->encoding == OBJ_ENCODING_INT) {
char buf[32]; char buf[32];
int len; int len;
len = ll2string(buf,32,(long)o->ptr); len = ll2string(buf,32,(long)ptrFromObj(o));
return dictGenHashFunction((unsigned char*)buf, len); return dictGenHashFunction((unsigned char*)buf, len);
} else { } else {
uint64_t hash; uint64_t hash;
o = getDecodedObject(o); o = getDecodedObject(o);
hash = dictGenHashFunction(o->ptr, sdslen((sds)o->ptr)); hash = dictGenHashFunction(ptrFromObj(o), sdslen((sds)ptrFromObj(o)));
decrRefCount(o); decrRefCount(o);
return hash; return hash;
} }
@ -3273,7 +3274,7 @@ int processCommand(client *c) {
* go through checking for replication and QUIT will cause trouble * go through checking for replication and QUIT will cause trouble
* when FORCE_REPLICATION is enabled and would be implemented in * when FORCE_REPLICATION is enabled and would be implemented in
* a regular command proc. */ * a regular command proc. */
if (!strcasecmp(c->argv[0]->ptr,"quit")) { if (!strcasecmp(ptrFromObj(c->argv[0]),"quit")) {
addReply(c,shared.ok); addReply(c,shared.ok);
c->flags |= CLIENT_CLOSE_AFTER_REPLY; c->flags |= CLIENT_CLOSE_AFTER_REPLY;
return C_ERR; return C_ERR;
@ -3281,15 +3282,15 @@ int processCommand(client *c) {
/* Now lookup the command and check ASAP about trivial error conditions /* Now lookup the command and check ASAP about trivial error conditions
* such as wrong arity, bad command name and so forth. */ * such as wrong arity, bad command name and so forth. */
c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr); c->cmd = c->lastcmd = lookupCommand(ptrFromObj(c->argv[0]));
if (!c->cmd) { if (!c->cmd) {
flagTransaction(c); flagTransaction(c);
sds args = sdsempty(); sds args = sdsempty();
int i; int i;
for (i=1; i < c->argc && sdslen(args) < 128; i++) for (i=1; i < c->argc && sdslen(args) < 128; i++)
args = sdscatprintf(args, "`%.*s`, ", 128-(int)sdslen(args), (char*)c->argv[i]->ptr); args = sdscatprintf(args, "`%.*s`, ", 128-(int)sdslen(args), (char*)ptrFromObj(c->argv[i]));
addReplyErrorFormat(c,"unknown command `%s`, with args beginning with: %s", addReplyErrorFormat(c,"unknown command `%s`, with args beginning with: %s",
(char*)c->argv[0]->ptr, args); (char*)ptrFromObj(c->argv[0]), args);
sdsfree(args); sdsfree(args);
return C_OK; return C_OK;
} else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) || } else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) ||
@ -3456,10 +3457,10 @@ int processCommand(client *c) {
c->cmd->proc != replconfCommand && c->cmd->proc != replconfCommand &&
!(c->cmd->proc == shutdownCommand && !(c->cmd->proc == shutdownCommand &&
c->argc == 2 && c->argc == 2 &&
tolower(((char*)c->argv[1]->ptr)[0]) == 'n') && tolower(((char*)ptrFromObj(c->argv[1]))[0]) == 'n') &&
!(c->cmd->proc == scriptCommand && !(c->cmd->proc == scriptCommand &&
c->argc == 2 && c->argc == 2 &&
tolower(((char*)c->argv[1]->ptr)[0]) == 'k')) tolower(((char*)ptrFromObj(c->argv[1]))[0]) == 'k'))
{ {
flagTransaction(c); flagTransaction(c);
addReply(c, shared.slowscripterr); addReply(c, shared.slowscripterr);
@ -3632,7 +3633,7 @@ void authCommand(client *c) {
if (ACLCheckUserCredentials(username,password) == C_OK) { if (ACLCheckUserCredentials(username,password) == C_OK) {
c->authenticated = 1; c->authenticated = 1;
c->puser = ACLGetUserByName(username->ptr,sdslen(username->ptr)); c->puser = ACLGetUserByName(ptrFromObj(username),sdslen(ptrFromObj(username)));
addReply(c,shared.ok); addReply(c,shared.ok);
} else { } else {
addReplyError(c,"-WRONGPASS invalid username-password pair"); addReplyError(c,"-WRONGPASS invalid username-password pair");
@ -3736,7 +3737,7 @@ void commandCommand(client *c) {
dictIterator *di; dictIterator *di;
dictEntry *de; dictEntry *de;
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = { const char *help[] = {
"(no subcommand) -- Return details about all Redis commands.", "(no subcommand) -- Return details about all Redis commands.",
"COUNT -- Return the total number of commands in this Redis server.", "COUNT -- Return the total number of commands in this Redis server.",
@ -3752,16 +3753,16 @@ NULL
addReplyCommand(c, dictGetVal(de)); addReplyCommand(c, dictGetVal(de));
} }
dictReleaseIterator(di); dictReleaseIterator(di);
} else if (!strcasecmp(c->argv[1]->ptr, "info")) { } else if (!strcasecmp(ptrFromObj(c->argv[1]), "info")) {
int i; int i;
addReplyArrayLen(c, c->argc-2); addReplyArrayLen(c, c->argc-2);
for (i = 2; i < c->argc; i++) { for (i = 2; i < c->argc; i++) {
addReplyCommand(c, dictFetchValue(server.commands, c->argv[i]->ptr)); addReplyCommand(c, dictFetchValue(server.commands, ptrFromObj(c->argv[i])));
} }
} else if (!strcasecmp(c->argv[1]->ptr, "count") && c->argc == 2) { } else if (!strcasecmp(ptrFromObj(c->argv[1]), "count") && c->argc == 2) {
addReplyLongLong(c, dictSize(server.commands)); addReplyLongLong(c, dictSize(server.commands));
} else if (!strcasecmp(c->argv[1]->ptr,"getkeys") && c->argc >= 3) { } else if (!strcasecmp(ptrFromObj(c->argv[1]),"getkeys") && c->argc >= 3) {
struct redisCommand *cmd = lookupCommand(c->argv[2]->ptr); struct redisCommand *cmd = lookupCommand(ptrFromObj(c->argv[2]));
int *keys, numkeys, j; int *keys, numkeys, j;
if (!cmd) { if (!cmd) {
@ -4379,7 +4380,7 @@ sds genRedisInfoString(char *section) {
} }
void infoCommand(client *c) { void infoCommand(client *c) {
char *section = c->argc == 2 ? c->argv[1]->ptr : "default"; char *section = c->argc == 2 ? ptrFromObj(c->argv[1]) : "default";
if (c->argc > 2) { if (c->argc > 2) {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);

View File

@ -633,9 +633,16 @@ typedef struct redisObject {
* LFU data (least significant 8 bits frequency * LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */ * and most significant 16 bits access time). */
int refcount; int refcount;
void *ptr; void *m_ptr;
} robj; } robj;
inline void *ptrFromObj(const robj *o)
{
if (o->type == OBJ_STRING && o->encoding == OBJ_ENCODING_EMBSTR)
return ((char*)&((robj*)o)->m_ptr) + sizeof(struct sdshdr8);
return o->m_ptr;
}
/* Macro used to initialize a Redis object allocated on the stack. /* Macro used to initialize a Redis object allocated on the stack.
* Note that this macro is taken near the structure definition to make sure * Note that this macro is taken near the structure definition to make sure
* we'll update it when the structure is changed, to avoid bugs like * we'll update it when the structure is changed, to avoid bugs like
@ -644,7 +651,7 @@ typedef struct redisObject {
_var.refcount = 1; \ _var.refcount = 1; \
_var.type = OBJ_STRING; \ _var.type = OBJ_STRING; \
_var.encoding = OBJ_ENCODING_RAW; \ _var.encoding = OBJ_ENCODING_RAW; \
_var.ptr = _ptr; \ _var.m_ptr = _ptr; \
} while(0) } while(0)
struct evictionPoolEntry; /* Defined in evict.c */ struct evictionPoolEntry; /* Defined in evict.c */

View File

@ -64,13 +64,13 @@ slowlogEntry *slowlogCreateEntry(client *c, robj **argv, int argc, long long dur
/* Trim too long strings as well... */ /* Trim too long strings as well... */
if (argv[j]->type == OBJ_STRING && if (argv[j]->type == OBJ_STRING &&
sdsEncodedObject(argv[j]) && sdsEncodedObject(argv[j]) &&
sdslen(argv[j]->ptr) > SLOWLOG_ENTRY_MAX_STRING) sdslen(ptrFromObj(argv[j])) > SLOWLOG_ENTRY_MAX_STRING)
{ {
sds s = sdsnewlen(argv[j]->ptr, SLOWLOG_ENTRY_MAX_STRING); sds s = sdsnewlen(ptrFromObj(argv[j]), SLOWLOG_ENTRY_MAX_STRING);
s = sdscatprintf(s,"... (%lu more bytes)", s = sdscatprintf(s,"... (%lu more bytes)",
(unsigned long) (unsigned long)
sdslen(argv[j]->ptr) - SLOWLOG_ENTRY_MAX_STRING); sdslen(ptrFromObj(argv[j])) - SLOWLOG_ENTRY_MAX_STRING);
se->argv[j] = createObject(OBJ_STRING,s); se->argv[j] = createObject(OBJ_STRING,s);
} else if (argv[j]->refcount == OBJ_SHARED_REFCOUNT) { } else if (argv[j]->refcount == OBJ_SHARED_REFCOUNT) {
se->argv[j] = argv[j]; se->argv[j] = argv[j];
@ -89,7 +89,7 @@ slowlogEntry *slowlogCreateEntry(client *c, robj **argv, int argc, long long dur
se->duration = duration; se->duration = duration;
se->id = server.slowlog_entry_id++; se->id = server.slowlog_entry_id++;
se->peerid = sdsnew(getClientPeerId(c)); se->peerid = sdsnew(getClientPeerId(c));
se->cname = c->name ? sdsnew(c->name->ptr) : sdsempty(); se->cname = c->name ? sdsnew(ptrFromObj(c->name)) : sdsempty();
return se; return se;
} }
@ -140,7 +140,7 @@ void slowlogReset(void) {
/* The SLOWLOG command. Implements all the subcommands needed to handle the /* The SLOWLOG command. Implements all the subcommands needed to handle the
* Redis slow log. */ * Redis slow log. */
void slowlogCommand(client *c) { void slowlogCommand(client *c) {
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) { if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = { const char *help[] = {
"GET [count] -- Return top entries from the slowlog (default: 10)." "GET [count] -- Return top entries from the slowlog (default: 10)."
" Entries are made of:", " Entries are made of:",
@ -150,13 +150,13 @@ void slowlogCommand(client *c) {
NULL NULL
}; };
addReplyHelp(c, help); addReplyHelp(c, help);
} else if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"reset")) { } else if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"reset")) {
slowlogReset(); slowlogReset();
addReply(c,shared.ok); addReply(c,shared.ok);
} else if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"len")) { } else if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"len")) {
addReplyLongLong(c,listLength(server.slowlog)); addReplyLongLong(c,listLength(server.slowlog));
} else if ((c->argc == 2 || c->argc == 3) && } else if ((c->argc == 2 || c->argc == 3) &&
!strcasecmp(c->argv[1]->ptr,"get")) !strcasecmp(ptrFromObj(c->argv[1]),"get"))
{ {
long count = 10, sent = 0; long count = 10, sent = 0;
listIter li; listIter li;

View File

@ -66,7 +66,7 @@ robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
/* If the pattern is "#" return the substitution object itself in order /* If the pattern is "#" return the substitution object itself in order
* to implement the "SORT ... GET #" feature. */ * to implement the "SORT ... GET #" feature. */
spat = pattern->ptr; spat = ptrFromObj(pattern);
if (spat[0] == '#' && spat[1] == '\0') { if (spat[0] == '#' && spat[1] == '\0') {
incrRefCount(subst); incrRefCount(subst);
return subst; return subst;
@ -76,7 +76,7 @@ robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
* a decoded object on the fly. Otherwise getDecodedObject will just * a decoded object on the fly. Otherwise getDecodedObject will just
* increment the ref count, that we'll decrement later. */ * increment the ref count, that we'll decrement later. */
subst = getDecodedObject(subst); subst = getDecodedObject(subst);
ssub = subst->ptr; ssub = ptrFromObj(subst);
/* If we can't find '*' in the pattern we return NULL as to GET a /* If we can't find '*' in the pattern we return NULL as to GET a
* fixed key does not make sense. */ * fixed key does not make sense. */
@ -99,7 +99,7 @@ robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
sublen = sdslen(ssub); sublen = sdslen(ssub);
postfixlen = sdslen(spat)-(prefixlen+1)-(fieldlen ? fieldlen+2 : 0); postfixlen = sdslen(spat)-(prefixlen+1)-(fieldlen ? fieldlen+2 : 0);
keyobj = createStringObject(NULL,prefixlen+sublen+postfixlen); keyobj = createStringObject(NULL,prefixlen+sublen+postfixlen);
k = keyobj->ptr; k = ptrFromObj(keyobj);
memcpy(k,spat,prefixlen); memcpy(k,spat,prefixlen);
memcpy(k+prefixlen,ssub,sublen); memcpy(k+prefixlen,ssub,sublen);
memcpy(k+prefixlen+sublen,p+1,postfixlen); memcpy(k+prefixlen+sublen,p+1,postfixlen);
@ -114,7 +114,7 @@ robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
/* Retrieve value from hash by the field name. The returend object /* Retrieve value from hash by the field name. The returend object
* is a new object with refcount already incremented. */ * is a new object with refcount already incremented. */
o = hashTypeGetValueObject(o, fieldobj->ptr); o = hashTypeGetValueObject(o, ptrFromObj(fieldobj));
} else { } else {
if (o->type != OBJ_STRING) goto noobj; if (o->type != OBJ_STRING) goto noobj;
@ -169,7 +169,7 @@ int sortCompare(const void *s1, const void *s2) {
} else { } else {
/* Here we can use strcoll() directly as we are sure that /* Here we can use strcoll() directly as we are sure that
* the objects are decoded string objects. */ * the objects are decoded string objects. */
cmp = strcoll(so1->u.cmpobj->ptr,so2->u.cmpobj->ptr); cmp = strcoll(ptrFromObj(so1->u.cmpobj),ptrFromObj(so2->u.cmpobj));
} }
} }
} else { } else {
@ -225,13 +225,13 @@ void sortCommand(client *c) {
/* The SORT command has an SQL-alike syntax, parse it */ /* The SORT command has an SQL-alike syntax, parse it */
while(j < c->argc) { while(j < c->argc) {
int leftargs = c->argc-j-1; int leftargs = c->argc-j-1;
if (!strcasecmp(c->argv[j]->ptr,"asc")) { if (!strcasecmp(ptrFromObj(c->argv[j]),"asc")) {
desc = 0; desc = 0;
} else if (!strcasecmp(c->argv[j]->ptr,"desc")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"desc")) {
desc = 1; desc = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"alpha")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"alpha")) {
alpha = 1; alpha = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"limit") && leftargs >= 2) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"limit") && leftargs >= 2) {
if ((getLongFromObjectOrReply(c, c->argv[j+1], &limit_start, NULL) if ((getLongFromObjectOrReply(c, c->argv[j+1], &limit_start, NULL)
!= C_OK) || != C_OK) ||
(getLongFromObjectOrReply(c, c->argv[j+2], &limit_count, NULL) (getLongFromObjectOrReply(c, c->argv[j+2], &limit_count, NULL)
@ -241,14 +241,14 @@ void sortCommand(client *c) {
break; break;
} }
j+=2; j+=2;
} else if (!strcasecmp(c->argv[j]->ptr,"store") && leftargs >= 1) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"store") && leftargs >= 1) {
storekey = c->argv[j+1]; storekey = c->argv[j+1];
j++; j++;
} else if (!strcasecmp(c->argv[j]->ptr,"by") && leftargs >= 1) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"by") && leftargs >= 1) {
sortby = c->argv[j+1]; sortby = c->argv[j+1];
/* If the BY pattern does not contain '*', i.e. it is constant, /* If the BY pattern does not contain '*', i.e. it is constant,
* we don't need to sort nor to lookup the weight keys. */ * we don't need to sort nor to lookup the weight keys. */
if (strchr(c->argv[j+1]->ptr,'*') == NULL) { if (strchr(ptrFromObj(c->argv[j+1]),'*') == NULL) {
dontsort = 1; dontsort = 1;
} else { } else {
/* If BY is specified with a real patter, we can't accept /* If BY is specified with a real patter, we can't accept
@ -260,7 +260,7 @@ void sortCommand(client *c) {
} }
} }
j++; j++;
} else if (!strcasecmp(c->argv[j]->ptr,"get") && leftargs >= 1) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"get") && leftargs >= 1) {
if (server.cluster_enabled) { if (server.cluster_enabled) {
addReplyError(c,"GET option of SORT denied in Cluster mode."); addReplyError(c,"GET option of SORT denied in Cluster mode.");
syntax_error++; syntax_error++;
@ -309,7 +309,7 @@ void sortCommand(client *c) {
switch(sortval->type) { switch(sortval->type) {
case OBJ_LIST: vectorlen = listTypeLength(sortval); break; case OBJ_LIST: vectorlen = listTypeLength(sortval); break;
case OBJ_SET: vectorlen = setTypeSize(sortval); break; case OBJ_SET: vectorlen = setTypeSize(sortval); break;
case OBJ_ZSET: vectorlen = dictSize(((zset*)sortval->ptr)->pdict); break; case OBJ_ZSET: vectorlen = dictSize(((zset*)ptrFromObj(sortval))->pdict); break;
default: vectorlen = 0; serverPanic("Bad SORT type"); /* Avoid GCC warning */ default: vectorlen = 0; serverPanic("Bad SORT type"); /* Avoid GCC warning */
} }
@ -396,7 +396,7 @@ void sortCommand(client *c) {
* Note that in this case we also handle LIMIT here in a direct * Note that in this case we also handle LIMIT here in a direct
* way, just getting the required range, as an optimization. */ * way, just getting the required range, as an optimization. */
zset *zs = sortval->ptr; zset *zs = ptrFromObj(sortval);
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
zskiplistNode *ln; zskiplistNode *ln;
sds sdsele; sds sdsele;
@ -404,7 +404,7 @@ void sortCommand(client *c) {
/* Check if starting point is trivial, before doing log(N) lookup. */ /* Check if starting point is trivial, before doing log(N) lookup. */
if (desc) { if (desc) {
long zsetlen = dictSize(((zset*)sortval->ptr)->pdict); long zsetlen = dictSize(((zset*)ptrFromObj(sortval))->pdict);
ln = zsl->tail; ln = zsl->tail;
if (start > 0) if (start > 0)
@ -428,7 +428,7 @@ void sortCommand(client *c) {
end -= start; end -= start;
start = 0; start = 0;
} else if (sortval->type == OBJ_ZSET) { } else if (sortval->type == OBJ_ZSET) {
dict *set = ((zset*)sortval->ptr)->pdict; dict *set = ((zset*)ptrFromObj(sortval))->pdict;
dictIterator *di; dictIterator *di;
dictEntry *setele; dictEntry *setele;
sds sdsele; sds sdsele;
@ -465,7 +465,7 @@ void sortCommand(client *c) {
if (sdsEncodedObject(byval)) { if (sdsEncodedObject(byval)) {
char *eptr; char *eptr;
vector[j].u.score = strtod(byval->ptr,&eptr); vector[j].u.score = strtod(ptrFromObj(byval),&eptr);
if (eptr[0] != '\0' || errno == ERANGE || if (eptr[0] != '\0' || errno == ERANGE ||
isnan(vector[j].u.score)) isnan(vector[j].u.score))
{ {
@ -475,7 +475,7 @@ void sortCommand(client *c) {
/* Don't need to decode the object if it's /* Don't need to decode the object if it's
* integer-encoded (the only encoding supported) so * integer-encoded (the only encoding supported) so
* far. We can just cast it */ * far. We can just cast it */
vector[j].u.score = (long)byval->ptr; vector[j].u.score = (long)byval->m_ptr;
} else { } else {
serverAssertWithInfo(c,sortval,1 != 1); serverAssertWithInfo(c,sortval,1 != 1);
} }

View File

@ -44,7 +44,7 @@ void hashTypeTryConversion(robj *o, robj **argv, int start, int end) {
for (i = start; i <= end; i++) { for (i = start; i <= end; i++) {
if (sdsEncodedObject(argv[i]) && if (sdsEncodedObject(argv[i]) &&
sdslen(argv[i]->ptr) > server.hash_max_ziplist_value) sdslen(ptrFromObj(argv[i])) > server.hash_max_ziplist_value)
{ {
hashTypeConvert(o, OBJ_ENCODING_HT); hashTypeConvert(o, OBJ_ENCODING_HT);
break; break;
@ -64,7 +64,7 @@ int hashTypeGetFromZiplist(robj *o, sds field,
serverAssert(o->encoding == OBJ_ENCODING_ZIPLIST); serverAssert(o->encoding == OBJ_ENCODING_ZIPLIST);
zl = o->ptr; zl = ptrFromObj(o);
fptr = ziplistIndex(zl, ZIPLIST_HEAD); fptr = ziplistIndex(zl, ZIPLIST_HEAD);
if (fptr != NULL) { if (fptr != NULL) {
fptr = ziplistFind(fptr, (unsigned char*)field, sdslen(field), 1); fptr = ziplistFind(fptr, (unsigned char*)field, sdslen(field), 1);
@ -92,7 +92,7 @@ sds hashTypeGetFromHashTable(robj *o, sds field) {
serverAssert(o->encoding == OBJ_ENCODING_HT); serverAssert(o->encoding == OBJ_ENCODING_HT);
de = dictFind(o->ptr, field); de = dictFind(ptrFromObj(o), field);
if (de == NULL) return NULL; if (de == NULL) return NULL;
return dictGetVal(de); return dictGetVal(de);
} }
@ -205,7 +205,7 @@ int hashTypeSet(robj *o, sds field, sds value, int flags) {
if (o->encoding == OBJ_ENCODING_ZIPLIST) { if (o->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl, *fptr, *vptr; unsigned char *zl, *fptr, *vptr;
zl = o->ptr; zl = ptrFromObj(o);
fptr = ziplistIndex(zl, ZIPLIST_HEAD); fptr = ziplistIndex(zl, ZIPLIST_HEAD);
if (fptr != NULL) { if (fptr != NULL) {
fptr = ziplistFind(fptr, (unsigned char*)field, sdslen(field), 1); fptr = ziplistFind(fptr, (unsigned char*)field, sdslen(field), 1);
@ -231,13 +231,13 @@ int hashTypeSet(robj *o, sds field, sds value, int flags) {
zl = ziplistPush(zl, (unsigned char*)value, sdslen(value), zl = ziplistPush(zl, (unsigned char*)value, sdslen(value),
ZIPLIST_TAIL); ZIPLIST_TAIL);
} }
o->ptr = zl; o->m_ptr = zl;
/* Check if the ziplist needs to be converted to a hash table */ /* Check if the ziplist needs to be converted to a hash table */
if (hashTypeLength(o) > server.hash_max_ziplist_entries) if (hashTypeLength(o) > server.hash_max_ziplist_entries)
hashTypeConvert(o, OBJ_ENCODING_HT); hashTypeConvert(o, OBJ_ENCODING_HT);
} else if (o->encoding == OBJ_ENCODING_HT) { } else if (o->encoding == OBJ_ENCODING_HT) {
dictEntry *de = dictFind(o->ptr,field); dictEntry *de = dictFind(ptrFromObj(o),field);
if (de) { if (de) {
sdsfree(dictGetVal(de)); sdsfree(dictGetVal(de));
if (flags & HASH_SET_TAKE_VALUE) { if (flags & HASH_SET_TAKE_VALUE) {
@ -261,7 +261,7 @@ int hashTypeSet(robj *o, sds field, sds value, int flags) {
} else { } else {
v = sdsdup(value); v = sdsdup(value);
} }
dictAdd(o->ptr,f,v); dictAdd(ptrFromObj(o),f,v);
} }
} else { } else {
serverPanic("Unknown hash encoding"); serverPanic("Unknown hash encoding");
@ -282,23 +282,23 @@ int hashTypeDelete(robj *o, sds field) {
if (o->encoding == OBJ_ENCODING_ZIPLIST) { if (o->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl, *fptr; unsigned char *zl, *fptr;
zl = o->ptr; zl = ptrFromObj(o);
fptr = ziplistIndex(zl, ZIPLIST_HEAD); fptr = ziplistIndex(zl, ZIPLIST_HEAD);
if (fptr != NULL) { if (fptr != NULL) {
fptr = ziplistFind(fptr, (unsigned char*)field, sdslen(field), 1); fptr = ziplistFind(fptr, (unsigned char*)field, sdslen(field), 1);
if (fptr != NULL) { if (fptr != NULL) {
zl = ziplistDelete(zl,&fptr); /* Delete the key. */ zl = ziplistDelete(zl,&fptr); /* Delete the key. */
zl = ziplistDelete(zl,&fptr); /* Delete the value. */ zl = ziplistDelete(zl,&fptr); /* Delete the value. */
o->ptr = zl; o->m_ptr = zl;
deleted = 1; deleted = 1;
} }
} }
} else if (o->encoding == OBJ_ENCODING_HT) { } else if (o->encoding == OBJ_ENCODING_HT) {
if (dictDelete((dict*)o->ptr, field) == C_OK) { if (dictDelete((dict*)ptrFromObj(o), field) == C_OK) {
deleted = 1; deleted = 1;
/* Always check if the dictionary needs a resize after a delete. */ /* Always check if the dictionary needs a resize after a delete. */
if (htNeedsResize(o->ptr)) dictResize(o->ptr); if (htNeedsResize(ptrFromObj(o))) dictResize(ptrFromObj(o));
} }
} else { } else {
@ -312,9 +312,9 @@ unsigned long hashTypeLength(const robj *o) {
unsigned long length = ULONG_MAX; unsigned long length = ULONG_MAX;
if (o->encoding == OBJ_ENCODING_ZIPLIST) { if (o->encoding == OBJ_ENCODING_ZIPLIST) {
length = ziplistLen(o->ptr) / 2; length = ziplistLen(ptrFromObj(o)) / 2;
} else if (o->encoding == OBJ_ENCODING_HT) { } else if (o->encoding == OBJ_ENCODING_HT) {
length = dictSize((const dict*)o->ptr); length = dictSize((const dict*)ptrFromObj(o));
} else { } else {
serverPanic("Unknown hash encoding"); serverPanic("Unknown hash encoding");
} }
@ -330,7 +330,7 @@ hashTypeIterator *hashTypeInitIterator(robj *subject) {
hi->fptr = NULL; hi->fptr = NULL;
hi->vptr = NULL; hi->vptr = NULL;
} else if (hi->encoding == OBJ_ENCODING_HT) { } else if (hi->encoding == OBJ_ENCODING_HT) {
hi->di = dictGetIterator(subject->ptr); hi->di = dictGetIterator(subject->m_ptr);
} else { } else {
serverPanic("Unknown hash encoding"); serverPanic("Unknown hash encoding");
} }
@ -350,7 +350,7 @@ int hashTypeNext(hashTypeIterator *hi) {
unsigned char *zl; unsigned char *zl;
unsigned char *fptr, *vptr; unsigned char *fptr, *vptr;
zl = hi->subject->ptr; zl = hi->subject->m_ptr;
fptr = hi->fptr; fptr = hi->fptr;
vptr = hi->vptr; vptr = hi->vptr;
@ -484,14 +484,14 @@ void hashTypeConvertZiplist(robj *o, int enc) {
ret = dictAdd(dict, key, value); ret = dictAdd(dict, key, value);
if (ret != DICT_OK) { if (ret != DICT_OK) {
serverLogHexDump(LL_WARNING,"ziplist with dup elements dump", serverLogHexDump(LL_WARNING,"ziplist with dup elements dump",
o->ptr,ziplistBlobLen(o->ptr)); ptrFromObj(o),ziplistBlobLen(ptrFromObj(o)));
serverPanic("Ziplist corruption detected"); serverPanic("Ziplist corruption detected");
} }
} }
hashTypeReleaseIterator(hi); hashTypeReleaseIterator(hi);
zfree(o->ptr); zfree(ptrFromObj(o));
o->encoding = OBJ_ENCODING_HT; o->encoding = OBJ_ENCODING_HT;
o->ptr = dict; o->m_ptr = dict;
} else { } else {
serverPanic("Unknown hash encoding"); serverPanic("Unknown hash encoding");
} }
@ -516,10 +516,10 @@ void hsetnxCommand(client *c) {
if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return; if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
hashTypeTryConversion(o,c->argv,2,3); hashTypeTryConversion(o,c->argv,2,3);
if (hashTypeExists(o, c->argv[2]->ptr)) { if (hashTypeExists(o, ptrFromObj(c->argv[2]))) {
addReply(c, shared.czero); addReply(c, shared.czero);
} else { } else {
hashTypeSet(o,c->argv[2]->ptr,c->argv[3]->ptr,HASH_SET_COPY); hashTypeSet(o,ptrFromObj(c->argv[2]),ptrFromObj(c->argv[3]),HASH_SET_COPY);
addReply(c, shared.cone); addReply(c, shared.cone);
signalModifiedKey(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[1]);
notifyKeyspaceEvent(NOTIFY_HASH,"hset",c->argv[1],c->db->id); notifyKeyspaceEvent(NOTIFY_HASH,"hset",c->argv[1],c->db->id);
@ -540,10 +540,10 @@ void hsetCommand(client *c) {
hashTypeTryConversion(o,c->argv,2,c->argc-1); hashTypeTryConversion(o,c->argv,2,c->argc-1);
for (i = 2; i < c->argc; i += 2) for (i = 2; i < c->argc; i += 2)
created += !hashTypeSet(o,c->argv[i]->ptr,c->argv[i+1]->ptr,HASH_SET_COPY); created += !hashTypeSet(o,ptrFromObj(c->argv[i]),ptrFromObj(c->argv[i+1]),HASH_SET_COPY);
/* HMSET (deprecated) and HSET return value is different. */ /* HMSET (deprecated) and HSET return value is different. */
char *cmdname = c->argv[0]->ptr; char *cmdname = ptrFromObj(c->argv[0]);
if (cmdname[1] == 's' || cmdname[1] == 'S') { if (cmdname[1] == 's' || cmdname[1] == 'S') {
/* HSET */ /* HSET */
addReplyLongLong(c, created); addReplyLongLong(c, created);
@ -565,7 +565,7 @@ void hincrbyCommand(client *c) {
if (getLongLongFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) return; if (getLongLongFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) return;
if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return; if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
if (hashTypeGetValue(o,c->argv[2]->ptr,&vstr,&vlen,&value) == C_OK) { if (hashTypeGetValue(o,ptrFromObj(c->argv[2]),&vstr,&vlen,&value) == C_OK) {
if (vstr) { if (vstr) {
if (string2ll((char*)vstr,vlen,&value) == 0) { if (string2ll((char*)vstr,vlen,&value) == 0) {
addReplyError(c,"hash value is not an integer"); addReplyError(c,"hash value is not an integer");
@ -584,7 +584,7 @@ void hincrbyCommand(client *c) {
} }
value += incr; value += incr;
new = sdsfromlonglong(value); new = sdsfromlonglong(value);
hashTypeSet(o,c->argv[2]->ptr,new,HASH_SET_TAKE_VALUE); hashTypeSet(o,ptrFromObj(c->argv[2]),new,HASH_SET_TAKE_VALUE);
addReplyLongLong(c,value); addReplyLongLong(c,value);
signalModifiedKey(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[1]);
notifyKeyspaceEvent(NOTIFY_HASH,"hincrby",c->argv[1],c->db->id); notifyKeyspaceEvent(NOTIFY_HASH,"hincrby",c->argv[1],c->db->id);
@ -601,7 +601,7 @@ void hincrbyfloatCommand(client *c) {
if (getLongDoubleFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) return; if (getLongDoubleFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) return;
if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return; if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
if (hashTypeGetValue(o,c->argv[2]->ptr,&vstr,&vlen,&ll) == C_OK) { if (hashTypeGetValue(o,ptrFromObj(c->argv[2]),&vstr,&vlen,&ll) == C_OK) {
if (vstr) { if (vstr) {
if (string2ld((char*)vstr,vlen,&value) == 0) { if (string2ld((char*)vstr,vlen,&value) == 0) {
addReplyError(c,"hash value is not a float"); addReplyError(c,"hash value is not a float");
@ -619,7 +619,7 @@ void hincrbyfloatCommand(client *c) {
char buf[MAX_LONG_DOUBLE_CHARS]; char buf[MAX_LONG_DOUBLE_CHARS];
int len = ld2string(buf,sizeof(buf),value,1); int len = ld2string(buf,sizeof(buf),value,1);
new = sdsnewlen(buf,len); new = sdsnewlen(buf,len);
hashTypeSet(o,c->argv[2]->ptr,new,HASH_SET_TAKE_VALUE); hashTypeSet(o,ptrFromObj(c->argv[2]),new,HASH_SET_TAKE_VALUE);
addReplyBulkCBuffer(c,buf,len); addReplyBulkCBuffer(c,buf,len);
signalModifiedKey(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[1]);
notifyKeyspaceEvent(NOTIFY_HASH,"hincrbyfloat",c->argv[1],c->db->id); notifyKeyspaceEvent(NOTIFY_HASH,"hincrbyfloat",c->argv[1],c->db->id);
@ -678,7 +678,7 @@ void hgetCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.null[c->resp])) == NULL || if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.null[c->resp])) == NULL ||
checkType(c,o,OBJ_HASH)) return; checkType(c,o,OBJ_HASH)) return;
addHashFieldToReply(c, o, c->argv[2]->ptr); addHashFieldToReply(c, o, ptrFromObj(c->argv[2]));
} }
void hmgetCommand(client *c) { void hmgetCommand(client *c) {
@ -695,7 +695,7 @@ void hmgetCommand(client *c) {
addReplyArrayLen(c, c->argc-2); addReplyArrayLen(c, c->argc-2);
for (i = 2; i < c->argc; i++) { for (i = 2; i < c->argc; i++) {
addHashFieldToReply(c, o, c->argv[i]->ptr); addHashFieldToReply(c, o, ptrFromObj(c->argv[i]));
} }
} }
@ -707,7 +707,7 @@ void hdelCommand(client *c) {
checkType(c,o,OBJ_HASH)) return; checkType(c,o,OBJ_HASH)) return;
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
if (hashTypeDelete(o,c->argv[j]->ptr)) { if (hashTypeDelete(o,ptrFromObj(c->argv[j]))) {
deleted++; deleted++;
if (hashTypeLength(o) == 0) { if (hashTypeLength(o) == 0) {
dbDelete(c->db,c->argv[1]); dbDelete(c->db,c->argv[1]);
@ -741,7 +741,7 @@ void hstrlenCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL || if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,o,OBJ_HASH)) return; checkType(c,o,OBJ_HASH)) return;
addReplyLongLong(c,hashTypeGetValueLength(o,c->argv[2]->ptr)); addReplyLongLong(c,hashTypeGetValueLength(o,ptrFromObj(c->argv[2])));
} }
static void addHashIteratorCursorToReply(client *c, hashTypeIterator *hi, int what) { static void addHashIteratorCursorToReply(client *c, hashTypeIterator *hi, int what) {
@ -816,7 +816,7 @@ void hexistsCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL || if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,o,OBJ_HASH)) return; checkType(c,o,OBJ_HASH)) return;
addReply(c, hashTypeExists(o,c->argv[2]->ptr) ? shared.cone : shared.czero); addReply(c, hashTypeExists(o,ptrFromObj(c->argv[2])) ? shared.cone : shared.czero);
} }
void hscanCommand(client *c) { void hscanCommand(client *c) {

View File

@ -42,8 +42,8 @@ void listTypePush(robj *subject, robj *value, int where) {
if (subject->encoding == OBJ_ENCODING_QUICKLIST) { if (subject->encoding == OBJ_ENCODING_QUICKLIST) {
int pos = (where == LIST_HEAD) ? QUICKLIST_HEAD : QUICKLIST_TAIL; int pos = (where == LIST_HEAD) ? QUICKLIST_HEAD : QUICKLIST_TAIL;
value = getDecodedObject(value); value = getDecodedObject(value);
size_t len = sdslen(value->ptr); size_t len = sdslen(ptrFromObj(value));
quicklistPush(subject->ptr, value->ptr, len, pos); quicklistPush(ptrFromObj(subject), ptrFromObj(value), len, pos);
decrRefCount(value); decrRefCount(value);
} else { } else {
serverPanic("Unknown list encoding"); serverPanic("Unknown list encoding");
@ -60,7 +60,7 @@ robj *listTypePop(robj *subject, int where) {
int ql_where = where == LIST_HEAD ? QUICKLIST_HEAD : QUICKLIST_TAIL; int ql_where = where == LIST_HEAD ? QUICKLIST_HEAD : QUICKLIST_TAIL;
if (subject->encoding == OBJ_ENCODING_QUICKLIST) { if (subject->encoding == OBJ_ENCODING_QUICKLIST) {
if (quicklistPopCustom(subject->ptr, ql_where, (unsigned char **)&value, if (quicklistPopCustom(ptrFromObj(subject), ql_where, (unsigned char **)&value,
NULL, &vlong, listPopSaver)) { NULL, &vlong, listPopSaver)) {
if (!value) if (!value)
value = createStringObjectFromLongLong(vlong); value = createStringObjectFromLongLong(vlong);
@ -73,7 +73,7 @@ robj *listTypePop(robj *subject, int where) {
unsigned long listTypeLength(const robj *subject) { unsigned long listTypeLength(const robj *subject) {
if (subject->encoding == OBJ_ENCODING_QUICKLIST) { if (subject->encoding == OBJ_ENCODING_QUICKLIST) {
return quicklistCount(subject->ptr); return quicklistCount(ptrFromObj(subject));
} else { } else {
serverPanic("Unknown list encoding"); serverPanic("Unknown list encoding");
} }
@ -92,7 +92,7 @@ listTypeIterator *listTypeInitIterator(robj *subject, long index,
int iter_direction = int iter_direction =
direction == LIST_HEAD ? AL_START_TAIL : AL_START_HEAD; direction == LIST_HEAD ? AL_START_TAIL : AL_START_HEAD;
if (li->encoding == OBJ_ENCODING_QUICKLIST) { if (li->encoding == OBJ_ENCODING_QUICKLIST) {
li->iter = quicklistGetIteratorAtIdx(li->subject->ptr, li->iter = quicklistGetIteratorAtIdx(ptrFromObj(li->subject),
iter_direction, index); iter_direction, index);
} else { } else {
serverPanic("Unknown list encoding"); serverPanic("Unknown list encoding");
@ -141,7 +141,7 @@ robj *listTypeGet(listTypeEntry *entry) {
void listTypeInsert(listTypeEntry *entry, robj *value, int where) { void listTypeInsert(listTypeEntry *entry, robj *value, int where) {
if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) { if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {
value = getDecodedObject(value); value = getDecodedObject(value);
sds str = value->ptr; sds str = ptrFromObj(value);
size_t len = sdslen(str); size_t len = sdslen(str);
if (where == LIST_TAIL) { if (where == LIST_TAIL) {
quicklistInsertAfter((quicklist *)entry->entry.qlist, quicklistInsertAfter((quicklist *)entry->entry.qlist,
@ -160,7 +160,7 @@ void listTypeInsert(listTypeEntry *entry, robj *value, int where) {
int listTypeEqual(listTypeEntry *entry, robj *o) { int listTypeEqual(listTypeEntry *entry, robj *o) {
if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) { if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {
serverAssertWithInfo(NULL,o,sdsEncodedObject(o)); serverAssertWithInfo(NULL,o,sdsEncodedObject(o));
return quicklistCompare(entry->entry.zi,o->ptr,sdslen(o->ptr)); return quicklistCompare(entry->entry.zi,ptrFromObj(o),sdslen(ptrFromObj(o)));
} else { } else {
serverPanic("Unknown list encoding"); serverPanic("Unknown list encoding");
} }
@ -183,7 +183,7 @@ void listTypeConvert(robj *subject, int enc) {
if (enc == OBJ_ENCODING_QUICKLIST) { if (enc == OBJ_ENCODING_QUICKLIST) {
size_t zlen = server.list_max_ziplist_size; size_t zlen = server.list_max_ziplist_size;
int depth = server.list_compress_depth; int depth = server.list_compress_depth;
subject->ptr = quicklistCreateFromZiplist(zlen, depth, subject->ptr); subject->m_ptr = quicklistCreateFromZiplist(zlen, depth, ptrFromObj(subject));
subject->encoding = OBJ_ENCODING_QUICKLIST; subject->encoding = OBJ_ENCODING_QUICKLIST;
} else { } else {
serverPanic("Unsupported list conversion"); serverPanic("Unsupported list conversion");
@ -206,7 +206,7 @@ void pushGenericCommand(client *c, int where) {
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
if (!lobj) { if (!lobj) {
lobj = createQuicklistObject(); lobj = createQuicklistObject();
quicklistSetOptions(lobj->ptr, server.list_max_ziplist_size, quicklistSetOptions(ptrFromObj(lobj), server.list_max_ziplist_size,
server.list_compress_depth); server.list_compress_depth);
dbAdd(c->db,c->argv[1],lobj); dbAdd(c->db,c->argv[1],lobj);
} }
@ -268,9 +268,9 @@ void linsertCommand(client *c) {
listTypeEntry entry; listTypeEntry entry;
int inserted = 0; int inserted = 0;
if (strcasecmp(c->argv[2]->ptr,"after") == 0) { if (strcasecmp(ptrFromObj(c->argv[2]),"after") == 0) {
where = LIST_TAIL; where = LIST_TAIL;
} else if (strcasecmp(c->argv[2]->ptr,"before") == 0) { } else if (strcasecmp(ptrFromObj(c->argv[2]),"before") == 0) {
where = LIST_HEAD; where = LIST_HEAD;
} else { } else {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
@ -322,7 +322,7 @@ void lindexCommand(client *c) {
if (o->encoding == OBJ_ENCODING_QUICKLIST) { if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklistEntry entry; quicklistEntry entry;
if (quicklistIndex(o->ptr, index, &entry)) { if (quicklistIndex(ptrFromObj(o), index, &entry)) {
if (entry.value) { if (entry.value) {
value = createStringObject((char*)entry.value,entry.sz); value = createStringObject((char*)entry.value,entry.sz);
} else { } else {
@ -348,9 +348,9 @@ void lsetCommand(client *c) {
return; return;
if (o->encoding == OBJ_ENCODING_QUICKLIST) { if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklist *ql = o->ptr; quicklist *ql = ptrFromObj(o);
int replaced = quicklistReplaceAtIndex(ql, index, int replaced = quicklistReplaceAtIndex(ql, index,
value->ptr, sdslen(value->ptr)); ptrFromObj(value), sdslen(ptrFromObj(value)));
if (!replaced) { if (!replaced) {
addReply(c,shared.outofrangeerr); addReply(c,shared.outofrangeerr);
} else { } else {
@ -471,8 +471,8 @@ void ltrimCommand(client *c) {
/* Remove list elements to perform the trim */ /* Remove list elements to perform the trim */
if (o->encoding == OBJ_ENCODING_QUICKLIST) { if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklistDelRange(o->ptr,0,ltrim); quicklistDelRange(ptrFromObj(o),0,ltrim);
quicklistDelRange(o->ptr,-rtrim,rtrim); quicklistDelRange(ptrFromObj(o),-rtrim,rtrim);
} else { } else {
serverPanic("Unknown list encoding"); serverPanic("Unknown list encoding");
} }
@ -551,7 +551,7 @@ void rpoplpushHandlePush(client *c, robj *dstkey, robj *dstobj, robj *value) {
/* Create the list if the key does not exist */ /* Create the list if the key does not exist */
if (!dstobj) { if (!dstobj) {
dstobj = createQuicklistObject(); dstobj = createQuicklistObject();
quicklistSetOptions(dstobj->ptr, server.list_max_ziplist_size, quicklistSetOptions(ptrFromObj(dstobj), server.list_max_ziplist_size,
server.list_compress_depth); server.list_compress_depth);
dbAdd(c->db,dstkey,dstobj); dbAdd(c->db,dstkey,dstobj);
} }

View File

@ -52,7 +52,7 @@ robj *setTypeCreate(sds value) {
int setTypeAdd(robj *subject, sds value) { int setTypeAdd(robj *subject, sds value) {
long long llval; long long llval;
if (subject->encoding == OBJ_ENCODING_HT) { if (subject->encoding == OBJ_ENCODING_HT) {
dict *ht = subject->ptr; dict *ht = subject->m_ptr;
dictEntry *de = dictAddRaw(ht,value,NULL); dictEntry *de = dictAddRaw(ht,value,NULL);
if (de) { if (de) {
dictSetKey(ht,de,sdsdup(value)); dictSetKey(ht,de,sdsdup(value));
@ -62,11 +62,11 @@ int setTypeAdd(robj *subject, sds value) {
} else if (subject->encoding == OBJ_ENCODING_INTSET) { } else if (subject->encoding == OBJ_ENCODING_INTSET) {
if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) { if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) {
uint8_t success = 0; uint8_t success = 0;
subject->ptr = intsetAdd(subject->ptr,llval,&success); subject->m_ptr = intsetAdd(subject->m_ptr,llval,&success);
if (success) { if (success) {
/* Convert to regular set when the intset contains /* Convert to regular set when the intset contains
* too many entries. */ * too many entries. */
if (intsetLen(subject->ptr) > server.set_max_intset_entries) if (intsetLen(subject->m_ptr) > server.set_max_intset_entries)
setTypeConvert(subject,OBJ_ENCODING_HT); setTypeConvert(subject,OBJ_ENCODING_HT);
return 1; return 1;
} }
@ -76,7 +76,7 @@ int setTypeAdd(robj *subject, sds value) {
/* The set *was* an intset and this value is not integer /* The set *was* an intset and this value is not integer
* encodable, so dictAdd should always work. */ * encodable, so dictAdd should always work. */
serverAssert(dictAdd(subject->ptr,sdsdup(value),NULL) == DICT_OK); serverAssert(dictAdd(subject->m_ptr,sdsdup(value),NULL) == DICT_OK);
return 1; return 1;
} }
} else { } else {
@ -88,14 +88,14 @@ int setTypeAdd(robj *subject, sds value) {
int setTypeRemove(robj *setobj, sds value) { int setTypeRemove(robj *setobj, sds value) {
long long llval; long long llval;
if (setobj->encoding == OBJ_ENCODING_HT) { if (setobj->encoding == OBJ_ENCODING_HT) {
if (dictDelete(setobj->ptr,value) == DICT_OK) { if (dictDelete(setobj->m_ptr,value) == DICT_OK) {
if (htNeedsResize(setobj->ptr)) dictResize(setobj->ptr); if (htNeedsResize(setobj->m_ptr)) dictResize(setobj->m_ptr);
return 1; return 1;
} }
} else if (setobj->encoding == OBJ_ENCODING_INTSET) { } else if (setobj->encoding == OBJ_ENCODING_INTSET) {
if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) { if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) {
int success; int success;
setobj->ptr = intsetRemove(setobj->ptr,llval,&success); setobj->m_ptr = intsetRemove(setobj->m_ptr,llval,&success);
if (success) return 1; if (success) return 1;
} }
} else { } else {
@ -107,10 +107,10 @@ int setTypeRemove(robj *setobj, sds value) {
int setTypeIsMember(robj *subject, sds value) { int setTypeIsMember(robj *subject, sds value) {
long long llval; long long llval;
if (subject->encoding == OBJ_ENCODING_HT) { if (subject->encoding == OBJ_ENCODING_HT) {
return dictFind((dict*)subject->ptr,value) != NULL; return dictFind((dict*)subject->m_ptr,value) != NULL;
} else if (subject->encoding == OBJ_ENCODING_INTSET) { } else if (subject->encoding == OBJ_ENCODING_INTSET) {
if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) { if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) {
return intsetFind((intset*)subject->ptr,llval); return intsetFind((intset*)subject->m_ptr,llval);
} }
} else { } else {
serverPanic("Unknown set encoding"); serverPanic("Unknown set encoding");
@ -123,7 +123,7 @@ setTypeIterator *setTypeInitIterator(robj *subject) {
si->subject = subject; si->subject = subject;
si->encoding = subject->encoding; si->encoding = subject->encoding;
if (si->encoding == OBJ_ENCODING_HT) { if (si->encoding == OBJ_ENCODING_HT) {
si->di = dictGetIterator(subject->ptr); si->di = dictGetIterator(subject->m_ptr);
} else if (si->encoding == OBJ_ENCODING_INTSET) { } else if (si->encoding == OBJ_ENCODING_INTSET) {
si->ii = 0; si->ii = 0;
} else { } else {
@ -158,7 +158,7 @@ int setTypeNext(setTypeIterator *si, sds *sdsele, int64_t *llele) {
*sdsele = dictGetKey(de); *sdsele = dictGetKey(de);
*llele = -123456789; /* Not needed. Defensive. */ *llele = -123456789; /* Not needed. Defensive. */
} else if (si->encoding == OBJ_ENCODING_INTSET) { } else if (si->encoding == OBJ_ENCODING_INTSET) {
if (!intsetGet(si->subject->ptr,si->ii++,llele)) if (!intsetGet(si->subject->m_ptr,si->ii++,llele))
return -1; return -1;
*sdsele = NULL; /* Not needed. Defensive. */ *sdsele = NULL; /* Not needed. Defensive. */
} else { } else {
@ -207,11 +207,11 @@ sds setTypeNextObject(setTypeIterator *si) {
* used field with values which are easy to trap if misused. */ * used field with values which are easy to trap if misused. */
int setTypeRandomElement(robj *setobj, sds *sdsele, int64_t *llele) { int setTypeRandomElement(robj *setobj, sds *sdsele, int64_t *llele) {
if (setobj->encoding == OBJ_ENCODING_HT) { if (setobj->encoding == OBJ_ENCODING_HT) {
dictEntry *de = dictGetRandomKey(setobj->ptr); dictEntry *de = dictGetRandomKey(setobj->m_ptr);
*sdsele = dictGetKey(de); *sdsele = dictGetKey(de);
*llele = -123456789; /* Not needed. Defensive. */ *llele = -123456789; /* Not needed. Defensive. */
} else if (setobj->encoding == OBJ_ENCODING_INTSET) { } else if (setobj->encoding == OBJ_ENCODING_INTSET) {
*llele = intsetRandom(setobj->ptr); *llele = intsetRandom(setobj->m_ptr);
*sdsele = NULL; /* Not needed. Defensive. */ *sdsele = NULL; /* Not needed. Defensive. */
} else { } else {
serverPanic("Unknown set encoding"); serverPanic("Unknown set encoding");
@ -221,9 +221,9 @@ int setTypeRandomElement(robj *setobj, sds *sdsele, int64_t *llele) {
unsigned long setTypeSize(const robj *subject) { unsigned long setTypeSize(const robj *subject) {
if (subject->encoding == OBJ_ENCODING_HT) { if (subject->encoding == OBJ_ENCODING_HT) {
return dictSize((const dict*)subject->ptr); return dictSize((const dict*)subject->m_ptr);
} else if (subject->encoding == OBJ_ENCODING_INTSET) { } else if (subject->encoding == OBJ_ENCODING_INTSET) {
return intsetLen((const intset*)subject->ptr); return intsetLen((const intset*)subject->m_ptr);
} else { } else {
serverPanic("Unknown set encoding"); serverPanic("Unknown set encoding");
} }
@ -243,7 +243,7 @@ void setTypeConvert(robj *setobj, int enc) {
sds element; sds element;
/* Presize the dict to avoid rehashing */ /* Presize the dict to avoid rehashing */
dictExpand(d,intsetLen(setobj->ptr)); dictExpand(d,intsetLen(setobj->m_ptr));
/* To add the elements we extract integers and create redis objects */ /* To add the elements we extract integers and create redis objects */
si = setTypeInitIterator(setobj); si = setTypeInitIterator(setobj);
@ -254,8 +254,8 @@ void setTypeConvert(robj *setobj, int enc) {
setTypeReleaseIterator(si); setTypeReleaseIterator(si);
setobj->encoding = OBJ_ENCODING_HT; setobj->encoding = OBJ_ENCODING_HT;
zfree(setobj->ptr); zfree(setobj->m_ptr);
setobj->ptr = d; setobj->m_ptr = d;
} else { } else {
serverPanic("Unsupported set conversion"); serverPanic("Unsupported set conversion");
} }
@ -267,7 +267,7 @@ void saddCommand(client *c) {
set = lookupKeyWrite(c->db,c->argv[1]); set = lookupKeyWrite(c->db,c->argv[1]);
if (set == NULL) { if (set == NULL) {
set = setTypeCreate(c->argv[2]->ptr); set = setTypeCreate(ptrFromObj(c->argv[2]));
dbAdd(c->db,c->argv[1],set); dbAdd(c->db,c->argv[1],set);
} else { } else {
if (set->type != OBJ_SET) { if (set->type != OBJ_SET) {
@ -277,7 +277,7 @@ void saddCommand(client *c) {
} }
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
if (setTypeAdd(set,c->argv[j]->ptr)) added++; if (setTypeAdd(set,ptrFromObj(c->argv[j]))) added++;
} }
if (added) { if (added) {
signalModifiedKey(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[1]);
@ -295,7 +295,7 @@ void sremCommand(client *c) {
checkType(c,set,OBJ_SET)) return; checkType(c,set,OBJ_SET)) return;
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
if (setTypeRemove(set,c->argv[j]->ptr)) { if (setTypeRemove(set,ptrFromObj(c->argv[j]))) {
deleted++; deleted++;
if (setTypeSize(set) == 0) { if (setTypeSize(set) == 0) {
dbDelete(c->db,c->argv[1]); dbDelete(c->db,c->argv[1]);
@ -334,13 +334,13 @@ void smoveCommand(client *c) {
/* If srcset and dstset are equal, SMOVE is a no-op */ /* If srcset and dstset are equal, SMOVE is a no-op */
if (srcset == dstset) { if (srcset == dstset) {
addReply(c,setTypeIsMember(srcset,ele->ptr) ? addReply(c,setTypeIsMember(srcset,ptrFromObj(ele)) ?
shared.cone : shared.czero); shared.cone : shared.czero);
return; return;
} }
/* If the element cannot be removed from the src set, return 0. */ /* If the element cannot be removed from the src set, return 0. */
if (!setTypeRemove(srcset,ele->ptr)) { if (!setTypeRemove(srcset,ptrFromObj(ele))) {
addReply(c,shared.czero); addReply(c,shared.czero);
return; return;
} }
@ -354,7 +354,7 @@ void smoveCommand(client *c) {
/* Create the destination set when it doesn't exist */ /* Create the destination set when it doesn't exist */
if (!dstset) { if (!dstset) {
dstset = setTypeCreate(ele->ptr); dstset = setTypeCreate(ptrFromObj(ele));
dbAdd(c->db,c->argv[2],dstset); dbAdd(c->db,c->argv[2],dstset);
} }
@ -363,7 +363,7 @@ void smoveCommand(client *c) {
server.dirty++; server.dirty++;
/* An extra key has changed when ele was successfully added to dstset */ /* An extra key has changed when ele was successfully added to dstset */
if (setTypeAdd(dstset,ele->ptr)) { if (setTypeAdd(dstset,ptrFromObj(ele))) {
server.dirty++; server.dirty++;
notifyKeyspaceEvent(NOTIFY_SET,"sadd",c->argv[2],c->db->id); notifyKeyspaceEvent(NOTIFY_SET,"sadd",c->argv[2],c->db->id);
} }
@ -376,7 +376,7 @@ void sismemberCommand(client *c) {
if ((set = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL || if ((set = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,set,OBJ_SET)) return; checkType(c,set,OBJ_SET)) return;
if (setTypeIsMember(set,c->argv[2]->ptr)) if (setTypeIsMember(set,ptrFromObj(c->argv[2])))
addReply(c,shared.cone); addReply(c,shared.cone);
else else
addReply(c,shared.czero); addReply(c,shared.czero);
@ -478,7 +478,7 @@ void spopWithCountCommand(client *c) {
if (encoding == OBJ_ENCODING_INTSET) { if (encoding == OBJ_ENCODING_INTSET) {
addReplyBulkLongLong(c,llele); addReplyBulkLongLong(c,llele);
objele = createStringObjectFromLongLong(llele); objele = createStringObjectFromLongLong(llele);
set->ptr = intsetRemove(set->ptr,llele,NULL); set->m_ptr = intsetRemove(set->m_ptr,llele,NULL);
} else { } else {
addReplyBulkCBuffer(c,sdsele,sdslen(sdsele)); addReplyBulkCBuffer(c,sdsele,sdslen(sdsele));
objele = createStringObject(sdsele,sdslen(sdsele)); objele = createStringObject(sdsele,sdslen(sdsele));
@ -575,10 +575,10 @@ void spopCommand(client *c) {
/* Remove the element from the set */ /* Remove the element from the set */
if (encoding == OBJ_ENCODING_INTSET) { if (encoding == OBJ_ENCODING_INTSET) {
ele = createStringObjectFromLongLong(llele); ele = createStringObjectFromLongLong(llele);
set->ptr = intsetRemove(set->ptr,llele,NULL); set->m_ptr = intsetRemove(set->m_ptr,llele,NULL);
} else { } else {
ele = createStringObject(sdsele,sdslen(sdsele)); ele = createStringObject(sdsele,sdslen(sdsele));
setTypeRemove(set,ele->ptr); setTypeRemove(set,ptrFromObj(ele));
} }
notifyKeyspaceEvent(NOTIFY_SET,"spop",c->argv[1],c->db->id); notifyKeyspaceEvent(NOTIFY_SET,"spop",c->argv[1],c->db->id);
@ -850,7 +850,7 @@ void sinterGenericCommand(client *c, robj **setkeys,
if (encoding == OBJ_ENCODING_INTSET) { if (encoding == OBJ_ENCODING_INTSET) {
/* intset with intset is simple... and fast */ /* intset with intset is simple... and fast */
if (sets[j]->encoding == OBJ_ENCODING_INTSET && if (sets[j]->encoding == OBJ_ENCODING_INTSET &&
!intsetFind((intset*)sets[j]->ptr,intobj)) !intsetFind((intset*)sets[j]->m_ptr,intobj))
{ {
break; break;
/* in order to compare an integer with an object we /* in order to compare an integer with an object we

View File

@ -261,7 +261,7 @@ int streamAppendItem(stream *s, robj **argv, int64_t numfields, streamID *added_
lp = lpAppendInteger(lp,0); /* Zero deleted so far. */ lp = lpAppendInteger(lp,0); /* Zero deleted so far. */
lp = lpAppendInteger(lp,numfields); lp = lpAppendInteger(lp,numfields);
for (int64_t i = 0; i < numfields; i++) { for (int64_t i = 0; i < numfields; i++) {
sds field = argv[i*2]->ptr; sds field = ptrFromObj(argv[i*2]);
lp = lpAppend(lp,(unsigned char*)field,sdslen(field)); lp = lpAppend(lp,(unsigned char*)field,sdslen(field));
} }
lp = lpAppendInteger(lp,0); /* Master entry zero terminator. */ lp = lpAppendInteger(lp,0); /* Master entry zero terminator. */
@ -290,7 +290,7 @@ int streamAppendItem(stream *s, robj **argv, int64_t numfields, streamID *added_
if (numfields == master_fields_count) { if (numfields == master_fields_count) {
int64_t i; int64_t i;
for (i = 0; i < master_fields_count; i++) { for (i = 0; i < master_fields_count; i++) {
sds field = argv[i*2]->ptr; sds field = ptrFromObj(argv[i*2]);
int64_t e_len; int64_t e_len;
unsigned char buf[LP_INTBUF_SIZE]; unsigned char buf[LP_INTBUF_SIZE];
unsigned char *e = lpGet(lp_ele,&e_len,buf); unsigned char *e = lpGet(lp_ele,&e_len,buf);
@ -333,7 +333,7 @@ int streamAppendItem(stream *s, robj **argv, int64_t numfields, streamID *added_
if (!(flags & STREAM_ITEM_FLAG_SAMEFIELDS)) if (!(flags & STREAM_ITEM_FLAG_SAMEFIELDS))
lp = lpAppendInteger(lp,numfields); lp = lpAppendInteger(lp,numfields);
for (int64_t i = 0; i < numfields; i++) { for (int64_t i = 0; i < numfields; i++) {
sds field = argv[i*2]->ptr, value = argv[i*2+1]->ptr; sds field = ptrFromObj(argv[i*2]), value = ptrFromObj(argv[i*2+1]);
if (!(flags & STREAM_ITEM_FLAG_SAMEFIELDS)) if (!(flags & STREAM_ITEM_FLAG_SAMEFIELDS))
lp = lpAppend(lp,(unsigned char*)field,sdslen(field)); lp = lpAppend(lp,(unsigned char*)field,sdslen(field));
lp = lpAppend(lp,(unsigned char*)value,sdslen(value)); lp = lpAppend(lp,(unsigned char*)value,sdslen(value));
@ -1104,8 +1104,8 @@ int string2ull(const char *s, unsigned long long *value) {
* If 'c' is set to NULL, no reply is sent to the client. */ * If 'c' is set to NULL, no reply is sent to the client. */
int streamGenericParseIDOrReply(client *c, robj *o, streamID *id, uint64_t missing_seq, int strict) { int streamGenericParseIDOrReply(client *c, robj *o, streamID *id, uint64_t missing_seq, int strict) {
char buf[128]; char buf[128];
if (sdslen(o->ptr) > sizeof(buf)-1) goto invalid; if (sdslen(ptrFromObj(o)) > sizeof(buf)-1) goto invalid;
memcpy(buf,o->ptr,sdslen(o->ptr)+1); memcpy(buf,ptrFromObj(o),sdslen(ptrFromObj(o))+1);
if (strict && (buf[0] == '-' || buf[0] == '+') && buf[1] == '\0') if (strict && (buf[0] == '-' || buf[0] == '+') && buf[1] == '\0')
goto invalid; goto invalid;
@ -1178,14 +1178,14 @@ void xaddCommand(client *c) {
find an option, or the ID. */ find an option, or the ID. */
for (; i < c->argc; i++) { for (; i < c->argc; i++) {
int moreargs = (c->argc-1) - i; /* Number of additional arguments. */ int moreargs = (c->argc-1) - i; /* Number of additional arguments. */
char *opt = c->argv[i]->ptr; char *opt = ptrFromObj(c->argv[i]);
if (opt[0] == '*' && opt[1] == '\0') { if (opt[0] == '*' && opt[1] == '\0') {
/* This is just a fast path for the common case of auto-ID /* This is just a fast path for the common case of auto-ID
* creation. */ * creation. */
break; break;
} else if (!strcasecmp(opt,"maxlen") && moreargs) { } else if (!strcasecmp(opt,"maxlen") && moreargs) {
approx_maxlen = 0; approx_maxlen = 0;
char *next = c->argv[i+1]->ptr; char *next = ptrFromObj(c->argv[i+1]);
/* Check for the form MAXLEN ~ <count>. */ /* Check for the form MAXLEN ~ <count>. */
if (moreargs >= 2 && next[0] == '~' && next[1] == '\0') { if (moreargs >= 2 && next[0] == '~' && next[1] == '\0') {
approx_maxlen = 1; approx_maxlen = 1;
@ -1221,7 +1221,7 @@ void xaddCommand(client *c) {
robj *o; robj *o;
stream *s; stream *s;
if ((o = streamTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return; if ((o = streamTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
s = o->ptr; s = ptrFromObj(o);
/* Append using the low level function and return the ID. */ /* Append using the low level function and return the ID. */
if (streamAppendItem(s,c->argv+field_pos,(c->argc-field_pos)/2, if (streamAppendItem(s,c->argv+field_pos,(c->argc-field_pos)/2,
@ -1274,7 +1274,7 @@ void xrangeGenericCommand(client *c, int rev) {
if (c->argc > 4) { if (c->argc > 4) {
for (int j = 4; j < c->argc; j++) { for (int j = 4; j < c->argc; j++) {
int additional = c->argc-j-1; int additional = c->argc-j-1;
if (strcasecmp(c->argv[j]->ptr,"COUNT") == 0 && additional >= 1) { if (strcasecmp(ptrFromObj(c->argv[j]),"COUNT") == 0 && additional >= 1) {
if (getLongLongFromObjectOrReply(c,c->argv[j+1],&count,NULL) if (getLongLongFromObjectOrReply(c,c->argv[j+1],&count,NULL)
!= C_OK) return; != C_OK) return;
if (count < 0) count = 0; if (count < 0) count = 0;
@ -1290,7 +1290,7 @@ void xrangeGenericCommand(client *c, int rev) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.emptyarray)) == NULL || if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.emptyarray)) == NULL ||
checkType(c,o,OBJ_STREAM)) return; checkType(c,o,OBJ_STREAM)) return;
s = o->ptr; s = ptrFromObj(o);
if (count == 0) { if (count == 0) {
addReplyNullArray(c); addReplyNullArray(c);
@ -1315,7 +1315,7 @@ void xlenCommand(client *c) {
robj *o; robj *o;
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL
|| checkType(c,o,OBJ_STREAM)) return; || checkType(c,o,OBJ_STREAM)) return;
stream *s = o->ptr; stream *s = ptrFromObj(o);
addReplyLongLong(c,s->length); addReplyLongLong(c,s->length);
} }
@ -1337,14 +1337,14 @@ void xreadCommand(client *c) {
streamID static_ids[STREAMID_STATIC_VECTOR_LEN]; streamID static_ids[STREAMID_STATIC_VECTOR_LEN];
streamID *ids = static_ids; streamID *ids = static_ids;
streamCG **groups = NULL; streamCG **groups = NULL;
int xreadgroup = sdslen(c->argv[0]->ptr) == 10; /* XREAD or XREADGROUP? */ int xreadgroup = sdslen(ptrFromObj(c->argv[0])) == 10; /* XREAD or XREADGROUP? */
robj *groupname = NULL; robj *groupname = NULL;
robj *consumername = NULL; robj *consumername = NULL;
/* Parse arguments. */ /* Parse arguments. */
for (int i = 1; i < c->argc; i++) { for (int i = 1; i < c->argc; i++) {
int moreargs = c->argc-i-1; int moreargs = c->argc-i-1;
char *o = c->argv[i]->ptr; char *o = ptrFromObj(c->argv[i]);
if (!strcasecmp(o,"BLOCK") && moreargs) { if (!strcasecmp(o,"BLOCK") && moreargs) {
i++; i++;
if (getTimeoutFromObjectOrReply(c,c->argv[i],&timeout, if (getTimeoutFromObjectOrReply(c,c->argv[i],&timeout,
@ -1419,18 +1419,18 @@ void xreadCommand(client *c) {
* key and group actually exist. */ * key and group actually exist. */
if (groupname) { if (groupname) {
if (o == NULL || if (o == NULL ||
(group = streamLookupCG(o->ptr,groupname->ptr)) == NULL) (group = streamLookupCG(ptrFromObj(o),ptrFromObj(groupname))) == NULL)
{ {
addReplyErrorFormat(c, "-NOGROUP No such key '%s' or consumer " addReplyErrorFormat(c, "-NOGROUP No such key '%s' or consumer "
"group '%s' in XREADGROUP with GROUP " "group '%s' in XREADGROUP with GROUP "
"option", "option",
(char*)key->ptr,(char*)groupname->ptr); (char*)ptrFromObj(key),(char*)ptrFromObj(groupname));
goto cleanup; goto cleanup;
} }
groups[id_idx] = group; groups[id_idx] = group;
} }
if (strcmp(c->argv[i]->ptr,"$") == 0) { if (strcmp(ptrFromObj(c->argv[i]),"$") == 0) {
if (xreadgroup) { if (xreadgroup) {
addReplyError(c,"The $ ID is meaningless in the context of " addReplyError(c,"The $ ID is meaningless in the context of "
"XREADGROUP: you want to read the history of " "XREADGROUP: you want to read the history of "
@ -1440,14 +1440,14 @@ void xreadCommand(client *c) {
goto cleanup; goto cleanup;
} }
if (o) { if (o) {
stream *s = o->ptr; stream *s = ptrFromObj(o);
ids[id_idx] = s->last_id; ids[id_idx] = s->last_id;
} else { } else {
ids[id_idx].ms = 0; ids[id_idx].ms = 0;
ids[id_idx].seq = 0; ids[id_idx].seq = 0;
} }
continue; continue;
} else if (strcmp(c->argv[i]->ptr,">") == 0) { } else if (strcmp(ptrFromObj(c->argv[i]),">") == 0) {
if (!xreadgroup) { if (!xreadgroup) {
addReplyError(c,"The > ID can be specified only when calling " addReplyError(c,"The > ID can be specified only when calling "
"XREADGROUP using the GROUP <group> " "XREADGROUP using the GROUP <group> "
@ -1471,7 +1471,7 @@ void xreadCommand(client *c) {
for (int i = 0; i < streams_count; i++) { for (int i = 0; i < streams_count; i++) {
robj *o = lookupKeyRead(c->db,c->argv[streams_arg+i]); robj *o = lookupKeyRead(c->db,c->argv[streams_arg+i]);
if (o == NULL) continue; if (o == NULL) continue;
stream *s = o->ptr; stream *s = ptrFromObj(o);
streamID *gt = ids+i; /* ID must be greater than this. */ streamID *gt = ids+i; /* ID must be greater than this. */
int serve_synchronously = 0; int serve_synchronously = 0;
int serve_history = 0; /* True for XREADGROUP with ID != ">". */ int serve_history = 0; /* True for XREADGROUP with ID != ">". */
@ -1520,7 +1520,7 @@ void xreadCommand(client *c) {
addReplyBulk(c,c->argv[streams_arg+i]); addReplyBulk(c,c->argv[streams_arg+i]);
streamConsumer *consumer = NULL; streamConsumer *consumer = NULL;
if (groups) consumer = streamLookupConsumer(groups[i], if (groups) consumer = streamLookupConsumer(groups[i],
consumername->ptr,1); ptrFromObj(consumername),1);
streamPropInfo spi = {c->argv[i+streams_arg],groupname}; streamPropInfo spi = {c->argv[i+streams_arg],groupname};
int flags = 0; int flags = 0;
if (noack) flags |= STREAM_RWR_NOACK; if (noack) flags |= STREAM_RWR_NOACK;
@ -1719,26 +1719,26 @@ NULL
stream *s = NULL; stream *s = NULL;
sds grpname = NULL; sds grpname = NULL;
streamCG *cg = NULL; streamCG *cg = NULL;
char *opt = c->argv[1]->ptr; /* Subcommand name. */ char *opt = ptrFromObj(c->argv[1]); /* Subcommand name. */
int mkstream = 0; int mkstream = 0;
robj *o; robj *o;
/* CREATE has an MKSTREAM option that creates the stream if it /* CREATE has an MKSTREAM option that creates the stream if it
* does not exist. */ * does not exist. */
if (c->argc == 6 && !strcasecmp(opt,"CREATE")) { if (c->argc == 6 && !strcasecmp(opt,"CREATE")) {
if (strcasecmp(c->argv[5]->ptr,"MKSTREAM")) { if (strcasecmp(ptrFromObj(c->argv[5]),"MKSTREAM")) {
addReplySubcommandSyntaxError(c); addReplySubcommandSyntaxError(c);
return; return;
} }
mkstream = 1; mkstream = 1;
grpname = c->argv[3]->ptr; grpname = ptrFromObj(c->argv[3]);
} }
/* Everything but the "HELP" option requires a key and group name. */ /* Everything but the "HELP" option requires a key and group name. */
if (c->argc >= 4) { if (c->argc >= 4) {
o = lookupKeyWrite(c->db,c->argv[2]); o = lookupKeyWrite(c->db,c->argv[2]);
if (o) s = o->ptr; if (o) s = ptrFromObj(o);
grpname = c->argv[3]->ptr; grpname = ptrFromObj(c->argv[3]);
} }
/* Check for missing key/group. */ /* Check for missing key/group. */
@ -1761,7 +1761,7 @@ NULL
{ {
addReplyErrorFormat(c, "-NOGROUP No such consumer group '%s' " addReplyErrorFormat(c, "-NOGROUP No such consumer group '%s' "
"for key name '%s'", "for key name '%s'",
(char*)grpname, (char*)c->argv[2]->ptr); (char*)grpname, (char*)ptrFromObj(c->argv[2]));
return; return;
} }
} }
@ -1769,7 +1769,7 @@ NULL
/* Dispatch the different subcommands. */ /* Dispatch the different subcommands. */
if (!strcasecmp(opt,"CREATE") && (c->argc == 5 || c->argc == 6)) { if (!strcasecmp(opt,"CREATE") && (c->argc == 5 || c->argc == 6)) {
streamID id; streamID id;
if (!strcmp(c->argv[4]->ptr,"$")) { if (!strcmp(ptrFromObj(c->argv[4]),"$")) {
if (s) { if (s) {
id = s->last_id; id = s->last_id;
} else { } else {
@ -1784,7 +1784,7 @@ NULL
if (s == NULL && mkstream) { if (s == NULL && mkstream) {
o = createStreamObject(); o = createStreamObject();
dbAdd(c->db,c->argv[2],o); dbAdd(c->db,c->argv[2],o);
s = o->ptr; s = ptrFromObj(o);
} }
streamCG *cg = streamCreateCG(s,grpname,sdslen(grpname),&id); streamCG *cg = streamCreateCG(s,grpname,sdslen(grpname),&id);
@ -1799,7 +1799,7 @@ NULL
} }
} else if (!strcasecmp(opt,"SETID") && c->argc == 5) { } else if (!strcasecmp(opt,"SETID") && c->argc == 5) {
streamID id; streamID id;
if (!strcmp(c->argv[4]->ptr,"$")) { if (!strcmp(ptrFromObj(c->argv[4]),"$")) {
id = s->last_id; id = s->last_id;
} else if (streamParseIDOrReply(c,c->argv[4],&id,0) != C_OK) { } else if (streamParseIDOrReply(c,c->argv[4],&id,0) != C_OK) {
return; return;
@ -1822,7 +1822,7 @@ NULL
} else if (!strcasecmp(opt,"DELCONSUMER") && c->argc == 5) { } else if (!strcasecmp(opt,"DELCONSUMER") && c->argc == 5) {
/* Delete the consumer and returns the number of pending messages /* Delete the consumer and returns the number of pending messages
* that were yet associated with such a consumer. */ * that were yet associated with such a consumer. */
long long pending = streamDelConsumer(cg,c->argv[4]->ptr); long long pending = streamDelConsumer(cg,ptrFromObj(c->argv[4]));
addReplyLongLong(c,pending); addReplyLongLong(c,pending);
server.dirty++; server.dirty++;
notifyKeyspaceEvent(NOTIFY_STREAM,"xgroup-delconsumer", notifyKeyspaceEvent(NOTIFY_STREAM,"xgroup-delconsumer",
@ -1841,7 +1841,7 @@ void xsetidCommand(client *c) {
robj *o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr); robj *o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr);
if (o == NULL || checkType(c,o,OBJ_STREAM)) return; if (o == NULL || checkType(c,o,OBJ_STREAM)) return;
stream *s = o->ptr; stream *s = ptrFromObj(o);
streamID id; streamID id;
if (streamParseStrictIDOrReply(c,c->argv[2],&id,0) != C_OK) return; if (streamParseStrictIDOrReply(c,c->argv[2],&id,0) != C_OK) return;
@ -1882,7 +1882,7 @@ void xackCommand(client *c) {
robj *o = lookupKeyRead(c->db,c->argv[1]); robj *o = lookupKeyRead(c->db,c->argv[1]);
if (o) { if (o) {
if (checkType(c,o,OBJ_STREAM)) return; /* Type error. */ if (checkType(c,o,OBJ_STREAM)) return; /* Type error. */
group = streamLookupCG(o->ptr,c->argv[2]->ptr); group = streamLookupCG(ptrFromObj(o),ptrFromObj(c->argv[2]));
} }
/* No key or group? Nothing to ack. */ /* No key or group? Nothing to ack. */
@ -1955,11 +1955,11 @@ void xpendingCommand(client *c) {
if (o && checkType(c,o,OBJ_STREAM)) return; if (o && checkType(c,o,OBJ_STREAM)) return;
if (o == NULL || if (o == NULL ||
(group = streamLookupCG(o->ptr,groupname->ptr)) == NULL) (group = streamLookupCG(ptrFromObj(o),ptrFromObj(groupname))) == NULL)
{ {
addReplyErrorFormat(c, "-NOGROUP No such key '%s' or consumer " addReplyErrorFormat(c, "-NOGROUP No such key '%s' or consumer "
"group '%s'", "group '%s'",
(char*)key->ptr,(char*)groupname->ptr); (char*)ptrFromObj(key),(char*)ptrFromObj(groupname));
return; return;
} }
@ -2009,7 +2009,7 @@ void xpendingCommand(client *c) {
/* XPENDING <key> <group> <start> <stop> <count> [<consumer>] variant. */ /* XPENDING <key> <group> <start> <stop> <count> [<consumer>] variant. */
else { else {
streamConsumer *consumer = consumername ? streamConsumer *consumer = consumername ?
streamLookupConsumer(group,consumername->ptr,0): streamLookupConsumer(group,ptrFromObj(consumername),0):
NULL; NULL;
/* If a consumer name was mentioned but it does not exist, we can /* If a consumer name was mentioned but it does not exist, we can
@ -2138,15 +2138,15 @@ void xclaimCommand(client *c) {
if (o) { if (o) {
if (checkType(c,o,OBJ_STREAM)) return; /* Type error. */ if (checkType(c,o,OBJ_STREAM)) return; /* Type error. */
group = streamLookupCG(o->ptr,c->argv[2]->ptr); group = streamLookupCG(ptrFromObj(o),ptrFromObj(c->argv[2]));
} }
/* No key or group? Send an error given that the group creation /* No key or group? Send an error given that the group creation
* is mandatory. */ * is mandatory. */
if (o == NULL || group == NULL) { if (o == NULL || group == NULL) {
addReplyErrorFormat(c,"-NOGROUP No such key '%s' or " addReplyErrorFormat(c,"-NOGROUP No such key '%s' or "
"consumer group '%s'", (char*)c->argv[1]->ptr, "consumer group '%s'", (char*)ptrFromObj(c->argv[1]),
(char*)c->argv[2]->ptr); (char*)ptrFromObj(c->argv[2]));
return; return;
} }
@ -2173,7 +2173,7 @@ void xclaimCommand(client *c) {
int propagate_last_id = 0; int propagate_last_id = 0;
for (; j < c->argc; j++) { for (; j < c->argc; j++) {
int moreargs = (c->argc-1) - j; /* Number of additional arguments. */ int moreargs = (c->argc-1) - j; /* Number of additional arguments. */
char *opt = c->argv[j]->ptr; char *opt = ptrFromObj(c->argv[j]);
if (!strcasecmp(opt,"FORCE")) { if (!strcasecmp(opt,"FORCE")) {
force = 1; force = 1;
} else if (!strcasecmp(opt,"JUSTID")) { } else if (!strcasecmp(opt,"JUSTID")) {
@ -2225,7 +2225,7 @@ void xclaimCommand(client *c) {
} }
/* Do the actual claiming. */ /* Do the actual claiming. */
streamConsumer *consumer = streamLookupConsumer(group,c->argv[3]->ptr,1); streamConsumer *consumer = streamLookupConsumer(group,ptrFromObj(c->argv[3]),1);
void *arraylenptr = addReplyDeferredLen(c); void *arraylenptr = addReplyDeferredLen(c);
size_t arraylen = 0; size_t arraylen = 0;
for (int j = 5; j <= last_id_arg; j++) { for (int j = 5; j <= last_id_arg; j++) {
@ -2245,7 +2245,7 @@ void xclaimCommand(client *c) {
* and replication of consumer groups. */ * and replication of consumer groups. */
if (force && nack == raxNotFound) { if (force && nack == raxNotFound) {
streamIterator myiterator; streamIterator myiterator;
streamIteratorStart(&myiterator,o->ptr,&id,&id,0); streamIteratorStart(&myiterator,ptrFromObj(o),&id,&id,0);
int64_t numfields; int64_t numfields;
int found = 0; int found = 0;
streamID item_id; streamID item_id;
@ -2287,7 +2287,7 @@ void xclaimCommand(client *c) {
if (justid) { if (justid) {
addReplyStreamID(c,&id); addReplyStreamID(c,&id);
} else { } else {
size_t emitted = streamReplyWithRange(c,o->ptr,&id,&id,1,0, size_t emitted = streamReplyWithRange(c,ptrFromObj(o),&id,&id,1,0,
NULL,NULL,STREAM_RWR_RAWENTRIES,NULL); NULL,NULL,STREAM_RWR_RAWENTRIES,NULL);
if (!emitted) addReplyNull(c); if (!emitted) addReplyNull(c);
} }
@ -2318,7 +2318,7 @@ void xdelCommand(client *c) {
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL
|| checkType(c,o,OBJ_STREAM)) return; || checkType(c,o,OBJ_STREAM)) return;
stream *s = o->ptr; stream *s = ptrFromObj(o);
/* We need to sanity check the IDs passed to start. Even if not /* We need to sanity check the IDs passed to start. Even if not
* a big issue, it is not great that the command is only partially * a big issue, it is not great that the command is only partially
@ -2363,7 +2363,7 @@ void xtrimCommand(client *c) {
* number of elements removed from the stream. */ * number of elements removed from the stream. */
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL
|| checkType(c,o,OBJ_STREAM)) return; || checkType(c,o,OBJ_STREAM)) return;
stream *s = o->ptr; stream *s = ptrFromObj(o);
/* Argument parsing. */ /* Argument parsing. */
int trim_strategy = TRIM_STRATEGY_NONE; int trim_strategy = TRIM_STRATEGY_NONE;
@ -2376,11 +2376,11 @@ void xtrimCommand(client *c) {
int i = 2; /* Start of options. */ int i = 2; /* Start of options. */
for (; i < c->argc; i++) { for (; i < c->argc; i++) {
int moreargs = (c->argc-1) - i; /* Number of additional arguments. */ int moreargs = (c->argc-1) - i; /* Number of additional arguments. */
char *opt = c->argv[i]->ptr; char *opt = ptrFromObj(c->argv[i]);
if (!strcasecmp(opt,"maxlen") && moreargs) { if (!strcasecmp(opt,"maxlen") && moreargs) {
approx_maxlen = 0; approx_maxlen = 0;
trim_strategy = TRIM_STRATEGY_MAXLEN; trim_strategy = TRIM_STRATEGY_MAXLEN;
char *next = c->argv[i+1]->ptr; char *next = ptrFromObj(c->argv[i+1]);
/* Check for the form MAXLEN ~ <count>. */ /* Check for the form MAXLEN ~ <count>. */
if (moreargs >= 2 && next[0] == '~' && next[1] == '\0') { if (moreargs >= 2 && next[0] == '~' && next[1] == '\0') {
approx_maxlen = 1; approx_maxlen = 1;
@ -2439,7 +2439,7 @@ NULL
robj *key; robj *key;
/* HELP is special. Handle it ASAP. */ /* HELP is special. Handle it ASAP. */
if (!strcasecmp(c->argv[1]->ptr,"HELP")) { if (!strcasecmp(ptrFromObj(c->argv[1]),"HELP")) {
addReplyHelp(c, help); addReplyHelp(c, help);
return; return;
} else if (c->argc < 3) { } else if (c->argc < 3) {
@ -2449,22 +2449,22 @@ NULL
/* With the exception of HELP handled before any other sub commands, all /* With the exception of HELP handled before any other sub commands, all
* the ones are in the form of "<subcommand> <key>". */ * the ones are in the form of "<subcommand> <key>". */
opt = c->argv[1]->ptr; opt = ptrFromObj(c->argv[1]);
key = c->argv[2]; key = c->argv[2];
/* Lookup the key now, this is common for all the subcommands but HELP. */ /* Lookup the key now, this is common for all the subcommands but HELP. */
robj *o = lookupKeyWriteOrReply(c,key,shared.nokeyerr); robj *o = lookupKeyWriteOrReply(c,key,shared.nokeyerr);
if (o == NULL || checkType(c,o,OBJ_STREAM)) return; if (o == NULL || checkType(c,o,OBJ_STREAM)) return;
s = o->ptr; s = ptrFromObj(o);
/* Dispatch the different subcommands. */ /* Dispatch the different subcommands. */
if (!strcasecmp(opt,"CONSUMERS") && c->argc == 4) { if (!strcasecmp(opt,"CONSUMERS") && c->argc == 4) {
/* XINFO CONSUMERS <key> <group>. */ /* XINFO CONSUMERS <key> <group>. */
streamCG *cg = streamLookupCG(s,c->argv[3]->ptr); streamCG *cg = streamLookupCG(s,ptrFromObj(c->argv[3]));
if (cg == NULL) { if (cg == NULL) {
addReplyErrorFormat(c, "-NOGROUP No such consumer group '%s' " addReplyErrorFormat(c, "-NOGROUP No such consumer group '%s' "
"for key name '%s'", "for key name '%s'",
(char*)c->argv[3]->ptr, (char*)key->ptr); (char*)ptrFromObj(c->argv[3]), (char*)ptrFromObj(key));
return; return;
} }

View File

@ -100,7 +100,7 @@ void setCommand(client *c) {
int flags = OBJ_SET_NO_FLAGS; int flags = OBJ_SET_NO_FLAGS;
for (j = 3; j < c->argc; j++) { for (j = 3; j < c->argc; j++) {
char *a = c->argv[j]->ptr; char *a = ptrFromObj(c->argv[j]);
robj *next = (j == c->argc-1) ? NULL : c->argv[j+1]; robj *next = (j == c->argc-1) ? NULL : c->argv[j+1];
if ((a[0] == 'n' || a[0] == 'N') && if ((a[0] == 'n' || a[0] == 'N') &&
@ -184,7 +184,7 @@ void getsetCommand(client *c) {
void setrangeCommand(client *c) { void setrangeCommand(client *c) {
robj *o; robj *o;
long offset; long offset;
sds value = c->argv[3]->ptr; sds value = ptrFromObj(c->argv[3]);
if (getLongFromObjectOrReply(c,c->argv[2],&offset,NULL) != C_OK) if (getLongFromObjectOrReply(c,c->argv[2],&offset,NULL) != C_OK)
return; return;
@ -231,14 +231,14 @@ void setrangeCommand(client *c) {
} }
if (sdslen(value) > 0) { if (sdslen(value) > 0) {
o->ptr = sdsgrowzero(o->ptr,offset+sdslen(value)); o->m_ptr = sdsgrowzero(ptrFromObj(o),offset+sdslen(value));
memcpy((char*)o->ptr+offset,value,sdslen(value)); memcpy((char*)ptrFromObj(o)+offset,value,sdslen(value));
signalModifiedKey(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[1]);
notifyKeyspaceEvent(NOTIFY_STRING, notifyKeyspaceEvent(NOTIFY_STRING,
"setrange",c->argv[1],c->db->id); "setrange",c->argv[1],c->db->id);
server.dirty++; server.dirty++;
} }
addReplyLongLong(c,sdslen(o->ptr)); addReplyLongLong(c,sdslen(ptrFromObj(o)));
} }
void getrangeCommand(client *c) { void getrangeCommand(client *c) {
@ -256,9 +256,9 @@ void getrangeCommand(client *c) {
if (o->encoding == OBJ_ENCODING_INT) { if (o->encoding == OBJ_ENCODING_INT) {
str = llbuf; str = llbuf;
strlen = ll2string(llbuf,sizeof(llbuf),(long)o->ptr); strlen = ll2string(llbuf,sizeof(llbuf),(long)ptrFromObj(o));
} else { } else {
str = o->ptr; str = ptrFromObj(o);
strlen = sdslen(str); strlen = sdslen(str);
} }
@ -357,7 +357,7 @@ void incrDecrCommand(client *c, long long incr) {
value >= LONG_MIN && value <= LONG_MAX) value >= LONG_MIN && value <= LONG_MAX)
{ {
new = o; new = o;
o->ptr = (void*)((long)value); o->m_ptr = (void*)((long)value);
} else { } else {
new = createStringObjectFromLongLongForValue(value); new = createStringObjectFromLongLongForValue(value);
if (o) { if (o) {
@ -448,14 +448,14 @@ void appendCommand(client *c) {
/* "append" is an argument, so always an sds */ /* "append" is an argument, so always an sds */
append = c->argv[2]; append = c->argv[2];
totlen = stringObjectLen(o)+sdslen(append->ptr); totlen = stringObjectLen(o)+sdslen(ptrFromObj(append));
if (checkStringLength(c,totlen) != C_OK) if (checkStringLength(c,totlen) != C_OK)
return; return;
/* Append the value */ /* Append the value */
o = dbUnshareStringValue(c->db,c->argv[1],o); o = dbUnshareStringValue(c->db,c->argv[1],o);
o->ptr = sdscatlen(o->ptr,append->ptr,sdslen(append->ptr)); o->m_ptr = sdscatlen(ptrFromObj(o),ptrFromObj(append),sdslen(ptrFromObj(append)));
totlen = sdslen(o->ptr); totlen = sdslen(ptrFromObj(o));
} }
signalModifiedKey(c->db,c->argv[1]); signalModifiedKey(c->db,c->argv[1]);
notifyKeyspaceEvent(NOTIFY_STRING,"append",c->argv[1],c->db->id); notifyKeyspaceEvent(NOTIFY_STRING,"append",c->argv[1],c->db->id);

View File

@ -526,26 +526,26 @@ static int zslParseRange(robj *min, robj *max, zrangespec *spec) {
* ZRANGEBYSCORE zset (1.5 (2.5 will match min < x < max * ZRANGEBYSCORE zset (1.5 (2.5 will match min < x < max
* ZRANGEBYSCORE zset 1.5 2.5 will instead match min <= x <= max */ * ZRANGEBYSCORE zset 1.5 2.5 will instead match min <= x <= max */
if (min->encoding == OBJ_ENCODING_INT) { if (min->encoding == OBJ_ENCODING_INT) {
spec->min = (long)min->ptr; spec->min = (long)min->m_ptr;
} else { } else {
if (((char*)min->ptr)[0] == '(') { if (((char*)ptrFromObj(min))[0] == '(') {
spec->min = strtod((char*)min->ptr+1,&eptr); spec->min = strtod((char*)ptrFromObj(min)+1,&eptr);
if (eptr[0] != '\0' || isnan(spec->min)) return C_ERR; if (eptr[0] != '\0' || isnan(spec->min)) return C_ERR;
spec->minex = 1; spec->minex = 1;
} else { } else {
spec->min = strtod((char*)min->ptr,&eptr); spec->min = strtod((char*)ptrFromObj(min),&eptr);
if (eptr[0] != '\0' || isnan(spec->min)) return C_ERR; if (eptr[0] != '\0' || isnan(spec->min)) return C_ERR;
} }
} }
if (max->encoding == OBJ_ENCODING_INT) { if (max->encoding == OBJ_ENCODING_INT) {
spec->max = (long)max->ptr; spec->max = (long)max->m_ptr;
} else { } else {
if (((char*)max->ptr)[0] == '(') { if (((char*)ptrFromObj(max))[0] == '(') {
spec->max = strtod((char*)max->ptr+1,&eptr); spec->max = strtod((char*)ptrFromObj(max)+1,&eptr);
if (eptr[0] != '\0' || isnan(spec->max)) return C_ERR; if (eptr[0] != '\0' || isnan(spec->max)) return C_ERR;
spec->maxex = 1; spec->maxex = 1;
} else { } else {
spec->max = strtod((char*)max->ptr,&eptr); spec->max = strtod((char*)ptrFromObj(max),&eptr);
if (eptr[0] != '\0' || isnan(spec->max)) return C_ERR; if (eptr[0] != '\0' || isnan(spec->max)) return C_ERR;
} }
} }
@ -569,7 +569,7 @@ static int zslParseRange(robj *min, robj *max, zrangespec *spec) {
* If the string is not a valid range C_ERR is returned, and the value * If the string is not a valid range C_ERR is returned, and the value
* of *dest and *ex is undefined. */ * of *dest and *ex is undefined. */
int zslParseLexRangeItem(robj *item, sds *dest, int *ex) { int zslParseLexRangeItem(robj *item, sds *dest, int *ex) {
char *c = item->ptr; char *c = ptrFromObj(item);
switch(c[0]) { switch(c[0]) {
case '+': case '+':
@ -1156,9 +1156,9 @@ unsigned char *zzlDeleteRangeByRank(unsigned char *zl, unsigned int start, unsig
unsigned long zsetLength(const robj *zobj) { unsigned long zsetLength(const robj *zobj) {
unsigned long length = 0; unsigned long length = 0;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
length = zzlLength(zobj->ptr); length = zzlLength(zobj->m_ptr);
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
length = ((const zset*)zobj->ptr)->zsl->length; length = ((const zset*)zobj->m_ptr)->zsl->length;
} else { } else {
serverPanic("Unknown sorted set encoding"); serverPanic("Unknown sorted set encoding");
} }
@ -1173,7 +1173,7 @@ void zsetConvert(robj *zobj, int encoding) {
if (zobj->encoding == encoding) return; if (zobj->encoding == encoding) return;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr; unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
unsigned char *vstr; unsigned char *vstr;
unsigned int vlen; unsigned int vlen;
@ -1204,8 +1204,8 @@ void zsetConvert(robj *zobj, int encoding) {
zzlNext(zl,&eptr,&sptr); zzlNext(zl,&eptr,&sptr);
} }
zfree(zobj->ptr); zfree(zobj->m_ptr);
zobj->ptr = zs; zobj->m_ptr = zs;
zobj->encoding = OBJ_ENCODING_SKIPLIST; zobj->encoding = OBJ_ENCODING_SKIPLIST;
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
unsigned char *zl = ziplistNew(); unsigned char *zl = ziplistNew();
@ -1215,7 +1215,7 @@ void zsetConvert(robj *zobj, int encoding) {
/* Approach similar to zslFree(), since we want to free the skiplist at /* Approach similar to zslFree(), since we want to free the skiplist at
* the same time as creating the ziplist. */ * the same time as creating the ziplist. */
zs = zobj->ptr; zs = zobj->m_ptr;
dictRelease(zs->pdict); dictRelease(zs->pdict);
node = zs->zsl->header->level[0].forward; node = zs->zsl->header->level[0].forward;
zfree(zs->zsl->header); zfree(zs->zsl->header);
@ -1229,7 +1229,7 @@ void zsetConvert(robj *zobj, int encoding) {
} }
zfree(zs); zfree(zs);
zobj->ptr = zl; zobj->m_ptr = zl;
zobj->encoding = OBJ_ENCODING_ZIPLIST; zobj->encoding = OBJ_ENCODING_ZIPLIST;
} else { } else {
serverPanic("Unknown sorted set encoding"); serverPanic("Unknown sorted set encoding");
@ -1241,7 +1241,7 @@ void zsetConvert(robj *zobj, int encoding) {
* expected ranges. */ * expected ranges. */
void zsetConvertToZiplistIfNeeded(robj *zobj, size_t maxelelen) { void zsetConvertToZiplistIfNeeded(robj *zobj, size_t maxelelen) {
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) return; if (zobj->encoding == OBJ_ENCODING_ZIPLIST) return;
zset *zset = zobj->ptr; zset *zset = zobj->m_ptr;
if (zset->zsl->length <= server.zset_max_ziplist_entries && if (zset->zsl->length <= server.zset_max_ziplist_entries &&
maxelelen <= server.zset_max_ziplist_value) maxelelen <= server.zset_max_ziplist_value)
@ -1256,9 +1256,9 @@ int zsetScore(robj *zobj, sds member, double *score) {
if (!zobj || !member) return C_ERR; if (!zobj || !member) return C_ERR;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
if (zzlFind(zobj->ptr, member, score) == NULL) return C_ERR; if (zzlFind(zobj->m_ptr, member, score) == NULL) return C_ERR;
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
dictEntry *de = dictFind(zs->pdict, member); dictEntry *de = dictFind(zs->pdict, member);
if (de == NULL) return C_ERR; if (de == NULL) return C_ERR;
*score = *(double*)dictGetVal(de); *score = *(double*)dictGetVal(de);
@ -1329,7 +1329,7 @@ int zsetAdd(robj *zobj, double score, sds ele, int *flags, double *newscore) {
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *eptr; unsigned char *eptr;
if ((eptr = zzlFind(zobj->ptr,ele,&curscore)) != NULL) { if ((eptr = zzlFind(zobj->m_ptr,ele,&curscore)) != NULL) {
/* NX? Return, same element already exists. */ /* NX? Return, same element already exists. */
if (nx) { if (nx) {
*flags |= ZADD_NOP; *flags |= ZADD_NOP;
@ -1348,16 +1348,16 @@ int zsetAdd(robj *zobj, double score, sds ele, int *flags, double *newscore) {
/* Remove and re-insert when score changed. */ /* Remove and re-insert when score changed. */
if (score != curscore) { if (score != curscore) {
zobj->ptr = zzlDelete(zobj->ptr,eptr); zobj->m_ptr = zzlDelete(zobj->m_ptr,eptr);
zobj->ptr = zzlInsert(zobj->ptr,ele,score); zobj->m_ptr = zzlInsert(zobj->m_ptr,ele,score);
*flags |= ZADD_UPDATED; *flags |= ZADD_UPDATED;
} }
return 1; return 1;
} else if (!xx) { } else if (!xx) {
/* Optimize: check if the element is too large or the list /* Optimize: check if the element is too large or the list
* becomes too long *before* executing zzlInsert. */ * becomes too long *before* executing zzlInsert. */
zobj->ptr = zzlInsert(zobj->ptr,ele,score); zobj->m_ptr = zzlInsert(zobj->m_ptr,ele,score);
if (zzlLength(zobj->ptr) > server.zset_max_ziplist_entries) if (zzlLength(zobj->m_ptr) > server.zset_max_ziplist_entries)
zsetConvert(zobj,OBJ_ENCODING_SKIPLIST); zsetConvert(zobj,OBJ_ENCODING_SKIPLIST);
if (sdslen(ele) > server.zset_max_ziplist_value) if (sdslen(ele) > server.zset_max_ziplist_value)
zsetConvert(zobj,OBJ_ENCODING_SKIPLIST); zsetConvert(zobj,OBJ_ENCODING_SKIPLIST);
@ -1369,7 +1369,7 @@ int zsetAdd(robj *zobj, double score, sds ele, int *flags, double *newscore) {
return 1; return 1;
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
zskiplistNode *znode; zskiplistNode *znode;
dictEntry *de; dictEntry *de;
@ -1425,12 +1425,12 @@ int zsetDel(robj *zobj, sds ele) {
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *eptr; unsigned char *eptr;
if ((eptr = zzlFind(zobj->ptr,ele,NULL)) != NULL) { if ((eptr = zzlFind(zobj->m_ptr,ele,NULL)) != NULL) {
zobj->ptr = zzlDelete(zobj->ptr,eptr); zobj->m_ptr = zzlDelete(zobj->m_ptr,eptr);
return 1; return 1;
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
dictEntry *de; dictEntry *de;
double score; double score;
@ -1477,7 +1477,7 @@ long zsetRank(robj *zobj, sds ele, int reverse) {
llen = zsetLength(zobj); llen = zsetLength(zobj);
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr; unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
eptr = ziplistIndex(zl,0); eptr = ziplistIndex(zl,0);
@ -1502,7 +1502,7 @@ long zsetRank(robj *zobj, sds ele, int reverse) {
return -1; return -1;
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
dictEntry *de; dictEntry *de;
double score; double score;
@ -1550,7 +1550,7 @@ void zaddGenericCommand(client *c, int flags) {
* of the score of the first score-element pair. */ * of the score of the first score-element pair. */
scoreidx = 2; scoreidx = 2;
while(scoreidx < c->argc) { while(scoreidx < c->argc) {
char *opt = c->argv[scoreidx]->ptr; char *opt = ptrFromObj(c->argv[scoreidx]);
if (!strcasecmp(opt,"nx")) flags |= ZADD_NX; if (!strcasecmp(opt,"nx")) flags |= ZADD_NX;
else if (!strcasecmp(opt,"xx")) flags |= ZADD_XX; else if (!strcasecmp(opt,"xx")) flags |= ZADD_XX;
else if (!strcasecmp(opt,"ch")) flags |= ZADD_CH; else if (!strcasecmp(opt,"ch")) flags |= ZADD_CH;
@ -1601,7 +1601,7 @@ void zaddGenericCommand(client *c, int flags) {
if (zobj == NULL) { if (zobj == NULL) {
if (xx) goto reply_to_client; /* No key + XX option: nothing to do. */ if (xx) goto reply_to_client; /* No key + XX option: nothing to do. */
if (server.zset_max_ziplist_entries == 0 || if (server.zset_max_ziplist_entries == 0 ||
server.zset_max_ziplist_value < sdslen(c->argv[scoreidx+1]->ptr)) server.zset_max_ziplist_value < sdslen(ptrFromObj(c->argv[scoreidx+1])))
{ {
zobj = createZsetObject(); zobj = createZsetObject();
} else { } else {
@ -1620,7 +1620,7 @@ void zaddGenericCommand(client *c, int flags) {
score = scores[j]; score = scores[j];
int retflags = flags; int retflags = flags;
ele = c->argv[scoreidx+1+j*2]->ptr; ele = ptrFromObj(c->argv[scoreidx+1+j*2]);
int retval = zsetAdd(zobj, score, ele, &retflags, &newscore); int retval = zsetAdd(zobj, score, ele, &retflags, &newscore);
if (retval == 0) { if (retval == 0) {
addReplyError(c,nanerr); addReplyError(c,nanerr);
@ -1669,7 +1669,7 @@ void zremCommand(client *c) {
checkType(c,zobj,OBJ_ZSET)) return; checkType(c,zobj,OBJ_ZSET)) return;
for (j = 2; j < c->argc; j++) { for (j = 2; j < c->argc; j++) {
if (zsetDel(zobj,c->argv[j]->ptr)) deleted++; if (zsetDel(zobj,ptrFromObj(c->argv[j]))) deleted++;
if (zsetLength(zobj) == 0) { if (zsetLength(zobj) == 0) {
dbDelete(c->db,key); dbDelete(c->db,key);
keyremoved = 1; keyremoved = 1;
@ -1741,21 +1741,21 @@ void zremrangeGenericCommand(client *c, int rangetype) {
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
switch(rangetype) { switch(rangetype) {
case ZRANGE_RANK: case ZRANGE_RANK:
zobj->ptr = zzlDeleteRangeByRank(zobj->ptr,start+1,end+1,&deleted); zobj->m_ptr = zzlDeleteRangeByRank(zobj->m_ptr,start+1,end+1,&deleted);
break; break;
case ZRANGE_SCORE: case ZRANGE_SCORE:
zobj->ptr = zzlDeleteRangeByScore(zobj->ptr,&range,&deleted); zobj->m_ptr = zzlDeleteRangeByScore(zobj->m_ptr,&range,&deleted);
break; break;
case ZRANGE_LEX: case ZRANGE_LEX:
zobj->ptr = zzlDeleteRangeByLex(zobj->ptr,&lexrange,&deleted); zobj->m_ptr = zzlDeleteRangeByLex(zobj->m_ptr,&lexrange,&deleted);
break; break;
} }
if (zzlLength(zobj->ptr) == 0) { if (zzlLength(zobj->m_ptr) == 0) {
dbDelete(c->db,key); dbDelete(c->db,key);
keyremoved = 1; keyremoved = 1;
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
switch(rangetype) { switch(rangetype) {
case ZRANGE_RANK: case ZRANGE_RANK:
deleted = zslDeleteRangeByRank(zs->zsl,start+1,end+1,zs->pdict); deleted = zslDeleteRangeByRank(zs->zsl,start+1,end+1,zs->pdict);
@ -1869,11 +1869,11 @@ void zuiInitIterator(zsetopsrc *op) {
if (op->type == OBJ_SET) { if (op->type == OBJ_SET) {
iterset *it = &op->iter.set; iterset *it = &op->iter.set;
if (op->encoding == OBJ_ENCODING_INTSET) { if (op->encoding == OBJ_ENCODING_INTSET) {
it->is.is = op->subject->ptr; it->is.is = op->subject->m_ptr;
it->is.ii = 0; it->is.ii = 0;
} else if (op->encoding == OBJ_ENCODING_HT) { } else if (op->encoding == OBJ_ENCODING_HT) {
it->ht.dict = op->subject->ptr; it->ht.dict = op->subject->m_ptr;
it->ht.di = dictGetIterator(op->subject->ptr); it->ht.di = dictGetIterator(op->subject->m_ptr);
it->ht.de = dictNext(it->ht.di); it->ht.de = dictNext(it->ht.di);
} else { } else {
serverPanic("Unknown set encoding"); serverPanic("Unknown set encoding");
@ -1881,14 +1881,14 @@ void zuiInitIterator(zsetopsrc *op) {
} else if (op->type == OBJ_ZSET) { } else if (op->type == OBJ_ZSET) {
iterzset *it = &op->iter.zset; iterzset *it = &op->iter.zset;
if (op->encoding == OBJ_ENCODING_ZIPLIST) { if (op->encoding == OBJ_ENCODING_ZIPLIST) {
it->zl.zl = op->subject->ptr; it->zl.zl = op->subject->m_ptr;
it->zl.eptr = ziplistIndex(it->zl.zl,0); it->zl.eptr = ziplistIndex(it->zl.zl,0);
if (it->zl.eptr != NULL) { if (it->zl.eptr != NULL) {
it->zl.sptr = ziplistNext(it->zl.zl,it->zl.eptr); it->zl.sptr = ziplistNext(it->zl.zl,it->zl.eptr);
serverAssert(it->zl.sptr != NULL); serverAssert(it->zl.sptr != NULL);
} }
} else if (op->encoding == OBJ_ENCODING_SKIPLIST) { } else if (op->encoding == OBJ_ENCODING_SKIPLIST) {
it->sl.zs = op->subject->ptr; it->sl.zs = op->subject->m_ptr;
it->sl.node = it->sl.zs->zsl->header->level[0].forward; it->sl.node = it->sl.zs->zsl->header->level[0].forward;
} else { } else {
serverPanic("Unknown sorted set encoding"); serverPanic("Unknown sorted set encoding");
@ -1931,18 +1931,18 @@ unsigned long zuiLength(zsetopsrc *op) {
if (op->type == OBJ_SET) { if (op->type == OBJ_SET) {
if (op->encoding == OBJ_ENCODING_INTSET) { if (op->encoding == OBJ_ENCODING_INTSET) {
return intsetLen(op->subject->ptr); return intsetLen(op->subject->m_ptr);
} else if (op->encoding == OBJ_ENCODING_HT) { } else if (op->encoding == OBJ_ENCODING_HT) {
dict *ht = op->subject->ptr; dict *ht = op->subject->m_ptr;
return dictSize(ht); return dictSize(ht);
} else { } else {
serverPanic("Unknown set encoding"); serverPanic("Unknown set encoding");
} }
} else if (op->type == OBJ_ZSET) { } else if (op->type == OBJ_ZSET) {
if (op->encoding == OBJ_ENCODING_ZIPLIST) { if (op->encoding == OBJ_ENCODING_ZIPLIST) {
return zzlLength(op->subject->ptr); return zzlLength(op->subject->m_ptr);
} else if (op->encoding == OBJ_ENCODING_SKIPLIST) { } else if (op->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = op->subject->ptr; zset *zs = op->subject->m_ptr;
return zs->zsl->length; return zs->zsl->length;
} else { } else {
serverPanic("Unknown sorted set encoding"); serverPanic("Unknown sorted set encoding");
@ -2085,7 +2085,7 @@ int zuiFind(zsetopsrc *op, zsetopval *val, double *score) {
if (op->type == OBJ_SET) { if (op->type == OBJ_SET) {
if (op->encoding == OBJ_ENCODING_INTSET) { if (op->encoding == OBJ_ENCODING_INTSET) {
if (zuiLongLongFromValue(val) && if (zuiLongLongFromValue(val) &&
intsetFind(op->subject->ptr,val->ell)) intsetFind(op->subject->m_ptr,val->ell))
{ {
*score = 1.0; *score = 1.0;
return 1; return 1;
@ -2093,7 +2093,7 @@ int zuiFind(zsetopsrc *op, zsetopval *val, double *score) {
return 0; return 0;
} }
} else if (op->encoding == OBJ_ENCODING_HT) { } else if (op->encoding == OBJ_ENCODING_HT) {
dict *ht = op->subject->ptr; dict *ht = op->subject->m_ptr;
zuiSdsFromValue(val); zuiSdsFromValue(val);
if (dictFind(ht,val->ele) != NULL) { if (dictFind(ht,val->ele) != NULL) {
*score = 1.0; *score = 1.0;
@ -2108,14 +2108,14 @@ int zuiFind(zsetopsrc *op, zsetopval *val, double *score) {
zuiSdsFromValue(val); zuiSdsFromValue(val);
if (op->encoding == OBJ_ENCODING_ZIPLIST) { if (op->encoding == OBJ_ENCODING_ZIPLIST) {
if (zzlFind(op->subject->ptr,val->ele,score) != NULL) { if (zzlFind(op->subject->m_ptr,val->ele,score) != NULL) {
/* Score is already set by zzlFind. */ /* Score is already set by zzlFind. */
return 1; return 1;
} else { } else {
return 0; return 0;
} }
} else if (op->encoding == OBJ_ENCODING_SKIPLIST) { } else if (op->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = op->subject->ptr; zset *zs = op->subject->m_ptr;
dictEntry *de; dictEntry *de;
if ((de = dictFind(zs->pdict,val->ele)) != NULL) { if ((de = dictFind(zs->pdict,val->ele)) != NULL) {
*score = *(double*)dictGetVal(de); *score = *(double*)dictGetVal(de);
@ -2230,7 +2230,7 @@ void zunionInterGenericCommand(client *c, robj *dstkey, int op) {
while (remaining) { while (remaining) {
if (remaining >= (setnum + 1) && if (remaining >= (setnum + 1) &&
!strcasecmp(c->argv[j]->ptr,"weights")) !strcasecmp(ptrFromObj(c->argv[j]),"weights"))
{ {
j++; remaining--; j++; remaining--;
for (i = 0; i < setnum; i++, j++, remaining--) { for (i = 0; i < setnum; i++, j++, remaining--) {
@ -2242,14 +2242,14 @@ void zunionInterGenericCommand(client *c, robj *dstkey, int op) {
} }
} }
} else if (remaining >= 2 && } else if (remaining >= 2 &&
!strcasecmp(c->argv[j]->ptr,"aggregate")) !strcasecmp(ptrFromObj(c->argv[j]),"aggregate"))
{ {
j++; remaining--; j++; remaining--;
if (!strcasecmp(c->argv[j]->ptr,"sum")) { if (!strcasecmp(ptrFromObj(c->argv[j]),"sum")) {
aggregate = REDIS_AGGR_SUM; aggregate = REDIS_AGGR_SUM;
} else if (!strcasecmp(c->argv[j]->ptr,"min")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"min")) {
aggregate = REDIS_AGGR_MIN; aggregate = REDIS_AGGR_MIN;
} else if (!strcasecmp(c->argv[j]->ptr,"max")) { } else if (!strcasecmp(ptrFromObj(c->argv[j]),"max")) {
aggregate = REDIS_AGGR_MAX; aggregate = REDIS_AGGR_MAX;
} else { } else {
zfree(src); zfree(src);
@ -2270,7 +2270,7 @@ void zunionInterGenericCommand(client *c, robj *dstkey, int op) {
qsort(src,setnum,sizeof(zsetopsrc),zuiCompareByCardinality); qsort(src,setnum,sizeof(zsetopsrc),zuiCompareByCardinality);
dstobj = createZsetObject(); dstobj = createZsetObject();
dstzset = dstobj->ptr; dstzset = ptrFromObj(dstobj);
memset(&zval, 0, sizeof(zval)); memset(&zval, 0, sizeof(zval));
if (op == SET_OP_INTER) { if (op == SET_OP_INTER) {
@ -2420,7 +2420,7 @@ void zrangeGenericCommand(client *c, int reverse) {
if ((getLongFromObjectOrReply(c, c->argv[2], &start, NULL) != C_OK) || if ((getLongFromObjectOrReply(c, c->argv[2], &start, NULL) != C_OK) ||
(getLongFromObjectOrReply(c, c->argv[3], &end, NULL) != C_OK)) return; (getLongFromObjectOrReply(c, c->argv[3], &end, NULL) != C_OK)) return;
if (c->argc == 5 && !strcasecmp(c->argv[4]->ptr,"withscores")) { if (c->argc == 5 && !strcasecmp(ptrFromObj(c->argv[4]),"withscores")) {
withscores = 1; withscores = 1;
} else if (c->argc >= 5) { } else if (c->argc >= 5) {
addReply(c,shared.syntaxerr); addReply(c,shared.syntaxerr);
@ -2454,7 +2454,7 @@ void zrangeGenericCommand(client *c, int reverse) {
addReplyArrayLen(c, rangelen); addReplyArrayLen(c, rangelen);
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr; unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
unsigned char *vstr; unsigned char *vstr;
unsigned int vlen; unsigned int vlen;
@ -2486,7 +2486,7 @@ void zrangeGenericCommand(client *c, int reverse) {
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
zskiplistNode *ln; zskiplistNode *ln;
sds ele; sds ele;
@ -2555,10 +2555,10 @@ void genericZrangebyscoreCommand(client *c, int reverse) {
int pos = 4; int pos = 4;
while (remaining) { while (remaining) {
if (remaining >= 1 && !strcasecmp(c->argv[pos]->ptr,"withscores")) { if (remaining >= 1 && !strcasecmp(ptrFromObj(c->argv[pos]),"withscores")) {
pos++; remaining--; pos++; remaining--;
withscores = 1; withscores = 1;
} else if (remaining >= 3 && !strcasecmp(c->argv[pos]->ptr,"limit")) { } else if (remaining >= 3 && !strcasecmp(ptrFromObj(c->argv[pos]),"limit")) {
if ((getLongFromObjectOrReply(c, c->argv[pos+1], &offset, NULL) if ((getLongFromObjectOrReply(c, c->argv[pos+1], &offset, NULL)
!= C_OK) || != C_OK) ||
(getLongFromObjectOrReply(c, c->argv[pos+2], &limit, NULL) (getLongFromObjectOrReply(c, c->argv[pos+2], &limit, NULL)
@ -2579,7 +2579,7 @@ void genericZrangebyscoreCommand(client *c, int reverse) {
checkType(c,zobj,OBJ_ZSET)) return; checkType(c,zobj,OBJ_ZSET)) return;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr; unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
unsigned char *vstr; unsigned char *vstr;
unsigned int vlen; unsigned int vlen;
@ -2649,7 +2649,7 @@ void genericZrangebyscoreCommand(client *c, int reverse) {
} }
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
zskiplistNode *ln; zskiplistNode *ln;
@ -2734,7 +2734,7 @@ void zcountCommand(client *c) {
checkType(c, zobj, OBJ_ZSET)) return; checkType(c, zobj, OBJ_ZSET)) return;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr; unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
double score; double score;
@ -2765,7 +2765,7 @@ void zcountCommand(client *c) {
} }
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
zskiplistNode *zn; zskiplistNode *zn;
unsigned long rank; unsigned long rank;
@ -2815,7 +2815,7 @@ void zlexcountCommand(client *c) {
} }
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr; unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
/* Use the first element in range as the starting point */ /* Use the first element in range as the starting point */
@ -2843,7 +2843,7 @@ void zlexcountCommand(client *c) {
} }
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
zskiplistNode *zn; zskiplistNode *zn;
unsigned long rank; unsigned long rank;
@ -2904,7 +2904,7 @@ void genericZrangebylexCommand(client *c, int reverse) {
int pos = 4; int pos = 4;
while (remaining) { while (remaining) {
if (remaining >= 3 && !strcasecmp(c->argv[pos]->ptr,"limit")) { if (remaining >= 3 && !strcasecmp(ptrFromObj(c->argv[pos]),"limit")) {
if ((getLongFromObjectOrReply(c, c->argv[pos+1], &offset, NULL) != C_OK) || if ((getLongFromObjectOrReply(c, c->argv[pos+1], &offset, NULL) != C_OK) ||
(getLongFromObjectOrReply(c, c->argv[pos+2], &limit, NULL) != C_OK)) return; (getLongFromObjectOrReply(c, c->argv[pos+2], &limit, NULL) != C_OK)) return;
pos += 3; remaining -= 3; pos += 3; remaining -= 3;
@ -2925,7 +2925,7 @@ void genericZrangebylexCommand(client *c, int reverse) {
} }
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr; unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
unsigned char *vstr; unsigned char *vstr;
unsigned int vlen; unsigned int vlen;
@ -2991,7 +2991,7 @@ void genericZrangebylexCommand(client *c, int reverse) {
} }
} }
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
zskiplistNode *ln; zskiplistNode *ln;
@ -3076,7 +3076,7 @@ void zscoreCommand(client *c) {
if ((zobj = lookupKeyReadOrReply(c,key,shared.null[c->resp])) == NULL || if ((zobj = lookupKeyReadOrReply(c,key,shared.null[c->resp])) == NULL ||
checkType(c,zobj,OBJ_ZSET)) return; checkType(c,zobj,OBJ_ZSET)) return;
if (zsetScore(zobj,c->argv[2]->ptr,&score) == C_ERR) { if (zsetScore(zobj,ptrFromObj(c->argv[2]),&score) == C_ERR) {
addReplyNull(c); addReplyNull(c);
} else { } else {
addReplyDouble(c,score); addReplyDouble(c,score);
@ -3093,7 +3093,7 @@ void zrankGenericCommand(client *c, int reverse) {
checkType(c,zobj,OBJ_ZSET)) return; checkType(c,zobj,OBJ_ZSET)) return;
serverAssertWithInfo(c,ele,sdsEncodedObject(ele)); serverAssertWithInfo(c,ele,sdsEncodedObject(ele));
rank = zsetRank(zobj,ele->ptr,reverse); rank = zsetRank(zobj,ptrFromObj(ele),reverse);
if (rank >= 0) { if (rank >= 0) {
addReplyLongLong(c,rank); addReplyLongLong(c,rank);
} else { } else {
@ -3168,7 +3168,7 @@ void genericZpopCommand(client *c, robj **keyv, int keyc, int where, int emitkey
/* Remove the element. */ /* Remove the element. */
do { do {
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) { if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr; unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr; unsigned char *eptr, *sptr;
unsigned char *vstr; unsigned char *vstr;
unsigned int vlen; unsigned int vlen;
@ -3188,7 +3188,7 @@ void genericZpopCommand(client *c, robj **keyv, int keyc, int where, int emitkey
serverAssertWithInfo(c,zobj,sptr != NULL); serverAssertWithInfo(c,zobj,sptr != NULL);
score = zzlGetScore(sptr); score = zzlGetScore(sptr);
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) { } else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr; zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl; zskiplist *zsl = zs->zsl;
zskiplistNode *zln; zskiplistNode *zln;