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:
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. */
}

View File

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

View File

@ -506,11 +506,11 @@ sds catAppendOnlyGenericCommand(sds dst, int argc, robj **argv) {
for (j = 0; j < argc; j++) {
o = getDecodedObject(argv[j]);
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++] = '\n';
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);
decrRefCount(o);
}
@ -530,7 +530,7 @@ sds catAppendOnlyExpireAtCommand(sds buf, struct redisCommand *cmd, robj *key, r
/* Make sure we can use strtoll */
seconds = getDecodedObject(seconds);
when = strtoll(seconds->ptr,NULL,10);
when = strtoll(ptrFromObj(seconds),NULL,10);
/* Convert argument into milliseconds for EXPIRE, SETEX, EXPIREAT */
if (cmd->proc == expireCommand || cmd->proc == setexCommand ||
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 */
buf = catAppendOnlyGenericCommand(buf,3,argv);
for (i = 3; i < argc; i ++) {
if (!strcasecmp(argv[i]->ptr, "ex")) exarg = argv[i+1];
if (!strcasecmp(argv[i]->ptr, "px")) pxarg = argv[i+1];
if (!strcasecmp(ptrFromObj(argv[i]), "ex")) exarg = argv[i+1];
if (!strcasecmp(ptrFromObj(argv[i]), "px")) pxarg = argv[i+1];
}
serverAssert(!(exarg && pxarg));
if (exarg)
@ -780,11 +780,11 @@ int loadAppendOnlyFile(char *filename) {
}
/* Command lookup */
cmd = lookupCommand(argv[0]->ptr);
cmd = lookupCommand(ptrFromObj(argv[0]));
if (!cmd) {
serverLog(LL_WARNING,
"Unknown command '%s' reading the append only file",
(char*)argv[0]->ptr);
(char*)ptrFromObj(argv[0]));
exit(1);
}
@ -886,9 +886,9 @@ int rioWriteBulkObject(rio *r, robj *obj) {
/* Avoid using getDecodedObject to help copy-on-write (we are often
* in a child process when this function is called). */
if (obj->encoding == OBJ_ENCODING_INT) {
return rioWriteBulkLongLong(r,(long)obj->ptr);
return rioWriteBulkLongLong(r,(long)obj->m_ptr);
} else if (sdsEncodedObject(obj)) {
return rioWriteBulkString(r,obj->ptr,sdslen(obj->ptr));
return rioWriteBulkString(r,ptrFromObj(obj),sdslen(ptrFromObj(obj)));
} else {
serverPanic("Unknown string encoding");
}
@ -900,7 +900,7 @@ int rewriteListObject(rio *r, robj *key, robj *o) {
long long count = 0, items = listTypeLength(o);
if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklist *list = o->ptr;
quicklist *list = ptrFromObj(o);
quicklistIter *li = quicklistGetIterator(list, AL_START_HEAD);
quicklistEntry entry;
@ -937,7 +937,7 @@ int rewriteSetObject(rio *r, robj *key, robj *o) {
int ii = 0;
int64_t llval;
while(intsetGet(o->ptr,ii++,&llval)) {
while(intsetGet(ptrFromObj(o),ii++,&llval)) {
if (count == 0) {
int cmd_items = (items > AOF_REWRITE_ITEMS_PER_CMD) ?
AOF_REWRITE_ITEMS_PER_CMD : items;
@ -951,7 +951,7 @@ int rewriteSetObject(rio *r, robj *key, robj *o) {
items--;
}
} else if (o->encoding == OBJ_ENCODING_HT) {
dictIterator *di = dictGetIterator(o->ptr);
dictIterator *di = dictGetIterator(ptrFromObj(o));
dictEntry *de;
while((de = dictNext(di)) != NULL) {
@ -981,7 +981,7 @@ int rewriteSortedSetObject(rio *r, robj *key, robj *o) {
long long count = 0, items = zsetLength(o);
if (o->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = o->ptr;
unsigned char *zl = ptrFromObj(o);
unsigned char *eptr, *sptr;
unsigned char *vstr;
unsigned int vlen;
@ -1016,7 +1016,7 @@ int rewriteSortedSetObject(rio *r, robj *key, robj *o) {
items--;
}
} else if (o->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = o->ptr;
zset *zs = ptrFromObj(o);
dictIterator *di = dictGetIterator(zs->pdict);
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.
* The function returns 0 on error, 1 on success. */
int rewriteStreamObject(rio *r, robj *key, robj *o) {
stream *s = o->ptr;
stream *s = ptrFromObj(o);
streamIterator si;
streamIteratorStart(&si,s,NULL,NULL,0);
streamID id;
@ -1237,7 +1237,7 @@ int rewriteStreamObject(rio *r, robj *key, robj *o) {
* The function returns 0 on error, 1 on success. */
int rewriteModuleObject(rio *r, robj *key, robj *o) {
RedisModuleIO io;
moduleValue *mv = o->ptr;
moduleValue *mv = ptrFromObj(o);
moduleType *mt = mv->type;
moduleInitIOContext(io,mt,r);
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) {
long long loffset;
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);
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. */
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.";
long long llbits;
@ -485,7 +485,7 @@ robj *lookupStringForBitCommand(client *c, size_t maxbit) {
} else {
if (checkType(c,o,OBJ_STRING)) return NULL;
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;
}
@ -511,10 +511,10 @@ unsigned char *getObjectReadOnlyString(robj *o, long *len, char *llbuf) {
* array if our string was integer encoded. */
if (o && o->encoding == OBJ_ENCODING_INT) {
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) {
p = (unsigned char*) o->ptr;
if (len) *len = sdslen(o->ptr);
p = (unsigned char*) ptrFromObj(o);
if (len) *len = sdslen(ptrFromObj(o));
} else {
if (len) *len = 0;
}
@ -546,14 +546,14 @@ void setbitCommand(client *c) {
/* Get current values */
byte = bitoffset >> 3;
byteval = ((uint8_t*)o->ptr)[byte];
byteval = ((uint8_t*)ptrFromObj(o))[byte];
bit = 7 - (bitoffset & 0x7);
bitval = byteval & (1 << bit);
/* Update byte with new bit value and return original value */
byteval &= ~(1 << bit);
byteval |= ((on & 0x1) << bit);
((uint8_t*)o->ptr)[byte] = byteval;
((uint8_t*)ptrFromObj(o))[byte] = byteval;
signalModifiedKey(c->db,c->argv[1]);
notifyKeyspaceEvent(NOTIFY_STRING,"setbit",c->argv[1],c->db->id);
server.dirty++;
@ -577,10 +577,10 @@ void getbitCommand(client *c) {
byte = bitoffset >> 3;
bit = 7 - (bitoffset & 0x7);
if (sdsEncodedObject(o)) {
if (byte < sdslen(o->ptr))
bitval = ((uint8_t*)o->ptr)[byte] & (1 << bit);
if (byte < sdslen(ptrFromObj(o)))
bitval = ((uint8_t*)ptrFromObj(o))[byte] & (1 << bit);
} 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);
}
@ -589,7 +589,7 @@ void getbitCommand(client *c) {
/* BITOP op_name target_key src_key1 src_key2 src_key3 ... src_keyN */
void bitopCommand(client *c) {
char *opname = c->argv[1]->ptr;
char *opname = ptrFromObj(c->argv[1]);
robj *o, *targetkey = c->argv[2];
unsigned long op, j, numkeys;
robj **objects; /* Array of source objects. */
@ -647,8 +647,8 @@ void bitopCommand(client *c) {
return;
}
objects[j] = getDecodedObject(o);
src[j] = objects[j]->ptr;
len[j] = sdslen(objects[j]->ptr);
src[j] = ptrFromObj(objects[j]);
len[j] = sdslen(ptrFromObj(objects[j]));
if (len[j] > maxlen) maxlen = 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++) {
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. */
long long i64 = 0; /* Signed SET value. */
int sign = 0; /* Signed or unsigned type? */
@ -935,7 +935,7 @@ void bitfieldCommand(client *c) {
else if (!strcasecmp(subcmd,"incrby") && remargs >= 3)
opcode = BITFIELDOP_INCRBY;
else if (!strcasecmp(subcmd,"overflow") && remargs >= 1) {
char *owtypename = c->argv[j+1]->ptr;
char *owtypename = ptrFromObj(c->argv[j+1]);
j++;
if (!strcasecmp(owtypename,"wrap"))
owtype = BFOVERFLOW_WRAP;
@ -1023,7 +1023,7 @@ void bitfieldCommand(client *c) {
int64_t oldval, newval, wrapped, retval;
int overflow;
oldval = getSignedBitfield(o->ptr,thisop->offset,
oldval = getSignedBitfield(ptrFromObj(o),thisop->offset,
thisop->bits);
if (thisop->opcode == BITFIELDOP_INCRBY) {
@ -1044,7 +1044,7 @@ void bitfieldCommand(client *c) {
* NULL to signal the condition. */
if (!(overflow && thisop->owtype == BFOVERFLOW_FAIL)) {
addReplyLongLong(c,retval);
setSignedBitfield(o->ptr,thisop->offset,
setSignedBitfield(ptrFromObj(o),thisop->offset,
thisop->bits,newval);
} else {
addReplyNull(c);
@ -1053,7 +1053,7 @@ void bitfieldCommand(client *c) {
uint64_t oldval, newval, wrapped, retval;
int overflow;
oldval = getUnsignedBitfield(o->ptr,thisop->offset,
oldval = getUnsignedBitfield(ptrFromObj(o),thisop->offset,
thisop->bits);
if (thisop->opcode == BITFIELDOP_INCRBY) {
@ -1073,7 +1073,7 @@ void bitfieldCommand(client *c) {
* NULL to signal the condition. */
if (!(overflow && thisop->owtype == BFOVERFLOW_FAIL)) {
addReplyLongLong(c,retval);
setUnsignedBitfield(o->ptr,thisop->offset,
setUnsignedBitfield(ptrFromObj(o),thisop->offset,
thisop->bits,newval);
} else {
addReplyNull(c);

View File

@ -374,7 +374,7 @@ void handleClientsBlockedOnKeys(void) {
/* Serve clients blocked on stream key. */
else if (o != NULL && o->type == OBJ_STREAM) {
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
* to all the clients that are waiting for an offset smaller
@ -403,7 +403,7 @@ void handleClientsBlockedOnKeys(void) {
streamCG *group = NULL;
if (receiver->bpop.xread_group) {
group = streamLookupCG(s,
receiver->bpop.xread_group->ptr);
ptrFromObj(receiver->bpop.xread_group));
/* If the group was not found, send an error
* to the consumer. */
if (!group) {
@ -427,7 +427,7 @@ void handleClientsBlockedOnKeys(void) {
if (group) {
consumer = streamLookupConsumer(group,
receiver->bpop.xread_consumer->ptr,
ptrFromObj(receiver->bpop.xread_consumer),
1);
noack = receiver->bpop.xread_group_noack;
}

View File

@ -2523,8 +2523,8 @@ void clusterSendPublish(clusterLink *link, robj *channel, robj *message) {
channel = getDecodedObject(channel);
message = getDecodedObject(message);
channel_len = sdslen(channel->ptr);
message_len = sdslen(message->ptr);
channel_len = sdslen(ptrFromObj(channel));
message_len = sdslen(ptrFromObj(message));
clusterBuildMessageHdr(hdr,CLUSTERMSG_TYPE_PUBLISH);
totlen = sizeof(clusterMsg)-sizeof(union clusterMsgData);
@ -2542,9 +2542,9 @@ void clusterSendPublish(clusterLink *link, robj *channel, robj *message) {
memcpy(payload,hdr,sizeof(*hdr));
hdr = (clusterMsg*) payload;
}
memcpy(hdr->data.publish.msg.bulk_data,channel->ptr,sdslen(channel->ptr));
memcpy(hdr->data.publish.msg.bulk_data+sdslen(channel->ptr),
message->ptr,sdslen(message->ptr));
memcpy(hdr->data.publish.msg.bulk_data,ptrFromObj(channel),sdslen(ptrFromObj(channel)));
memcpy(hdr->data.publish.msg.bulk_data+sdslen(ptrFromObj(channel)),
ptrFromObj(message),sdslen(ptrFromObj(message)));
if (link)
clusterSendMessage(link,payload,totlen);
@ -4193,7 +4193,7 @@ void clusterCommand(client *c) {
return;
}
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) {
if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = {
"ADDSLOTS <slot> [slot ...] -- Assign slots to current node.",
"BUMPEPOCH -- Advance the cluster config epoch.",
@ -4220,35 +4220,35 @@ void clusterCommand(client *c) {
NULL
};
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] */
long long port, cport;
if (getLongLongFromObject(c->argv[3], &port) != C_OK) {
addReplyErrorFormat(c,"Invalid TCP base port specified: %s",
(char*)c->argv[3]->ptr);
(char*)ptrFromObj(c->argv[3]));
return;
}
if (c->argc == 5) {
if (getLongLongFromObject(c->argv[4], &cport) != C_OK) {
addReplyErrorFormat(c,"Invalid TCP bus port specified: %s",
(char*)c->argv[4]->ptr);
(char*)ptrFromObj(c->argv[4]));
return;
}
} else {
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)
{
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 {
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 */
robj *o;
sds ci = clusterGenNodesDescription(0);
@ -4256,13 +4256,13 @@ NULL
o = createObject(OBJ_STRING,ci);
addReplyBulk(c,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 */
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 */
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 */
if (dictSize(server.db[0].pdict) != 0) {
addReplyError(c,"DB must be empty to perform CLUSTER FLUSHSLOTS.");
@ -4271,14 +4271,14 @@ NULL
clusterDelNodeSlots(myself);
clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|CLUSTER_TODO_SAVE_CONFIG);
addReply(c,shared.ok);
} else if ((!strcasecmp(c->argv[1]->ptr,"addslots") ||
!strcasecmp(c->argv[1]->ptr,"delslots")) && c->argc >= 3)
} else if ((!strcasecmp(ptrFromObj(c->argv[1]),"addslots") ||
!strcasecmp(ptrFromObj(c->argv[1]),"delslots")) && c->argc >= 3)
{
/* CLUSTER ADDSLOTS <slot> [slot] ... */
/* CLUSTER DELSLOTS <slot> [slot] ... */
int j, slot;
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);
/* Check that all the arguments are parseable and that all the
@ -4321,7 +4321,7 @@ NULL
zfree(slots);
clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|CLUSTER_TODO_SAVE_CONFIG);
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 IMPORTING <node ID> */
/* SETSLOT 10 STABLE */
@ -4336,40 +4336,40 @@ NULL
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) {
addReplyErrorFormat(c,"I'm not the owner of hash slot %u",slot);
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",
(char*)c->argv[4]->ptr);
(char*)ptrFromObj(c->argv[4]));
return;
}
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) {
addReplyErrorFormat(c,
"I'm already the owner of hash slot %u",slot);
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",
(char*)c->argv[4]->ptr);
(char*)ptrFromObj(c->argv[4]));
return;
}
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 */
server.cluster->importing_slots_from[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> */
clusterNode *n = clusterLookupNode(c->argv[4]->ptr);
clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[4]));
if (!n) {
addReplyErrorFormat(c,"Unknown node %s",
(char*)c->argv[4]->ptr);
(char*)ptrFromObj(c->argv[4]));
return;
}
/* 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);
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 */
int retval = clusterBumpConfigEpochWithoutConsensus();
sds reply = sdscatprintf(sdsempty(),"+%s %llu\r\n",
(retval == C_OK) ? "BUMPED" : "STILL",
(unsigned long long) myself->configEpoch);
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 */
char *statestr[] = {"ok","fail","needhelp"};
int slots_assigned = 0, slots_ok = 0, slots_pfail = 0, slots_fail = 0;
@ -4501,7 +4501,7 @@ NULL
(unsigned long)sdslen(info)));
addReplySds(c,info);
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);
if (retval == 0)
@ -4509,12 +4509,12 @@ NULL
else
addReplyErrorFormat(c,"error saving the cluster node config: %s",
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> */
sds key = c->argv[2]->ptr;
sds key = ptrFromObj(c->argv[2]);
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> */
long long slot;
@ -4525,7 +4525,7 @@ NULL
return;
}
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> */
long long maxkeys, slot;
unsigned int numkeys, j;
@ -4554,12 +4554,12 @@ NULL
decrRefCount(keys[j]);
}
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> */
clusterNode *n = clusterLookupNode(c->argv[2]->ptr);
clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[2]));
if (!n) {
addReplyErrorFormat(c,"Unknown node %s", (char*)c->argv[2]->ptr);
addReplyErrorFormat(c,"Unknown node %s", (char*)ptrFromObj(c->argv[2]));
return;
} else if (n == myself) {
addReplyError(c,"I tried hard but I can't forget myself...");
@ -4573,13 +4573,13 @@ NULL
clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|
CLUSTER_TODO_SAVE_CONFIG);
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> */
clusterNode *n = clusterLookupNode(c->argv[2]->ptr);
clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[2]));
/* Lookup the specified node in our table. */
if (!n) {
addReplyErrorFormat(c,"Unknown node %s", (char*)c->argv[2]->ptr);
addReplyErrorFormat(c,"Unknown node %s", (char*)ptrFromObj(c->argv[2]));
return;
}
@ -4610,15 +4610,15 @@ NULL
clusterSetMaster(n);
clusterDoBeforeSleep(CLUSTER_TODO_UPDATE_STATE|CLUSTER_TODO_SAVE_CONFIG);
addReply(c,shared.ok);
} else if ((!strcasecmp(c->argv[1]->ptr,"slaves") ||
!strcasecmp(c->argv[1]->ptr,"replicas")) && c->argc == 3) {
} else if ((!strcasecmp(ptrFromObj(c->argv[1]),"slaves") ||
!strcasecmp(ptrFromObj(c->argv[1]),"replicas")) && c->argc == 3) {
/* CLUSTER SLAVES <NODE ID> */
clusterNode *n = clusterLookupNode(c->argv[2]->ptr);
clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[2]));
int j;
/* Lookup the specified node in our table. */
if (!n) {
addReplyErrorFormat(c,"Unknown node %s", (char*)c->argv[2]->ptr);
addReplyErrorFormat(c,"Unknown node %s", (char*)ptrFromObj(c->argv[2]));
return;
}
@ -4633,28 +4633,28 @@ NULL
addReplyBulkCString(c,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)
{
/* CLUSTER COUNT-FAILURE-REPORTS <NODE ID> */
clusterNode *n = clusterLookupNode(c->argv[2]->ptr);
clusterNode *n = clusterLookupNode(ptrFromObj(c->argv[2]));
if (!n) {
addReplyErrorFormat(c,"Unknown node %s", (char*)c->argv[2]->ptr);
addReplyErrorFormat(c,"Unknown node %s", (char*)ptrFromObj(c->argv[2]));
return;
} else {
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))
{
/* CLUSTER FAILOVER [FORCE|TAKEOVER] */
int force = 0, takeover = 0;
if (c->argc == 3) {
if (!strcasecmp(c->argv[2]->ptr,"force")) {
if (!strcasecmp(ptrFromObj(c->argv[2]),"force")) {
force = 1;
} else if (!strcasecmp(c->argv[2]->ptr,"takeover")) {
} else if (!strcasecmp(ptrFromObj(c->argv[2]),"takeover")) {
takeover = 1;
force = 1; /* Takeover also implies force. */
} else {
@ -4700,7 +4700,7 @@ NULL
clusterSendMFStart(myself->slaveof);
}
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>
*
@ -4736,7 +4736,7 @@ NULL
CLUSTER_TODO_SAVE_CONFIG);
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))
{
/* CLUSTER RESET [SOFT|HARD] */
@ -4744,9 +4744,9 @@ NULL
/* Parse soft/hard argument. Default is soft. */
if (c->argc == 3) {
if (!strcasecmp(c->argv[2]->ptr,"hard")) {
if (!strcasecmp(ptrFromObj(c->argv[2]),"hard")) {
hard = 1;
} else if (!strcasecmp(c->argv[2]->ptr,"soft")) {
} else if (!strcasecmp(ptrFromObj(c->argv[2]),"soft")) {
hard = 0;
} else {
addReply(c,shared.syntaxerr);
@ -4860,11 +4860,11 @@ void restoreCommand(client *c) {
/* Parse additional options */
for (j = 4; j < c->argc; j++) {
int additional = c->argc-j-1;
if (!strcasecmp(c->argv[j]->ptr,"replace")) {
if (!strcasecmp(ptrFromObj(c->argv[j]),"replace")) {
replace = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"absttl")) {
} else if (!strcasecmp(ptrFromObj(c->argv[j]),"absttl")) {
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)
{
if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lru_idle,NULL)
@ -4875,7 +4875,7 @@ void restoreCommand(client *c) {
}
lru_clock = LRU_CLOCK();
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)
{
if (getLongLongFromObjectOrReply(c,c->argv[j+1],&lfu_freq,NULL)
@ -4906,13 +4906,13 @@ void restoreCommand(client *c) {
}
/* 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");
return;
}
rioInitWithBuffer(&payload,c->argv[3]->ptr);
rioInitWithBuffer(&payload,ptrFromObj(c->argv[3]));
if (((type = rdbLoadObjectType(&payload)) == -1) ||
((obj = rdbLoadObject(type,&payload)) == NULL))
{
@ -4967,9 +4967,9 @@ migrateCachedSocket* migrateGetSocket(client *c, robj *host, robj *port, long ti
migrateCachedSocket *cs;
/* 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,port->ptr,sdslen(port->ptr));
name = sdscatlen(name,ptrFromObj(port),sdslen(ptrFromObj(port)));
cs = dictFetchValue(server.migrate_cached_sockets,name);
if (cs) {
sdsfree(name);
@ -4988,8 +4988,8 @@ migrateCachedSocket* migrateGetSocket(client *c, robj *host, robj *port, long ti
}
/* Create the socket */
fd = anetTcpNonBlockConnect(server.neterr,c->argv[1]->ptr,
atoi(c->argv[2]->ptr));
fd = anetTcpNonBlockConnect(server.neterr,ptrFromObj(c->argv[1]),
atoi(ptrFromObj(c->argv[2])));
if (fd == -1) {
sdsfree(name);
addReplyErrorFormat(c,"Can't connect to target node: %s",
@ -5021,9 +5021,9 @@ void migrateCloseSocket(robj *host, robj *port) {
sds name = sdsempty();
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,port->ptr,sdslen(port->ptr));
name = sdscatlen(name,ptrFromObj(port),sdslen(ptrFromObj(port)));
cs = dictFetchValue(server.migrate_cached_sockets,name);
if (!cs) {
sdsfree(name);
@ -5079,19 +5079,19 @@ void migrateCommand(client *c) {
/* Parse additional options */
for (j = 6; j < c->argc; j++) {
int moreargs = j < c->argc-1;
if (!strcasecmp(c->argv[j]->ptr,"copy")) {
if (!strcasecmp(ptrFromObj(c->argv[j]),"copy")) {
copy = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"replace")) {
} else if (!strcasecmp(ptrFromObj(c->argv[j]),"replace")) {
replace = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"auth")) {
} else if (!strcasecmp(ptrFromObj(c->argv[j]),"auth")) {
if (!moreargs) {
addReply(c,shared.syntaxerr);
return;
}
j++;
password = c->argv[j]->ptr;
} else if (!strcasecmp(c->argv[j]->ptr,"keys")) {
if (sdslen(c->argv[3]->ptr) != 0) {
password = ptrFromObj(c->argv[j]);
} else if (!strcasecmp(ptrFromObj(c->argv[j]),"keys")) {
if (sdslen(ptrFromObj(c->argv[3])) != 0) {
addReplyError(c,
"When using MIGRATE KEYS option, the key argument"
" must be set to the empty string");
@ -5196,8 +5196,8 @@ try_again:
else
serverAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,"RESTORE",7));
serverAssertWithInfo(c,NULL,sdsEncodedObject(kv[j]));
serverAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,kv[j]->ptr,
sdslen(kv[j]->ptr)));
serverAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,ptrFromObj(kv[j]),
sdslen(ptrFromObj(kv[j]))));
serverAssertWithInfo(c,NULL,rioWriteBulkLongLong(&cmd,ttl));
/* 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);
for (j = 0; j < numkeys; j++) {
robj *thiskey = margv[keyindex[j]];
int thisslot = keyHashSlot((char*)thiskey->ptr,
sdslen(thiskey->ptr));
int thisslot = keyHashSlot((char*)ptrFromObj(thiskey),
sdslen(ptrFromObj(thiskey)));
if (firstkey == NULL) {
/* 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);
if ((de = dictNext(di)) != NULL) {
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];
/* 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) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) { \
int yn = yesnotoi(o->ptr); \
} else if (!strcasecmp(ptrFromObj(c->argv[2]),_name)) { \
int yn = yesnotoi(ptrFromObj(o)); \
if (yn == -1) goto badfmt; \
_var = yn;
#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 (min != LLONG_MIN && ll < min) goto badfmt; \
if (max != LLONG_MAX && ll > max) goto badfmt; \
_var = ll;
#define config_set_memory_field(_name,_var) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) { \
ll = memtoll(o->ptr,&err); \
} else if (!strcasecmp(ptrFromObj(c->argv[2]),_name)) { \
ll = memtoll(ptrFromObj(o),&err); \
if (err || ll < 0) goto badfmt; \
_var = ll;
#define config_set_enum_field(_name,_var,_enumvar) \
} else if (!strcasecmp(c->argv[2]->ptr,_name)) { \
int enumval = configEnumGetValue(_enumvar,o->ptr); \
} else if (!strcasecmp(ptrFromObj(c->argv[2]),_name)) { \
int enumval = configEnumGetValue(_enumvar,ptrFromObj(o)); \
if (enumval == INT_MIN) goto badfmt; \
_var = enumval;
#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) \
} else if (!strcasecmp(c->argv[2]->ptr,_name1) || \
!strcasecmp(c->argv[2]->ptr,_name2)) {
} else if (!strcasecmp(ptrFromObj(c->argv[2]),_name1) || \
!strcasecmp(ptrFromObj(c->argv[2]),_name2)) {
#define config_set_else } else
@ -934,26 +934,26 @@ void configSetCommand(client *c) {
/* Special fields that can't be handled with general macros. */
config_set_special_field("dbfilename") {
if (!pathIsBaseName(o->ptr)) {
if (!pathIsBaseName(ptrFromObj(o))) {
addReplyError(c, "dbfilename can't be a path, just a filename");
return;
}
zfree(server.rdb_filename);
server.rdb_filename = zstrdup(o->ptr);
server.rdb_filename = zstrdup(ptrFromObj(o));
} 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
* a password to the default user. */
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));
sdsfree(aclop);
} config_set_special_field("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") {
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") {
int orig_value = server.maxclients;
@ -981,7 +981,7 @@ void configSetCommand(client *c) {
}
}
} config_set_special_field("appendonly") {
int enable = yesnotoi(o->ptr);
int enable = yesnotoi(ptrFromObj(o));
if (enable == -1) goto badfmt;
if (enable == 0 && server.aof_state != AOF_OFF) {
@ -995,7 +995,7 @@ void configSetCommand(client *c) {
}
} config_set_special_field("save") {
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:
* - Even number of args
@ -1028,13 +1028,13 @@ void configSetCommand(client *c) {
}
sdsfreesplitres(v,vlen);
} config_set_special_field("dir") {
if (chdir((char*)o->ptr) == -1) {
if (chdir((char*)ptrFromObj(o)) == -1) {
addReplyErrorFormat(c,"Changing directory: %s", strerror(errno));
return;
}
} config_set_special_field("client-output-buffer-limit") {
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> */
if (vlen % 4) {
@ -1079,7 +1079,7 @@ void configSetCommand(client *c) {
}
sdsfreesplitres(v,vlen);
} config_set_special_field("notify-keyspace-events") {
int flags = keyspaceEventsStringToFlags(o->ptr);
int flags = keyspaceEventsStringToFlags(ptrFromObj(o));
if (flags == -1) goto badfmt;
server.notify_keyspace_events = flags;
@ -1087,7 +1087,7 @@ void configSetCommand(client *c) {
"replica-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.
* config_set_bool_field(name,var). */
@ -1298,7 +1298,7 @@ void configSetCommand(client *c) {
/* Everyhing else is an error... */
} config_set_else {
addReplyErrorFormat(c,"Unsupported CONFIG parameter: %s",
(char*)c->argv[2]->ptr);
(char*)ptrFromObj(c->argv[2]));
return;
}
@ -1308,8 +1308,8 @@ void configSetCommand(client *c) {
badfmt: /* Bad format errors */
addReplyErrorFormat(c,"Invalid argument '%s' for CONFIG SET '%s'",
(char*)o->ptr,
(char*)c->argv[2]->ptr);
(char*)ptrFromObj(o),
(char*)ptrFromObj(c->argv[2]));
}
/*-----------------------------------------------------------------------------
@ -1352,7 +1352,7 @@ badfmt: /* Bad format errors */
void configGetCommand(client *c) {
robj *o = c->argv[2];
void *replylen = addReplyDeferredLen(c);
char *pattern = o->ptr;
char *pattern = ptrFromObj(o);
char buf[128];
int matches = 0;
serverAssertWithInfo(c,o,sdsEncodedObject(o));
@ -2335,12 +2335,12 @@ int rewriteConfig(char *path) {
void configCommand(client *c) {
/* 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");
return;
}
if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"help")) {
if (c->argc == 2 && !strcasecmp(ptrFromObj(c->argv[1]),"help")) {
const char *help[] = {
"GET <pattern> -- Return parameters matching the glob-like <pattern> and their values.",
"SET <parameter> <value> -- Set parameter to value.",
@ -2349,15 +2349,15 @@ void configCommand(client *c) {
NULL
};
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);
} else if (!strcasecmp(c->argv[1]->ptr,"get") && c->argc == 3) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"get") && c->argc == 3) {
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();
resetCommandTableStats();
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) {
addReplyError(c,"The server is running without a config file");
return;

View File

@ -53,7 +53,7 @@ void updateLFU(robj *val) {
* implementations that should instead rely on lookupKeyRead(),
* lookupKeyWrite() and lookupKeyReadWithFlags(). */
robj *lookupKey(redisDb *db, robj *key, int flags) {
dictEntry *de = dictFind(db->pdict,key->ptr);
dictEntry *de = dictFind(db->pdict,ptrFromObj(key));
if (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. */
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);
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. */
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);
dictEntry auxentry = *de;
@ -225,7 +225,7 @@ void setKey(redisDb *db, robj *key, robj *val) {
}
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.
@ -271,8 +271,8 @@ robj *dbRandomKey(redisDb *db) {
int dbSyncDelete(redisDb *db, robj *key) {
/* Deleting an entry from the expires dict will not free the sds of
* the key, because it is shared with the main dictionary. */
if (dictSize(db->expires) > 0) dictDelete(db->expires,key->ptr);
if (dictDelete(db->pdict,key->ptr) == DICT_OK) {
if (dictSize(db->expires) > 0) dictDelete(db->expires,ptrFromObj(key));
if (dictDelete(db->pdict,ptrFromObj(key)) == DICT_OK) {
if (server.cluster_enabled) slotToKeyDel(key);
return 1;
} else {
@ -318,7 +318,7 @@ robj *dbUnshareStringValue(redisDb *db, robj *key, robj *o) {
serverAssert(o->type == OBJ_STRING);
if (o->refcount != 1 || o->encoding != OBJ_ENCODING_RAW) {
robj *decoded = getDecodedObject(o);
o = createRawStringObject(decoded->ptr, sdslen(decoded->ptr));
o = createRawStringObject(ptrFromObj(decoded), sdslen(ptrFromObj(decoded)));
decrRefCount(decoded);
dbOverwrite(db,key,o);
}
@ -415,7 +415,7 @@ void signalFlushedDb(int dbid) {
int getFlushCommandFlags(client *c, int *flags) {
/* Parse the optional ASYNC option. */
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);
return C_ERR;
}
@ -533,7 +533,7 @@ void randomkeyCommand(client *c) {
void keysCommand(client *c) {
dictIterator *di;
dictEntry *de;
sds pattern = c->argv[1]->ptr;
sds pattern = ptrFromObj(c->argv[1]);
int plen = sdslen(pattern), allkeys;
unsigned long numkeys = 0;
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
* getLongLongFromObject() does not cover the whole cursor space. */
errno = 0;
*cursor = strtoul(o->ptr, &eptr, 10);
if (isspace(((char*)o->ptr)[0]) || eptr[0] != '\0' || errno == ERANGE)
*cursor = strtoul(ptrFromObj(o), &eptr, 10);
if (isspace(((char*)ptrFromObj(o))[0]) || eptr[0] != '\0' || errno == ERANGE)
{
addReplyError(c, "invalid cursor");
return C_ERR;
@ -638,7 +638,7 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
/* Step 1: Parse options. */
while (i < c->argc) {
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)
!= C_OK)
{
@ -651,8 +651,8 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
}
i += 2;
} else if (!strcasecmp(c->argv[i]->ptr, "match") && j >= 2) {
pat = c->argv[i+1]->ptr;
} else if (!strcasecmp(ptrFromObj(c->argv[i]), "match") && j >= 2) {
pat = ptrFromObj(c->argv[i+1]);
patlen = sdslen(pat);
/* 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) {
ht = c->db->pdict;
} 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) {
ht = o->ptr;
ht = ptrFromObj(o);
count *= 2; /* We return key / value for this type. */
} else if (o->type == OBJ_ZSET && o->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = o->ptr;
zset *zs = ptrFromObj(o);
ht = zs->pdict;
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;
int64_t ll;
while(intsetGet(o->ptr,pos++,&ll))
while(intsetGet(ptrFromObj(o),pos++,&ll))
listAddNodeTail(keys,createStringObjectFromLongLong(ll));
cursor = 0;
} 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 int vlen;
long long vll;
@ -725,7 +725,7 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
listAddNodeTail(keys,
(vstr != NULL) ? createStringObject((char*)vstr,vlen) :
createStringObjectFromLongLong(vll));
p = ziplistNext(o->ptr,p);
p = ziplistNext(ptrFromObj(o),p);
}
cursor = 0;
} else {
@ -742,14 +742,14 @@ void scanGenericCommand(client *c, robj *o, unsigned long cursor) {
/* Filter element if it does not match the pattern. */
if (!filter && use_pattern) {
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;
} else {
char buf[LONG_STR_SIZE];
int len;
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;
}
}
@ -826,7 +826,7 @@ void typeCommand(client *c) {
case OBJ_HASH: type = "hash"; break;
case OBJ_STREAM: type = "stream"; break;
case OBJ_MODULE: {
moduleValue *mv = o->ptr;
moduleValue *mv = ptrFromObj(o);
type = mv->type->name;
}; break;
default: type = "unknown"; break;
@ -842,9 +842,9 @@ void shutdownCommand(client *c) {
addReply(c,shared.syntaxerr);
return;
} else if (c->argc == 2) {
if (!strcasecmp(c->argv[1]->ptr,"nosave")) {
if (!strcasecmp(ptrFromObj(c->argv[1]),"nosave")) {
flags |= SHUTDOWN_NOSAVE;
} else if (!strcasecmp(c->argv[1]->ptr,"save")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"save")) {
flags |= SHUTDOWN_SAVE;
} else {
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,
* 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)
return;
@ -1062,8 +1062,8 @@ void swapdbCommand(client *c) {
int removeExpire(redisDb *db, robj *key) {
/* An expire may only be removed if there is a corresponding entry in the
* main dict. Otherwise, the key will never be freed. */
serverAssertWithInfo(NULL,key,dictFind(db->pdict,key->ptr) != NULL);
return dictDelete(db->expires,key->ptr) == DICT_OK;
serverAssertWithInfo(NULL,key,dictFind(db->pdict,ptrFromObj(key)) != NULL);
return dictDelete(db->expires,ptrFromObj(key)) == DICT_OK;
}
/* 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;
/* 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);
de = dictAddOrFind(db->expires,dictGetKey(kde));
dictSetSignedIntegerVal(de,when);
@ -1091,11 +1091,11 @@ long long getExpire(redisDb *db, robj *key) {
/* No expire? return ASAP */
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
* 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);
}
@ -1256,7 +1256,7 @@ int *zunionInterGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *nu
int i, num, *keys;
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
* reply with syntax error. */
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;
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
* reply with syntax error. */
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 (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;
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
* to be sure to process the *last* "STORE" option if multiple
* 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. */
if (argc > 6) {
for (i = 6; i < argc; i++) {
if (!strcasecmp(argv[i]->ptr,"keys") &&
sdslen(argv[3]->ptr) == 0)
if (!strcasecmp(ptrFromObj(argv[i]),"keys") &&
sdslen(ptrFromObj(argv[3])) == 0)
{
first = i+1;
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 */
int stored_key = -1;
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
* second key specified would override the first key. This behavior is kept
* 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. */
int streams_pos = -1;
for (i = 1; i < argc; i++) {
char *arg = argv[i]->ptr;
char *arg = ptrFromObj(argv[i]);
if (!strcasecmp(arg, "block")) {
i++; /* Skip option argument. */
} 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
* understand if we have keys for a given hash slot. */
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 *indexed = buf;
size_t keylen = sdslen(key->ptr);
size_t keylen = sdslen(ptrFromObj(key));
server.cluster->slots_keys_count[hashslot] += add ? 1 : -1;
if (keylen+2 > 64) indexed = zmalloc(keylen+2, MALLOC_SHARED);
indexed[0] = (hashslot >> 8) & 0xff;
indexed[1] = hashslot & 0xff;
memcpy(indexed+2,key->ptr,keylen);
memcpy(indexed+2,ptrFromObj(key),keylen);
if (add) {
raxInsert(server.cluster->slots_to_keys,indexed,keylen+2,NULL,NULL);
} else {

View File

@ -76,7 +76,7 @@ void xorDigest(unsigned char *digest, void *ptr, size_t len) {
void xorStringObjectDigest(unsigned char *digest, robj *o) {
o = getDecodedObject(o);
xorDigest(digest,o->ptr,sdslen(o->ptr));
xorDigest(digest,ptrFromObj(o),sdslen(ptrFromObj(o)));
decrRefCount(o);
}
@ -106,7 +106,7 @@ void mixDigest(unsigned char *digest, void *ptr, size_t len) {
void mixStringObjectDigest(unsigned char *digest, robj *o) {
o = getDecodedObject(o);
mixDigest(digest,o->ptr,sdslen(o->ptr));
mixDigest(digest,ptrFromObj(o),sdslen(ptrFromObj(o)));
decrRefCount(o);
}
@ -148,7 +148,7 @@ void xorObjectDigest(redisDb *db, robj *keyobj, unsigned char *digest, robj *o)
unsigned char eledigest[20];
if (o->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = o->ptr;
unsigned char *zl = ptrFromObj(o);
unsigned char *eptr, *sptr;
unsigned char *vstr;
unsigned int vlen;
@ -178,7 +178,7 @@ void xorObjectDigest(redisDb *db, robj *keyobj, unsigned char *digest, robj *o)
zzlNext(zl,&eptr,&sptr);
}
} else if (o->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = o->ptr;
zset *zs = ptrFromObj(o);
dictIterator *di = dictGetIterator(zs->pdict);
dictEntry *de;
@ -214,7 +214,7 @@ void xorObjectDigest(redisDb *db, robj *keyobj, unsigned char *digest, robj *o)
hashTypeReleaseIterator(hi);
} else if (o->type == OBJ_STREAM) {
streamIterator si;
streamIteratorStart(&si,o->ptr,NULL,NULL,0);
streamIteratorStart(&si,ptrFromObj(o),NULL,NULL,0);
streamID id;
int64_t numfields;
@ -235,7 +235,7 @@ void xorObjectDigest(redisDb *db, robj *keyobj, unsigned char *digest, robj *o)
streamIteratorStop(&si);
} else if (o->type == OBJ_MODULE) {
RedisModuleDigest md;
moduleValue *mv = o->ptr;
moduleValue *mv = ptrFromObj(o);
moduleType *mt = mv->type;
moduleInitDigestContext(md);
if (mt->digest) {
@ -298,7 +298,7 @@ void computeDatasetDigest(unsigned char *final) {
}
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[] = {
"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.",
@ -326,12 +326,12 @@ void debugCommand(client *c) {
NULL
};
addReplyHelp(c, help);
} else if (!strcasecmp(c->argv[1]->ptr,"segfault")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"segfault")) {
*((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));
} else if (!strcasecmp(c->argv[1]->ptr,"restart") ||
!strcasecmp(c->argv[1]->ptr,"crash-and-recover"))
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"restart") ||
!strcasecmp(ptrFromObj(c->argv[1]),"crash-and-recover"))
{
long long delay = 0;
if (c->argc >= 3) {
@ -339,21 +339,21 @@ NULL
!= C_OK) return;
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_NONE;
restartServer(flags,delay);
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. */
zfree(ptr);
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);
} else if (!strcasecmp(c->argv[1]->ptr,"log") && c->argc == 3) {
serverLog(LL_WARNING, "DEBUG LOG: %s", (char*)c->argv[2]->ptr);
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"log") && c->argc == 3) {
serverLog(LL_WARNING, "DEBUG LOG: %s", (char*)ptrFromObj(c->argv[2]));
addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"reload")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"reload")) {
rdbSaveInfo rsi, *rsiptr;
rsiptr = rdbPopulateSaveInfo(&rsi);
if (rdbSave(rsiptr) != C_OK) {
@ -370,7 +370,7 @@ NULL
}
serverLog(LL_WARNING,"DB reloaded by DEBUG RELOAD");
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);
emptyDb(-1,EMPTYDB_NO_FLAGS,NULL);
protectClient(c);
@ -383,12 +383,12 @@ NULL
server.dirty = 0; /* Prevent AOF / replication */
serverLog(LL_WARNING,"Append Only File loaded by DEBUG LOADAOF");
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;
robj *val;
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);
return;
}
@ -399,7 +399,7 @@ NULL
if (val->encoding == OBJ_ENCODING_QUICKLIST) {
char *nextra = extra;
int remaining = sizeof(extra);
quicklist *ql = val->ptr;
quicklist *ql = val->m_ptr;
/* Add number of quicklist nodes */
int used = snprintf(nextra, remaining, " ql_nodes:%lu", ql->len);
nextra += used;
@ -435,12 +435,12 @@ NULL
(void*)val, val->refcount,
strenc, rdbSavedObjectLen(val),
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;
robj *val;
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);
return;
}
@ -456,11 +456,11 @@ NULL
(long long) sdslen(key),
(long long) sdsavail(key),
(long long) sdsZmallocSize(key),
(long long) sdslen(val->ptr),
(long long) sdsavail(val->ptr),
(long long) sdslen(ptrFromObj(val)),
(long long) sdsavail(ptrFromObj(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;
if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.nokeyerr))
@ -469,10 +469,10 @@ NULL
if (o->encoding != OBJ_ENCODING_ZIPLIST) {
addReplyError(c,"Not an sds encoded string.");
} else {
ziplistRepr(o->ptr);
ziplistRepr(ptrFromObj(o));
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) {
long keys, j;
robj *key, *val;
@ -484,7 +484,7 @@ NULL
for (j = 0; j < keys; j++) {
long valsize = 0;
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));
if (c->argc == 5)
if (getLongFromObjectOrReply(c, c->argv[4], &valsize, NULL) != C_OK)
@ -499,14 +499,14 @@ NULL
else {
int buflen = strlen(buf);
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);
signalModifiedKey(c->db,key);
decrRefCount(key);
}
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) */
unsigned char digest[20];
sds d = sdsempty();
@ -515,7 +515,7 @@ NULL
for (int i = 0; i < 20; i++) d = sdscatprintf(d, "%02x",digest[i]);
addReplyStatus(c,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. */
addReplyArrayLen(c,c->argc-2);
for (int j = 2; j < c->argc; j++) {
@ -529,10 +529,10 @@ NULL
addReplyStatus(c,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|
* attrib|push|verbatim|true|false|state|err|bloberr] */
char *name = c->argv[2]->ptr;
char *name = ptrFromObj(c->argv[2]);
if (!strcasecmp(name,"string")) {
addReplyBulkCString(c,"Hello World");
} else if (!strcasecmp(name,"integer")) {
@ -581,8 +581,8 @@ NULL
} 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");
}
} else if (!strcasecmp(c->argv[1]->ptr,"sleep") && c->argc == 3) {
double dtime = strtod(c->argv[2]->ptr,NULL);
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"sleep") && c->argc == 3) {
double dtime = strtod(ptrFromObj(c->argv[2]),NULL);
long long utime = dtime*1000000;
struct timespec tv;
@ -590,24 +590,24 @@ NULL
tv.tv_nsec = (utime % 1000000) * 1000;
nanosleep(&tv, NULL);
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)
{
server.active_expire_enabled = atoi(c->argv[2]->ptr);
server.active_expire_enabled = atoi(ptrFromObj(c->argv[2]));
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)
{
server.lua_always_replicate_commands = atoi(c->argv[2]->ptr);
server.lua_always_replicate_commands = atoi(ptrFromObj(c->argv[2]));
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);
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 = sdscatlen(errstr,"\r\n",2);
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();
sizes = sdscatprintf(sizes,"bits:%d ",(sizeof(void*) == 8)?64:32);
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,"sdshdr64:%d ",(int)sizeof(struct sdshdr64));
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;
sds stats = sdsempty();
char buf[4096];
@ -639,7 +639,7 @@ NULL
stats = sdscat(stats,buf);
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;
dict *ht = NULL;
@ -650,12 +650,12 @@ NULL
switch (o->encoding) {
case OBJ_ENCODING_SKIPLIST:
{
zset *zs = o->ptr;
zset *zs = ptrFromObj(o);
ht = zs->pdict;
}
break;
case OBJ_ENCODING_HT:
ht = o->ptr;
ht = ptrFromObj(o);
break;
}
@ -667,12 +667,12 @@ NULL
dictGetStats(buf,sizeof(buf),ht);
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");
changeReplicationId();
clearReplicationId2();
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();
addReplyStatus(c,"Apparently Redis did not crash: test passed");
@ -710,7 +710,7 @@ void _serverAssertPrintClientInfo(const client *c) {
char *arg;
if (c->argv[j]->type == OBJ_STRING && sdsEncodedObject(c->argv[j])) {
arg = (char*) c->argv[j]->ptr;
arg = (char*) ptrFromObj(c->argv[j]);
} else {
snprintf(buf,sizeof(buf),"Object type: %u, encoding: %u",
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 refcount: %d", o->refcount);
if (o->type == OBJ_STRING && sdsEncodedObject(o)) {
serverLog(LL_WARNING,"Object raw string len: %zu", sdslen(o->ptr));
if (sdslen(o->ptr) < 4096) {
sds repr = sdscatrepr(sdsempty(),o->ptr,sdslen(o->ptr));
serverLog(LL_WARNING,"Object raw string len: %zu", sdslen(ptrFromObj(o)));
if (sdslen(ptrFromObj(o)) < 4096) {
sds repr = sdscatrepr(sdsempty(),ptrFromObj(o),sdslen(ptrFromObj(o)));
serverLog(LL_WARNING,"Object raw string content: %s", repr);
sdsfree(repr);
}
@ -741,7 +741,7 @@ void serverLogObjectDebugInfo(const robj *o) {
} else if (o->type == OBJ_ZSET) {
serverLog(LL_WARNING,"Sorted set size: %d", (int) zsetLength(o));
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]);
serverLog(LL_WARNING|LL_RAW,"argv[%d]: '%s'\n", j,
(char*)decoded->ptr);
(char*)ptrFromObj(decoded));
decrRefCount(decoded);
}
/* Check if the first argument, usually a key, is found inside the
@ -1192,10 +1192,10 @@ void logCurrentClient(void) {
dictEntry *de;
key = getDecodedObject(cc->argv[1]);
de = dictFind(cc->db->pdict, key->ptr);
de = dictFind(cc->db->pdict, ptrFromObj(key));
if (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);
}
decrRefCount(key);

View File

@ -355,13 +355,13 @@ void rememberSlaveKeyWithExpire(redisDb *db, robj *key) {
}
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
* 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()
* as it scans to find keys to remove. */
if (de->key == key->ptr) {
de->key = sdsdup(key->ptr);
if (de->key == ptrFromObj(key)) {
de->key = sdsdup(ptrFromObj(key));
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) {
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;
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
* less than zero is returned. */
double extractUnitOrReply(client *c, robj *unit) {
char *u = unit->ptr;
char *u = ptrFromObj(unit);
if (!strcmp(u, "m")) {
return 1;
@ -230,7 +230,7 @@ int geoGetPointsInRange(robj *zobj, double min, double max, double lon, double l
sds member;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr;
unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr;
unsigned char *vstr = NULL;
unsigned int vlen = 0;
@ -259,7 +259,7 @@ int geoGetPointsInRange(robj *zobj, double min, double max, double lon, double l
zzlNext(zl, &eptr, &sptr);
}
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl;
zskiplistNode *ln;
@ -504,7 +504,7 @@ void georadiusGeneric(client *c, int flags) {
if (c->argc > base_args) {
int remaining = c->argc - base_args;
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")) {
withdist = 1;
} else if (!strcasecmp(arg, "withhash")) {
@ -639,7 +639,7 @@ void georadiusGeneric(client *c, int flags) {
if (returned_items) {
zobj = createZsetObject();
zs = zobj->ptr;
zs = zobj->m_ptr;
}
for (i = 0; i < returned_items; i++) {
@ -709,7 +709,7 @@ void geohashCommand(client *c) {
addReplyArrayLen(c,c->argc-2);
for (j = 2; j < c->argc; j++) {
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);
} else {
/* The internal format we use for geocoding is a bit different
@ -762,7 +762,7 @@ void geoposCommand(client *c) {
addReplyArrayLen(c,c->argc-2);
for (j = 2; j < c->argc; j++) {
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);
} else {
/* Decode... */
@ -802,8 +802,8 @@ void geodistCommand(client *c) {
/* Get the scores. We need both otherwise NULL is returned. */
double score1, score2, xyxy[4];
if (zsetScore(zobj, c->argv[2]->ptr, &score1) == C_ERR ||
zsetScore(zobj, c->argv[3]->ptr, &score2) == C_ERR)
if (zsetScore(zobj, ptrFromObj(c->argv[2]), &score1) == C_ERR ||
zsetScore(zobj, ptrFromObj(c->argv[3]), &score2) == C_ERR)
{
addReplyNull(c);
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,
* otherwise C_ERR is returned if the representation was corrupted. */
int hllSparseToDense(robj *o) {
sds sparse = o->ptr, dense;
sds sparse = ptrFromObj(o), dense;
struct hllhdr *hdr, *oldhdr = (struct hllhdr*)sparse;
int idx = 0, runlen, regval;
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. */
sdsfree(o->ptr);
o->ptr = dense;
sdsfree(ptrFromObj(o));
o->m_ptr = dense;
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
* so that the pointers we take during the execution of the function
* 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
* if a value update is actually needed. */
sparse = p = ((uint8_t*)o->ptr) + HLL_HDR_SIZE;
end = p + sdslen(o->ptr) - HLL_HDR_SIZE;
sparse = p = ((uint8_t*)ptrFromObj(o)) + HLL_HDR_SIZE;
end = p + sdslen(ptrFromObj(o)) - HLL_HDR_SIZE;
first = 0;
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;
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);
sdsIncrLen(o->ptr,deltalen);
sdsIncrLen(ptrFromObj(o),deltalen);
memcpy(p,seq,seqlen);
end += deltalen;
@ -860,7 +860,7 @@ updated:
if (len <= HLL_SPARSE_VAL_MAX_LEN) {
HLL_SPARSE_VAL_SET(p+1,v1,len);
memmove(p,p+1,end-p);
sdsIncrLen(o->ptr,-1);
sdsIncrLen(ptrFromObj(o),-1);
end--;
/* After a merge we reiterate without incrementing 'p'
* in order to try to merge the just merged value with
@ -873,13 +873,13 @@ updated:
}
/* Invalidate the cached cardinality. */
hdr = o->ptr;
hdr = ptrFromObj(o);
HLL_INVALIDATE_CACHE(hdr);
return 1;
promote: /* Promote to dense representation. */
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
* 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. */
int hllAdd(robj *o, unsigned char *ele, size_t elesize) {
struct hllhdr *hdr = o->ptr;
struct hllhdr *hdr = ptrFromObj(o);
switch(hdr->encoding) {
case HLL_DENSE: return hllDenseAdd(hdr->registers,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
* is returned, otherwise the function always succeeds. */
int hllMerge(uint8_t *max, robj *hll) {
struct hllhdr *hdr = hll->ptr;
struct hllhdr *hdr = ptrFromObj(hll);
int i;
if (hdr->encoding == HLL_DENSE) {
@ -1071,7 +1071,7 @@ int hllMerge(uint8_t *max, robj *hll) {
if (val > max[i]) max[i] = val;
}
} else {
uint8_t *p = hll->ptr, *end = p + sdslen(hll->ptr);
uint8_t *p = ptrFromObj(hll), *end = p + sdslen(ptrFromObj(hll));
long runlen, regval;
p += HLL_HDR_SIZE;
@ -1130,7 +1130,7 @@ robj *createHLLObject(void) {
/* Create the actual object. */
o = createObject(OBJ_STRING,s);
hdr = o->ptr;
hdr = ptrFromObj(o);
memcpy(hdr->magic,"HYLL",4);
hdr->encoding = HLL_SPARSE;
return o;
@ -1148,7 +1148,7 @@ int isHLLObjectOrReply(client *c, robj *o) {
if (!sdsEncodedObject(o)) goto invalid;
if (stringObjectLen(o) < sizeof(*hdr)) goto invalid;
hdr = o->ptr;
hdr = ptrFromObj(o);
/* Magic should be "HYLL". */
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. */
for (j = 2; j < c->argc; j++) {
int retval = hllAdd(o, (unsigned char*)c->argv[j]->ptr,
sdslen(c->argv[j]->ptr));
int retval = hllAdd(o, (unsigned char*)ptrFromObj(c->argv[j]),
sdslen(ptrFromObj(c->argv[j])));
switch(retval) {
case 1:
updated++;
@ -1200,7 +1200,7 @@ void pfaddCommand(client *c) {
return;
}
}
hdr = o->ptr;
hdr = ptrFromObj(o);
if (updated) {
signalModifiedKey(c->db,c->argv[1]);
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);
/* Check if the cached cardinality is valid. */
hdr = o->ptr;
hdr = ptrFromObj(o);
if (HLL_VALID_CACHE(hdr)) {
/* Just return the cached value. */
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
* 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;
/* Merge with this HLL with our 'max' HHL by setting max[i]
@ -1356,13 +1356,13 @@ void pfmergeCommand(client *c) {
* invalidate the cached value. */
for (j = 0; j < HLL_REGISTERS; j++) {
if (max[j] == 0) continue;
hdr = o->ptr;
hdr = ptrFromObj(o);
switch(hdr->encoding) {
case HLL_DENSE: hllDenseSet(hdr->registers,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. */
HLL_INVALIDATE_CACHE(hdr);
@ -1438,7 +1438,7 @@ void pfselftestCommand(client *c) {
/* Make sure that for small cardinalities we use sparse
* encoding. */
if (j == checkpoint && j < server.hll_sparse_max_bytes/2) {
hdr2 = o->ptr;
hdr2 = ptrFromObj(o);
if (hdr2->encoding != HLL_SPARSE) {
addReplyError(c, "TESTFAILED sparse encoding not used");
goto cleanup;
@ -1446,7 +1446,7 @@ void pfselftestCommand(client *c) {
}
/* 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");
goto cleanup;
}
@ -1485,7 +1485,7 @@ cleanup:
/* PFDEBUG <subcommand> <key> ... args ...
* Different debugging related operations about the HLL implementation. */
void pfdebugCommand(client *c) {
char *cmd = c->argv[1]->ptr;
char *cmd = ptrFromObj(c->argv[1]);
struct hllhdr *hdr;
robj *o;
int j;
@ -1497,7 +1497,7 @@ void pfdebugCommand(client *c) {
}
if (isHLLObjectOrReply(c,o) != C_OK) return;
o = dbUnshareStringValue(c->db,c->argv[2],o);
hdr = o->ptr;
hdr = ptrFromObj(o);
/* PFDEBUG GETREG <key> */
if (!strcasecmp(cmd,"getreg")) {
@ -1511,7 +1511,7 @@ void pfdebugCommand(client *c) {
server.dirty++; /* Force propagation on encoding change. */
}
hdr = o->ptr;
hdr = ptrFromObj(o);
addReplyArrayLen(c,HLL_REGISTERS);
for (j = 0; j < HLL_REGISTERS; j++) {
uint8_t val;
@ -1524,7 +1524,7 @@ void pfdebugCommand(client *c) {
else if (!strcasecmp(cmd,"decode")) {
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();
if (hdr->encoding != HLL_SPARSE) {

View File

@ -579,21 +579,21 @@ NULL
};
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> */
ts = dictFetchValue(server.latency_events,c->argv[2]->ptr);
ts = dictFetchValue(server.latency_events,ptrFromObj(c->argv[2]));
if (ts == NULL) {
addReplyArrayLen(c,0);
} else {
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> */
sds graph;
dictEntry *de;
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;
ts = dictGetVal(de);
event = dictGetKey(de);
@ -601,16 +601,16 @@ NULL
graph = latencyCommandGenSparkeline(event,ts);
addReplyBulkCString(c,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 */
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 */
sds report = createLatencyReport();
addReplyBulkCBuffer(c,report,sdslen(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 */
if (c->argc == 2) {
addReplyLongLong(c,latencyResetEvent(NULL));
@ -618,10 +618,10 @@ NULL
int j, resets = 0;
for (j = 2; j < c->argc; j++)
resets += latencyResetEvent(c->argv[j]->ptr);
resets += latencyResetEvent(ptrFromObj(c->argv[j]));
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);
} else {
addReplySubcommandSyntaxError(c);
@ -632,6 +632,6 @@ nodataerr:
/* Common error when the user asks for an event we have no latency
* information about. */
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. */
size_t lazyfreeGetFreeEffort(robj *obj) {
if (obj->type == OBJ_LIST) {
quicklist *ql = obj->ptr;
quicklist *ql = ptrFromObj(obj);
return ql->len;
} else if (obj->type == OBJ_SET && obj->encoding == OBJ_ENCODING_HT) {
dict *ht = obj->ptr;
dict *ht = ptrFromObj(obj);
return dictSize(ht);
} else if (obj->type == OBJ_ZSET && obj->encoding == OBJ_ENCODING_SKIPLIST){
zset *zs = obj->ptr;
zset *zs = ptrFromObj(obj);
return zs->zsl->length;
} else if (obj->type == OBJ_HASH && obj->encoding == OBJ_ENCODING_HT) {
dict *ht = obj->ptr;
dict *ht = ptrFromObj(obj);
return dictSize(ht);
} else {
return 1; /* Everything else is a single allocation. */
@ -54,12 +54,12 @@ size_t lazyfreeGetFreeEffort(robj *obj) {
int dbAsyncDelete(redisDb *db, robj *key) {
/* Deleting an entry from the expires dict will not free the sds of
* 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
* is actually just slower... So under a certain limit we just free
* the object synchronously. */
dictEntry *de = dictUnlink(db->pdict,key->ptr);
dictEntry *de = dictUnlink(db->pdict,ptrFromObj(key));
if (de) {
robj *val = dictGetVal(de);
size_t free_effort = lazyfreeGetFreeEffort(val);

View File

@ -392,7 +392,7 @@ int moduleCreateEmptyKey(RedisModuleKey *key, int type) {
switch(type) {
case REDISMODULE_KEYTYPE_LIST:
obj = createQuicklistObject();
quicklistSetOptions(obj->ptr, server.list_max_ziplist_size,
quicklistSetOptions(obj->m_ptr, server.list_max_ziplist_size,
server.list_compress_depth);
break;
case REDISMODULE_KEYTYPE_ZSET:
@ -938,8 +938,8 @@ const char *RM_StringPtrLen(const RedisModuleString *str, size_t *len) {
if (len) *len = strlen(errmsg);
return errmsg;
}
if (len) *len = sdslen(str->ptr);
return str->ptr;
if (len) *len = sdslen(ptrFromObj(str));
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
* is returned. */
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;
}
@ -983,11 +983,11 @@ RedisModuleString *moduleAssertUnsharedString(RedisModuleString *str) {
if (str->encoding == OBJ_ENCODING_EMBSTR) {
/* Note: here we "leak" the additional allocation that was
* 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;
} else if (str->encoding == OBJ_ENCODING_INT) {
/* 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;
}
return str;
@ -1000,7 +1000,7 @@ int RM_StringAppendBuffer(RedisModuleCtx *ctx, RedisModuleString *str, const cha
UNUSED(ctx);
str = moduleAssertUnsharedString(str);
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;
}
@ -1024,7 +1024,7 @@ int RM_StringAppendBuffer(RedisModuleCtx *ctx, RedisModuleString *str, const cha
int RM_WrongArity(RedisModuleCtx *ctx) {
addReplyErrorFormat(ctx->client,
"wrong number of arguments for '%s' command",
(char*)ctx->client->argv[0]->ptr);
(char*)ptrFromObj(ctx->client->argv[0]));
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)
key->value = dbUnshareStringValue(key->db, key->key, key->value);
*len = sdslen(key->value->ptr);
return key->value->ptr;
*len = sdslen(ptrFromObj(key->value));
return ptrFromObj(key->value);
}
/* 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 {
/* Unshare and resize. */
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) {
key->value->ptr = sdsgrowzero(key->value->ptr,newlen);
key->value->m_ptr = sdsgrowzero(ptrFromObj(key->value),newlen);
} 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 (sdslen(key->value->ptr) < sdsavail(key->value->ptr))
key->value->ptr = sdsRemoveFreeSpace(key->value->ptr);
if (sdslen(ptrFromObj(key->value)) < sdsavail(ptrFromObj(key->value)))
key->value->m_ptr = sdsRemoveFreeSpace(ptrFromObj(key->value));
}
}
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 == NULL) moduleCreateEmptyKey(key,REDISMODULE_KEYTYPE_ZSET);
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;
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 (flagsptr) flags = RM_ZsetAddFlagsToCoreFlags(*flagsptr);
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;
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) {
if (!(key->mode & REDISMODULE_WRITE)) 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;
} else {
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) {
if (key->value == NULL) 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;
}
@ -1923,10 +1923,10 @@ int zsetInitScoreRange(RedisModuleKey *key, double min, double max, int minex, i
zrs->maxex = maxex;
if (key->value->encoding == OBJ_ENCODING_ZIPLIST) {
key->zcurrent = first ? zzlFirstInRange(key->value->ptr,zrs) :
zzlLastInRange(key->value->ptr,zrs);
key->zcurrent = first ? zzlFirstInRange(ptrFromObj(key->value),zrs) :
zzlLastInRange(ptrFromObj(key->value),zrs);
} else if (key->value->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = key->value->ptr;
zset *zs = ptrFromObj(key->value);
zskiplist *zsl = zs->zsl;
key->zcurrent = first ? zslFirstInRange(zsl,zrs) :
zslLastInRange(zsl,zrs);
@ -1987,10 +1987,10 @@ int zsetInitLexRange(RedisModuleKey *key, RedisModuleString *min, RedisModuleStr
key->ztype = REDISMODULE_ZSET_RANGE_LEX;
if (key->value->encoding == OBJ_ENCODING_ZIPLIST) {
key->zcurrent = first ? zzlFirstInLexRange(key->value->ptr,zlrs) :
zzlLastInLexRange(key->value->ptr,zlrs);
key->zcurrent = first ? zzlFirstInLexRange(ptrFromObj(key->value),zlrs) :
zzlLastInLexRange(ptrFromObj(key->value),zlrs);
} else if (key->value->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = key->value->ptr;
zset *zs = ptrFromObj(key->value);
zskiplist *zsl = zs->zsl;
key->zcurrent = first ? zslFirstInLexRange(zsl,zlrs) :
zslLastInLexRange(zsl,zlrs);
@ -2036,7 +2036,7 @@ RedisModuleString *RM_ZsetRangeCurrentElement(RedisModuleKey *key, double *score
eptr = key->zcurrent;
sds ele = ziplistGetObject(eptr);
if (score) {
sptr = ziplistNext(key->value->ptr,eptr);
sptr = ziplistNext(ptrFromObj(key->value),eptr);
*score = zzlGetScore(sptr);
}
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->value->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = key->value->ptr;
unsigned char *zl = ptrFromObj(key->value);
unsigned char *eptr = key->zcurrent;
unsigned char *next;
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->value->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = key->value->ptr;
unsigned char *zl = ptrFromObj(key->value);
unsigned char *eptr = key->zcurrent;
unsigned char *prev;
prev = ziplistPrev(zl,eptr); /* Go back to previous score. */
@ -2256,7 +2256,7 @@ int RM_HashSet(RedisModuleKey *key, int flags, ...) {
/* Handle XX and 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) ||
((flags & REDISMODULE_HASH_NX) && exists))
{
@ -2267,7 +2267,7 @@ int RM_HashSet(RedisModuleKey *key, int flags, ...) {
/* Handle deletion if value is 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);
continue;
}
@ -2281,12 +2281,12 @@ int RM_HashSet(RedisModuleKey *key, int flags, ...) {
robj *argv[2] = {field,value};
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(),
* however we still have to release the 'field' object shell. */
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);
}
}
@ -2358,13 +2358,13 @@ int RM_HashGet(RedisModuleKey *key, int flags, ...) {
if (flags & REDISMODULE_HASH_EXISTS) {
existsptr = va_arg(ap,int*);
if (key->value)
*existsptr = hashTypeExists(key->value,field->ptr);
*existsptr = hashTypeExists(key->value,ptrFromObj(field));
else
*existsptr = 0;
} else {
valueptr = va_arg(ap,RedisModuleString**);
if (key->value) {
*valueptr = hashTypeGetValueObject(key->value,field->ptr);
*valueptr = hashTypeGetValueObject(key->value,ptrFromObj(field));
if (*valueptr) {
robj *decoded = getDecodedObject(*valueptr);
decrRefCount(*valueptr);
@ -3035,7 +3035,7 @@ moduleType *RM_ModuleTypeGetType(RedisModuleKey *key) {
if (key == NULL ||
key->value == NULL ||
RM_KeyType(key) != REDISMODULE_KEYTYPE_MODULE) return NULL;
moduleValue *mv = key->value->ptr;
moduleValue *mv = ptrFromObj(key->value);
return mv->type;
}
@ -3049,7 +3049,7 @@ void *RM_ModuleTypeGetValue(RedisModuleKey *key) {
if (key == NULL ||
key->value == NULL ||
RM_KeyType(key) != REDISMODULE_KEYTYPE_MODULE) return NULL;
moduleValue *mv = key->value->ptr;
moduleValue *mv = ptrFromObj(key->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. */
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. */
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
@ -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. */
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
@ -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. */
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
@ -4479,7 +4479,7 @@ RedisModuleDictIter *RM_DictIteratorStartC(RedisModuleDict *d, const char *op, v
/* Exactly like RedisModule_DictIteratorStartC, but the key is passed as a
* RedisModuleString. */
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
@ -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
* RedisModuleString. */
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
@ -4594,7 +4594,7 @@ int RM_DictCompareC(RedisModuleDictIter *di, const char *op, void *key, size_t k
* iterator key as a RedisModuleString. */
int RM_DictCompare(RedisModuleDictIter *di, const char *op, RedisModuleString *key) {
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;
}
@ -4844,7 +4844,7 @@ void addReplyLoadedModules(client *c) {
*
* MODULE LOAD <path> [args...] */
void moduleCommand(client *c) {
char *subcmd = c->argv[1]->ptr;
char *subcmd = ptrFromObj(c->argv[1]);
if (c->argc == 2 && !strcasecmp(subcmd,"help")) {
const char *help[] = {
"LIST -- Return a list of loaded modules.",
@ -4863,13 +4863,13 @@ NULL
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);
else
addReplyError(c,
"Error loading the extension. Please check the server logs.");
} 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);
else {
char *errmsg;

View File

@ -329,7 +329,7 @@ void touchWatchedKeysOnFlush(int dbid) {
* key exists, mark the client as dirty, as the key will be
* removed. */
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;
}
}

View File

@ -48,7 +48,7 @@ size_t sdsZmallocSize(sds s) {
size_t getStringObjectSdsUsedMemory(robj *o) {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
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);
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 (sdsEncodedObject(obj)) {
if (_addReplyToBuffer(c,obj->ptr,sdslen(obj->ptr)) != C_OK)
_addReplyProtoToList(c,obj->ptr,sdslen(obj->ptr));
if (_addReplyToBuffer(c,ptrFromObj(obj),sdslen(ptrFromObj(obj))) != C_OK)
_addReplyProtoToList(c,ptrFromObj(obj),sdslen(ptrFromObj(obj)));
} else if (obj->encoding == OBJ_ENCODING_INT) {
/* For integer encoded strings we just convert it into a string
* using our optimized function, and attach the resulting string
* to the output buffer. */
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)
_addReplyProtoToList(c,buf,len);
} else {
@ -639,9 +639,9 @@ void addReplyBulkLen(client *c, robj *obj) {
size_t len;
if (sdsEncodedObject(obj)) {
len = sdslen(obj->ptr);
len = sdslen(ptrFromObj(obj));
} else {
long n = (long)obj->ptr;
long n = (long)ptrFromObj(obj);
/* Compute how many bytes will take this integer as a radix 10 string */
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
* is terminated by NULL sentinel. */
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);
int blen = 0;
@ -752,11 +752,11 @@ void addReplyHelp(client *c, const char **help) {
* This function is typically invoked by from commands that support
* subcommands in response to an unknown subcommand or argument error. */
void addReplySubcommandSyntaxError(client *c) {
sds cmd = sdsnew((char*) c->argv[0]->ptr);
sds cmd = sdsnew((char*) ptrFromObj(c->argv[0]));
sdstoupper(cmd);
addReplyErrorFormat(c,
"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);
}
@ -1785,7 +1785,7 @@ sds catClientInfoString(sds s, client *client) {
(unsigned long long) client->id,
getClientPeerId(client),
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->lastinteraction),
flags,
@ -1823,7 +1823,7 @@ void clientCommand(client *c) {
listIter li;
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[] = {
"id -- Return the ID of the current connection.",
"getname -- Return the name of the current connection.",
@ -1841,17 +1841,17 @@ void clientCommand(client *c) {
NULL
};
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 */
addReplyLongLong(c,c->id);
} else if (!strcasecmp(c->argv[1]->ptr,"list")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"list")) {
/* CLIENT LIST */
int type = -1;
if (c->argc == 4 && !strcasecmp(c->argv[2]->ptr,"type")) {
type = getClientTypeByName(c->argv[3]->ptr);
if (c->argc == 4 && !strcasecmp(ptrFromObj(c->argv[2]),"type")) {
type = getClientTypeByName(ptrFromObj(c->argv[3]));
if (type == -1) {
addReplyErrorFormat(c,"Unknown client type '%s'",
(char*) c->argv[3]->ptr);
(char*) ptrFromObj(c->argv[3]));
return;
}
} else if (c->argc != 2) {
@ -1861,21 +1861,21 @@ NULL
sds o = getAllClientsInfoString(type);
addReplyBulkCBuffer(c,o,sdslen(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 */
if (!strcasecmp(c->argv[2]->ptr,"on")) {
if (!strcasecmp(ptrFromObj(c->argv[2]),"on")) {
c->flags &= ~(CLIENT_REPLY_SKIP|CLIENT_REPLY_OFF);
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;
} else if (!strcasecmp(c->argv[2]->ptr,"skip")) {
} else if (!strcasecmp(ptrFromObj(c->argv[2]),"skip")) {
if (!(c->flags & CLIENT_REPLY_OFF))
c->flags |= CLIENT_REPLY_SKIP_NEXT;
} else {
addReply(c,shared.syntaxerr);
return;
}
} else if (!strcasecmp(c->argv[1]->ptr,"kill")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"kill")) {
/* CLIENT KILL <ip:port>
* CLIENT KILL <option> [value] ... <option> [value] */
char *addr = NULL;
@ -1886,7 +1886,7 @@ NULL
if (c->argc == 3) {
/* 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. */
} else if (c->argc > 3) {
int i = 2; /* Next option index. */
@ -1895,25 +1895,25 @@ NULL
while(i < c->argc) {
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;
if (getLongLongFromObjectOrReply(c,c->argv[i+1],&tmp,NULL)
!= C_OK) return;
id = tmp;
} else if (!strcasecmp(c->argv[i]->ptr,"type") && moreargs) {
type = getClientTypeByName(c->argv[i+1]->ptr);
} else if (!strcasecmp(ptrFromObj(c->argv[i]),"type") && moreargs) {
type = getClientTypeByName(ptrFromObj(c->argv[i+1]));
if (type == -1) {
addReplyErrorFormat(c,"Unknown client type '%s'",
(char*) c->argv[i+1]->ptr);
(char*) ptrFromObj(c->argv[i+1]));
return;
}
} else if (!strcasecmp(c->argv[i]->ptr,"addr") && moreargs) {
addr = c->argv[i+1]->ptr;
} else if (!strcasecmp(c->argv[i]->ptr,"skipme") && moreargs) {
if (!strcasecmp(c->argv[i+1]->ptr,"yes")) {
} else if (!strcasecmp(ptrFromObj(c->argv[i]),"addr") && moreargs) {
addr = ptrFromObj(c->argv[i+1]);
} else if (!strcasecmp(ptrFromObj(c->argv[i]),"skipme") && moreargs) {
if (!strcasecmp(ptrFromObj(c->argv[i+1]),"yes")) {
skipme = 1;
} else if (!strcasecmp(c->argv[i+1]->ptr,"no")) {
} else if (!strcasecmp(ptrFromObj(c->argv[i+1]),"no")) {
skipme = 0;
} else {
addReply(c,shared.syntaxerr);
@ -1961,7 +1961,7 @@ NULL
/* If this client has to be closed, flag it as CLOSE_AFTER_REPLY
* only after we queued the reply to its output buffers. */
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))
{
/* CLIENT UNBLOCK <id> [timeout|error] */
@ -1969,9 +1969,9 @@ NULL
int unblock_error = 0;
if (c->argc == 4) {
if (!strcasecmp(c->argv[3]->ptr,"timeout")) {
if (!strcasecmp(ptrFromObj(c->argv[3]),"timeout")) {
unblock_error = 0;
} else if (!strcasecmp(c->argv[3]->ptr,"error")) {
} else if (!strcasecmp(ptrFromObj(c->argv[3]),"error")) {
unblock_error = 1;
} else {
addReplyError(c,
@ -1993,9 +1993,9 @@ NULL
} else {
addReply(c,shared.czero);
}
} else if (!strcasecmp(c->argv[1]->ptr,"setname") && c->argc == 3) {
int j, len = sdslen(c->argv[2]->ptr);
char *p = c->argv[2]->ptr;
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"setname") && c->argc == 3) {
int j, len = sdslen(ptrFromObj(c->argv[2]));
char *p = ptrFromObj(c->argv[2]);
/* Setting the client name to an empty string actually removes
* the current name. */
@ -2021,12 +2021,12 @@ NULL
c->name = c->argv[2];
incrRefCount(c->name);
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)
addReplyBulk(c,c->name);
else
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;
if (getTimeoutFromObjectOrReply(c,c->argv[2],&duration,UNIT_MILLISECONDS)
@ -2034,7 +2034,7 @@ NULL
pauseClients(duration);
addReply(c,shared.ok);
} 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. */
c->argv = argv;
c->argc = argc;
c->cmd = lookupCommandOrOriginal(c->argv[0]->ptr);
c->cmd = lookupCommandOrOriginal(ptrFromObj(c->argv[0]));
serverAssertWithInfo(c,NULL,c->cmd != NULL);
va_end(ap);
}
@ -2151,7 +2151,7 @@ void replaceClientCommandVector(client *c, int argc, robj **argv) {
zfree(c->argv);
c->argv = argv;
c->argc = argc;
c->cmd = lookupCommandOrOriginal(c->argv[0]->ptr);
c->cmd = lookupCommandOrOriginal(ptrFromObj(c->argv[0]));
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 (i == 0) {
c->cmd = lookupCommandOrOriginal(c->argv[0]->ptr);
c->cmd = lookupCommandOrOriginal(ptrFromObj(c->argv[0]));
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);
chan = sdscatlen(chan, buf, len);
chan = sdscatlen(chan, "__:", 3);
chan = sdscatsds(chan, key->ptr);
chan = sdscatsds(chan, ptrFromObj(key));
chanobj = createObject(OBJ_STRING, chan);
pubsubPublishMessage(chanobj, eventobj);
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);
chan = sdscatlen(chan, buf, len);
chan = sdscatlen(chan, "__:", 3);
chan = sdscatsds(chan, eventobj->ptr);
chan = sdscatsds(chan, ptrFromObj(eventobj));
chanobj = createObject(OBJ_STRING, chan);
pubsubPublishMessage(chanobj, key);
decrRefCount(chanobj);

View File

@ -42,7 +42,7 @@ robj *createObject(int type, void *ptr) {
robj *o = zmalloc(sizeof(*o), MALLOC_SHARED);
o->type = type;
o->encoding = OBJ_ENCODING_RAW;
o->ptr = ptr;
o->m_ptr = ptr;
o->refcount = 1;
/* 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
* 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) {
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
* allocated in the same chunk as the object itself. */
robj *createEmbeddedStringObject(const char *ptr, size_t len) {
robj *o = zmalloc(sizeof(robj)+sizeof(struct sdshdr8)+len+1, MALLOC_SHARED);
struct sdshdr8 *sh = (void*)(o+1);
robj *o = zmalloc(sizeof(robj)+sizeof(struct sdshdr8)+len+1-sizeof(o->m_ptr), MALLOC_SHARED);
struct sdshdr8 *sh = (void*)(&o->m_ptr);
o->type = OBJ_STRING;
o->encoding = OBJ_ENCODING_EMBSTR;
o->ptr = sh+1;
o->refcount = 1;
if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) {
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) {
o = createObject(OBJ_STRING, NULL);
o->encoding = OBJ_ENCODING_INT;
o->ptr = (void*)((long)value);
o->m_ptr = (void*)((long)value);
} else {
o = createObject(OBJ_STRING,sdsfromlonglong(value));
}
@ -197,13 +196,13 @@ robj *dupStringObject(const robj *o) {
switch(o->encoding) {
case OBJ_ENCODING_RAW:
return createRawStringObject(o->ptr,sdslen(o->ptr));
return createRawStringObject(ptrFromObj(o),sdslen(ptrFromObj(o)));
case OBJ_ENCODING_EMBSTR:
return createEmbeddedStringObject(o->ptr,sdslen(o->ptr));
return createEmbeddedStringObject(ptrFromObj(o),sdslen(ptrFromObj(o)));
case OBJ_ENCODING_INT:
d = createObject(OBJ_STRING, NULL);
d->encoding = OBJ_ENCODING_INT;
d->ptr = o->ptr;
d->m_ptr = ptrFromObj(o);
return d;
default:
serverPanic("Wrong encoding.");
@ -280,13 +279,13 @@ robj *createModuleObject(moduleType *mt, void *value) {
void freeStringObject(robj *o) {
if (o->encoding == OBJ_ENCODING_RAW) {
sdsfree(o->ptr);
sdsfree(ptrFromObj(o));
}
}
void freeListObject(robj *o) {
if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklistRelease(o->ptr);
quicklistRelease(ptrFromObj(o));
} else {
serverPanic("Unknown list encoding type");
}
@ -295,10 +294,10 @@ void freeListObject(robj *o) {
void freeSetObject(robj *o) {
switch (o->encoding) {
case OBJ_ENCODING_HT:
dictRelease((dict*) o->ptr);
dictRelease((dict*) ptrFromObj(o));
break;
case OBJ_ENCODING_INTSET:
zfree(o->ptr);
zfree(ptrFromObj(o));
break;
default:
serverPanic("Unknown set encoding type");
@ -309,13 +308,13 @@ void freeZsetObject(robj *o) {
zset *zs;
switch (o->encoding) {
case OBJ_ENCODING_SKIPLIST:
zs = o->ptr;
zs = ptrFromObj(o);
dictRelease(zs->pdict);
zslFree(zs->zsl);
zfree(zs);
break;
case OBJ_ENCODING_ZIPLIST:
zfree(o->ptr);
zfree(ptrFromObj(o));
break;
default:
serverPanic("Unknown sorted set encoding");
@ -325,10 +324,10 @@ void freeZsetObject(robj *o) {
void freeHashObject(robj *o) {
switch (o->encoding) {
case OBJ_ENCODING_HT:
dictRelease((dict*) o->ptr);
dictRelease((dict*) ptrFromObj(o));
break;
case OBJ_ENCODING_ZIPLIST:
zfree(o->ptr);
zfree(ptrFromObj(o));
break;
default:
serverPanic("Unknown hash encoding type");
@ -337,13 +336,13 @@ void freeHashObject(robj *o) {
}
void freeModuleObject(robj *o) {
moduleValue *mv = o->ptr;
moduleValue *mv = ptrFromObj(o);
mv->type->free(mv->value);
zfree(mv);
}
void freeStreamObject(robj *o) {
freeStream(o->ptr);
freeStream(ptrFromObj(o));
}
void incrRefCount(robj *o) {
@ -408,17 +407,17 @@ int isSdsRepresentableAsLongLong(sds s, long long *llval) {
int isObjectRepresentableAsLongLong(robj *o, long long *llval) {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
if (o->encoding == OBJ_ENCODING_INT) {
if (llval) *llval = (long) o->ptr;
if (llval) *llval = (long) ptrFromObj(o);
return C_OK;
} else {
return isSdsRepresentableAsLongLong(o->ptr,llval);
return isSdsRepresentableAsLongLong(ptrFromObj(o),llval);
}
}
/* Try to encode a string object in order to save space */
robj *tryObjectEncoding(robj *o) {
long value;
sds s = o->ptr;
sds s = ptrFromObj(o);
size_t len;
/* Make sure this is a string object, the only type we encode
@ -455,9 +454,9 @@ robj *tryObjectEncoding(robj *o) {
incrRefCount(shared.integers[value]);
return shared.integers[value];
} 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->ptr = (void*) value;
o->m_ptr = (void*) value;
return o;
}
}
@ -487,7 +486,7 @@ robj *tryObjectEncoding(robj *o) {
if (o->encoding == OBJ_ENCODING_RAW &&
sdsavail(s) > len/10)
{
o->ptr = sdsRemoveFreeSpace(o->ptr);
o->m_ptr = sdsRemoveFreeSpace(ptrFromObj(o));
}
/* Return the original object. */
@ -506,7 +505,7 @@ robj *getDecodedObject(robj *o) {
if (o->type == OBJ_STRING && o->encoding == OBJ_ENCODING_INT) {
char buf[32];
ll2string(buf,32,(long)o->ptr);
ll2string(buf,32,(long)ptrFromObj(o));
dec = createStringObject(buf,strlen(buf));
return dec;
} else {
@ -532,17 +531,17 @@ int compareStringObjectsWithFlags(robj *a, robj *b, int flags) {
if (a == b) return 0;
if (sdsEncodedObject(a)) {
astr = a->ptr;
astr = ptrFromObj(a);
alen = sdslen(astr);
} else {
alen = ll2string(bufa,sizeof(bufa),(long) a->ptr);
alen = ll2string(bufa,sizeof(bufa),(long) ptrFromObj(a));
astr = bufa;
}
if (sdsEncodedObject(b)) {
bstr = b->ptr;
bstr = ptrFromObj(b);
blen = sdslen(bstr);
} else {
blen = ll2string(bufb,sizeof(bufb),(long) b->ptr);
blen = ll2string(bufb,sizeof(bufb),(long) ptrFromObj(b));
bstr = bufb;
}
if (flags & REDIS_COMPARE_COLL) {
@ -576,7 +575,7 @@ int equalStringObjects(robj *a, robj *b) {
b->encoding == OBJ_ENCODING_INT){
/* If both strings are integer encoded just check if the stored
* long is the same. */
return a->ptr == b->ptr;
return a->m_ptr == b->m_ptr;
} else {
return compareStringObjects(a,b) == 0;
}
@ -585,9 +584,9 @@ int equalStringObjects(robj *a, robj *b) {
size_t stringObjectLen(robj *o) {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
if (sdsEncodedObject(o)) {
return sdslen(o->ptr);
return sdslen(ptrFromObj(o));
} 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);
if (sdsEncodedObject(o)) {
errno = 0;
value = strtod(o->ptr, &eptr);
if (sdslen(o->ptr) == 0 ||
isspace(((const char*)o->ptr)[0]) ||
(size_t)(eptr-(char*)o->ptr) != sdslen(o->ptr) ||
value = strtod(ptrFromObj(o), &eptr);
if (sdslen(ptrFromObj(o)) == 0 ||
isspace(((const char*)ptrFromObj(o))[0]) ||
(size_t)(eptr-(char*)ptrFromObj(o)) != sdslen(ptrFromObj(o)) ||
(errno == ERANGE &&
(value == HUGE_VAL || value == -HUGE_VAL || value == 0)) ||
isnan(value))
return C_ERR;
} else if (o->encoding == OBJ_ENCODING_INT) {
value = (long)o->ptr;
value = (long)ptrFromObj(o);
} else {
serverPanic("Unknown string encoding");
}
@ -643,16 +642,16 @@ int getLongDoubleFromObject(robj *o, long double *target) {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
if (sdsEncodedObject(o)) {
errno = 0;
value = strtold(o->ptr, &eptr);
if (sdslen(o->ptr) == 0 ||
isspace(((const char*)o->ptr)[0]) ||
(size_t)(eptr-(char*)o->ptr) != sdslen(o->ptr) ||
value = strtold(ptrFromObj(o), &eptr);
if (sdslen(ptrFromObj(o)) == 0 ||
isspace(((const char*)ptrFromObj(o))[0]) ||
(size_t)(eptr-(char*)ptrFromObj(o)) != sdslen(ptrFromObj(o)) ||
(errno == ERANGE &&
(value == HUGE_VAL || value == -HUGE_VAL || value == 0)) ||
isnan(value))
return C_ERR;
} else if (o->encoding == OBJ_ENCODING_INT) {
value = (long)o->ptr;
value = (long)ptrFromObj(o);
} else {
serverPanic("Unknown string encoding");
}
@ -683,9 +682,9 @@ int getLongLongFromObject(robj *o, long long *target) {
} else {
serverAssertWithInfo(NULL,o,o->type == OBJ_STRING);
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) {
value = (long)o->ptr;
value = (long)ptrFromObj(o);
} else {
serverPanic("Unknown string encoding");
}
@ -780,15 +779,15 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
if(o->encoding == OBJ_ENCODING_INT) {
asize = sizeof(*o);
} 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) {
asize = sdslen(o->ptr)+2+sizeof(*o);
asize = sdslen(ptrFromObj(o))+2+sizeof(*o);
} else {
serverPanic("Unknown string encoding");
}
} else if (o->type == OBJ_LIST) {
if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklist *ql = o->ptr;
quicklist *ql = ptrFromObj(o);
quicklistNode *node = ql->head;
asize = sizeof(*o)+sizeof(quicklist);
do {
@ -797,13 +796,13 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
} while ((node = node->next) && samples < sample_size);
asize += (double)elesize/samples*ql->len;
} else if (o->encoding == OBJ_ENCODING_ZIPLIST) {
asize = sizeof(*o)+ziplistBlobLen(o->ptr);
asize = sizeof(*o)+ziplistBlobLen(ptrFromObj(o));
} else {
serverPanic("Unknown list encoding");
}
} else if (o->type == OBJ_SET) {
if (o->encoding == OBJ_ENCODING_HT) {
d = o->ptr;
d = ptrFromObj(o);
di = dictGetIterator(d);
asize = sizeof(*o)+sizeof(dict)+(sizeof(struct dictEntry*)*dictSlots(d));
while((de = dictNext(di)) != NULL && samples < sample_size) {
@ -814,17 +813,17 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
dictReleaseIterator(di);
if (samples) asize += (double)elesize/samples*dictSize(d);
} else if (o->encoding == OBJ_ENCODING_INTSET) {
intset *is = o->ptr;
intset *is = ptrFromObj(o);
asize = sizeof(*o)+sizeof(*is)+is->encoding*is->length;
} else {
serverPanic("Unknown set encoding");
}
} else if (o->type == OBJ_ZSET) {
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) {
d = ((zset*)o->ptr)->pdict;
zskiplist *zsl = ((zset*)o->ptr)->zsl;
d = ((zset*)ptrFromObj(o))->pdict;
zskiplist *zsl = ((zset*)ptrFromObj(o))->zsl;
zskiplistNode *znode = zsl->header->level[0].forward;
asize = sizeof(*o)+sizeof(zset)+(sizeof(struct dictEntry*)*dictSlots(d));
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) {
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) {
d = o->ptr;
d = ptrFromObj(o);
di = dictGetIterator(d);
asize = sizeof(*o)+sizeof(dict)+(sizeof(struct dictEntry*)*dictSlots(d));
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");
}
} else if (o->type == OBJ_STREAM) {
stream *s = o->ptr;
stream *s = ptrFromObj(o);
asize = sizeof(*o);
asize += streamRadixTreeMemoryUsage(s->prax);
@ -918,7 +917,7 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
raxStop(&ri);
}
} else if (o->type == OBJ_MODULE) {
moduleValue *mv = o->ptr;
moduleValue *mv = ptrFromObj(o);
moduleType *mt = mv->type;
if (mt->mem_usage != NULL) {
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) {
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);
}
@ -1238,7 +1237,7 @@ robj *objectCommandLookupOrReply(client *c, robj *key, robj *reply) {
void objectCommand(client *c) {
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[] = {
"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.",
@ -1247,15 +1246,15 @@ void objectCommand(client *c) {
NULL
};
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]))
== NULL) return;
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]))
== NULL) return;
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]))
== NULL) return;
if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) {
@ -1263,7 +1262,7 @@ NULL
return;
}
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]))
== NULL) return;
if (!(server.maxmemory_policy & MAXMEMORY_FLAG_LFU)) {
@ -1285,7 +1284,7 @@ NULL
*
* Usage: MEMORY usage <key> */
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[] = {
"DOCTOR - Return memory problems reports.",
"MALLOC-STATS -- Return internal statistics report from the memory allocator.",
@ -1295,11 +1294,11 @@ void memoryCommand(client *c) {
NULL
};
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;
long long samples = OBJ_COMPUTE_SIZE_DEF_SAMPLES;
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)
{
if (getLongLongFromObjectOrReply(c,c->argv[j+1],&samples,NULL)
@ -1315,7 +1314,7 @@ NULL
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);
return;
}
@ -1323,7 +1322,7 @@ NULL
usage += sdsAllocSize(dictGetKey(de));
usage += sizeof(dictEntry);
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();
addReplyMapLen(c,25+mh->num_dbs);
@ -1417,7 +1416,7 @@ NULL
addReplyLongLong(c,mh->total_frag_bytes);
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)
sds info = sdsempty();
je_malloc_stats_print(inputCatSds, &info, NULL);
@ -1425,10 +1424,10 @@ NULL
#else
addReplyBulkCString(c,"Stats not supported for the current allocator");
#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();
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)
char tmp[32];
unsigned narenas = 0;
@ -1446,6 +1445,6 @@ NULL
/* Nothing to do for other allocators. */
#endif
} 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) {
pubsubPattern *pat = ln->value;
if (stringmatchlen((char*)pat->pattern->ptr,
sdslen(pat->pattern->ptr),
(char*)channel->ptr,
sdslen(channel->ptr),0))
if (stringmatchlen((char*)ptrFromObj(pat->pattern),
sdslen(ptrFromObj(pat->pattern)),
(char*)ptrFromObj(channel),
sdslen(ptrFromObj(channel)),0))
{
addReplyPubsubPatMessage(pat->pclient,
pat->pattern,channel,message);
@ -374,7 +374,7 @@ void publishCommand(client *c) {
/* PUBSUB command for Pub/Sub introspection. */
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[] = {
"CHANNELS [<pattern>] -- Return the currently active channels matching a pattern (default: all).",
"NUMPAT -- Return number of subscriptions to patterns.",
@ -382,11 +382,11 @@ void pubsubCommand(client *c) {
NULL
};
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))
{
/* 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);
dictEntry *de;
long mblen = 0;
@ -395,7 +395,7 @@ NULL
replylen = addReplyDeferredLen(c);
while((de = dictNext(di)) != NULL) {
robj *cobj = dictGetKey(de);
sds channel = cobj->ptr;
sds channel = ptrFromObj(cobj);
if (!pat || stringmatchlen(pat, sdslen(pat),
channel, sdslen(channel),0))
@ -406,7 +406,7 @@ NULL
}
dictReleaseIterator(di);
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] */
int j;
@ -417,7 +417,7 @@ NULL
addReplyBulk(c,c->argv[j]);
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 */
addReplyLongLong(c,listLength(server.pubsub_patterns));
} 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
* object is already integer encoded. */
if (obj->encoding == OBJ_ENCODING_INT) {
return rdbSaveLongLongAsStringObject(rdb,(long)obj->ptr);
return rdbSaveLongLongAsStringObject(rdb,(long)ptrFromObj(obj));
} else {
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
* encode it in a special way to be more memory
* 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()
* instead of a Redis object with an sds in it.
* 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 {
robj *o = encode ? createStringObject(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);
return NULL;
}
@ -762,7 +762,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} else if (o->type == OBJ_LIST) {
/* Save a list value */
if (o->encoding == OBJ_ENCODING_QUICKLIST) {
quicklist *ql = o->ptr;
quicklist *ql = ptrFromObj(o);
quicklistNode *node = ql->head;
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) {
/* Save a set value */
if (o->encoding == OBJ_ENCODING_HT) {
dict *set = o->ptr;
dict *set = ptrFromObj(o);
dictIterator *di = dictGetIterator(set);
dictEntry *de;
@ -808,9 +808,9 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
}
dictReleaseIterator(di);
} 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;
} else {
serverPanic("Unknown set encoding");
@ -818,12 +818,12 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} else if (o->type == OBJ_ZSET) {
/* Save a sorted set value */
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;
} else if (o->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = o->ptr;
zset *zs = ptrFromObj(o);
zskiplist *zsl = zs->zsl;
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) {
/* Save a hash value */
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;
} else if (o->encoding == OBJ_ENCODING_HT) {
dictIterator *di = dictGetIterator(o->ptr);
dictIterator *di = dictGetIterator(ptrFromObj(o));
dictEntry *de;
if ((n = rdbSaveLen(rdb,dictSize((dict*)o->ptr))) == -1) {
if ((n = rdbSaveLen(rdb,dictSize((dict*)ptrFromObj(o)))) == -1) {
dictReleaseIterator(di);
return -1;
}
@ -894,7 +894,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
}
} else if (o->type == OBJ_STREAM) {
/* Store how many listpacks we have inside the radix tree. */
stream *s = o->ptr;
stream *s = ptrFromObj(o);
rax *rax = s->prax;
if ((n = rdbSaveLen(rdb,raxSize(rax))) == -1) return -1;
nwritten += n;
@ -965,7 +965,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
} else if (o->type == OBJ_MODULE) {
/* Save a module-specific value. */
RedisModuleIO io;
moduleValue *mv = o->ptr;
moduleValue *mv = ptrFromObj(o);
moduleType *mt = mv->type;
moduleInitIOContext(io,mt,rdb);
@ -1167,7 +1167,7 @@ int rdbSaveRio(rio *rdb, int *error, int flags, rdbSaveInfo *rsi) {
di = dictGetIterator(server.lua_scripts);
while((de = dictNext(di)) != NULL) {
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;
}
dictReleaseIterator(di);
@ -1415,15 +1415,15 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
if ((len = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL;
o = createQuicklistObject();
quicklistSetOptions(o->ptr, server.list_max_ziplist_size,
quicklistSetOptions(ptrFromObj(o), server.list_max_ziplist_size,
server.list_compress_depth);
/* Load every single element of the list */
while(len--) {
if ((ele = rdbLoadEncodedStringObject(rdb)) == NULL) return NULL;
dec = getDecodedObject(ele);
size_t len = sdslen(dec->ptr);
quicklistPushTail(o->ptr, dec->ptr, len);
size_t len = sdslen(ptrFromObj(dec));
quicklistPushTail(ptrFromObj(o), ptrFromObj(dec), len);
decrRefCount(dec);
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
* to avoid rehashing */
if (len > DICT_HT_INITIAL_SIZE)
dictExpand(o->ptr,len);
dictExpand(ptrFromObj(o),len);
} else {
o = createIntsetObject();
}
@ -1453,17 +1453,17 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
if (o->encoding == OBJ_ENCODING_INTSET) {
/* Fetch integer value from element. */
if (isSdsRepresentableAsLongLong(sdsele,&llval) == C_OK) {
o->ptr = intsetAdd(o->ptr,llval,NULL);
o->m_ptr = intsetAdd(ptrFromObj(o),llval,NULL);
} else {
setTypeConvert(o,OBJ_ENCODING_HT);
dictExpand(o->ptr,len);
dictExpand(ptrFromObj(o),len);
}
}
/* This will also be called when the set was just converted
* to a regular hash table encoded set. */
if (o->encoding == OBJ_ENCODING_HT) {
dictAdd((dict*)o->ptr,sdsele,NULL);
dictAdd((dict*)ptrFromObj(o),sdsele,NULL);
} else {
sdsfree(sdsele);
}
@ -1476,7 +1476,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
if ((zsetlen = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL;
o = createZsetObject();
zs = o->ptr;
zs = ptrFromObj(o);
if (zsetlen > DICT_HT_INITIAL_SIZE)
dictExpand(zs->pdict,zsetlen);
@ -1531,9 +1531,9 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
== NULL) return NULL;
/* 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);
o->ptr = ziplistPush(o->ptr, (unsigned char*)value,
o->m_ptr = ziplistPush(ptrFromObj(o), (unsigned char*)value,
sdslen(value), ZIPLIST_TAIL);
/* 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)
dictExpand(o->ptr,len);
dictExpand(ptrFromObj(o),len);
/* Load remaining fields and values into the hash table */
while (o->encoding == OBJ_ENCODING_HT && len > 0) {
@ -1562,7 +1562,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
== NULL) return NULL;
/* Add pair to hash table */
ret = dictAdd((dict*)o->ptr, field, value);
ret = dictAdd((dict*)ptrFromObj(o), field, value);
if (ret == DICT_ERR) {
rdbExitReportCorruptRDB("Duplicate keys detected");
}
@ -1573,14 +1573,14 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
} else if (rdbtype == RDB_TYPE_LIST_QUICKLIST) {
if ((len = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL;
o = createQuicklistObject();
quicklistSetOptions(o->ptr, server.list_max_ziplist_size,
quicklistSetOptions(ptrFromObj(o), server.list_max_ziplist_size,
server.list_compress_depth);
while (len--) {
unsigned char *zl =
rdbGenericLoadStringObject(rdb,RDB_LOAD_PLAIN,NULL);
if (zl == NULL) return NULL;
quicklistAppendZiplist(o->ptr, zl);
quicklistAppendZiplist(ptrFromObj(o), zl);
}
} else if (rdbtype == RDB_TYPE_HASH_ZIPMAP ||
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. */
{
unsigned char *zl = ziplistNew();
unsigned char *zi = zipmapRewind(o->ptr);
unsigned char *zi = zipmapRewind(ptrFromObj(o));
unsigned char *fstr, *vstr;
unsigned int flen, vlen;
unsigned int maxlen = 0;
@ -1617,8 +1617,8 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
zl = ziplistPush(zl, vstr, vlen, ZIPLIST_TAIL);
}
zfree(o->ptr);
o->ptr = zl;
zfree(ptrFromObj(o));
o->m_ptr = zl;
o->type = OBJ_HASH;
o->encoding = OBJ_ENCODING_ZIPLIST;
@ -1637,7 +1637,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
case RDB_TYPE_SET_INTSET:
o->type = OBJ_SET;
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);
break;
case RDB_TYPE_ZSET_ZIPLIST:
@ -1658,7 +1658,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
}
} else if (rdbtype == RDB_TYPE_STREAM_LISTPACKS) {
o = createStreamObject();
stream *s = o->ptr;
stream *s = ptrFromObj(o);
uint64_t listpacks = rdbLoadLen(rdb,NULL);
while(listpacks--) {
@ -1961,34 +1961,34 @@ int rdbLoadRio(rio *rdb, rdbSaveInfo *rsi, int loading_aof) {
if ((auxkey = 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
* information fields and are logged at startup with a log
* level of NOTICE. */
serverLog(LL_NOTICE,"RDB '%s': %s",
(char*)auxkey->ptr,
(char*)auxval->ptr);
} else if (!strcasecmp(auxkey->ptr,"repl-stream-db")) {
if (rsi) rsi->repl_stream_db = atoi(auxval->ptr);
} else if (!strcasecmp(auxkey->ptr,"repl-id")) {
if (rsi && sdslen(auxval->ptr) == CONFIG_RUN_ID_SIZE) {
memcpy(rsi->repl_id,auxval->ptr,CONFIG_RUN_ID_SIZE+1);
(char*)ptrFromObj(auxkey),
(char*)ptrFromObj(auxval));
} else if (!strcasecmp(ptrFromObj(auxkey),"repl-stream-db")) {
if (rsi) rsi->repl_stream_db = atoi(ptrFromObj(auxval));
} else if (!strcasecmp(ptrFromObj(auxkey),"repl-id")) {
if (rsi && sdslen(ptrFromObj(auxval)) == CONFIG_RUN_ID_SIZE) {
memcpy(rsi->repl_id,ptrFromObj(auxval),CONFIG_RUN_ID_SIZE+1);
rsi->repl_id_is_set = 1;
}
} else if (!strcasecmp(auxkey->ptr,"repl-offset")) {
if (rsi) rsi->repl_offset = strtoll(auxval->ptr,NULL,10);
} else if (!strcasecmp(auxkey->ptr,"lua")) {
} else if (!strcasecmp(ptrFromObj(auxkey),"repl-offset")) {
if (rsi) rsi->repl_offset = strtoll(ptrFromObj(auxval),NULL,10);
} else if (!strcasecmp(ptrFromObj(auxkey),"lua")) {
/* Load the script back in memory. */
if (luaCreateFunction(NULL,server.lua,auxval) == NULL) {
rdbExitReportCorruptRDB(
"Can't load Lua script from RDB file! "
"BODY: %s", auxval->ptr);
"BODY: %s", ptrFromObj(auxval));
}
} else {
/* We ignore fields we don't understand, as by AUX field
* contract. */
serverLog(LL_DEBUG,"Unrecognized RDB AUX field: '%s'",
(char*)auxkey->ptr);
(char*)ptrFromObj(auxkey));
}
decrRefCount(auxkey);
@ -2438,7 +2438,7 @@ void bgsaveCommand(client *c) {
/* The SCHEDULE option changes the behavior of BGSAVE when an AOF rewrite
* is in progress. Instead of returning an error a BGSAVE gets scheduled. */
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;
} else {
addReply(c,shared.syntaxerr);

View File

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

View File

@ -156,11 +156,11 @@ void feedReplicationBacklogWithObject(robj *o) {
size_t len;
if (o->encoding == OBJ_ENCODING_INT) {
len = ll2string(llstr,sizeof(llstr),(long)o->ptr);
len = ll2string(llstr,sizeof(llstr),(long)ptrFromObj(o));
p = llstr;
} else {
len = sdslen(o->ptr);
p = o->ptr;
len = sdslen(ptrFromObj(o));
p = ptrFromObj(o);
}
feedReplicationBacklog(p,len);
}
@ -320,10 +320,10 @@ void replicationFeedMonitors(client *c, list *monitors, int dictid, robj **argv,
for (j = 0; j < argc; j++) {
if (argv[j]->encoding == OBJ_ENCODING_INT) {
cmdrepr = sdscatprintf(cmdrepr, "\"%ld\"", (long)argv[j]->ptr);
cmdrepr = sdscatprintf(cmdrepr, "\"%ld\"", (long)ptrFromObj(argv[j]));
} else {
cmdrepr = sdscatrepr(cmdrepr,(char*)argv[j]->ptr,
sdslen(argv[j]->ptr));
cmdrepr = sdscatrepr(cmdrepr,(char*)ptrFromObj(argv[j]),
sdslen(ptrFromObj(argv[j])));
}
if (j != argc-1)
cmdrepr = sdscatlen(cmdrepr," ",1);
@ -446,7 +446,7 @@ int replicationSetupSlaveForFullResync(client *slave, long long offset) {
* with the usual full resync. */
int masterTryPartialResynchronization(client *c) {
long long psync_offset, psync_len;
char *master_replid = c->argv[1]->ptr;
char *master_replid = ptrFromObj(c->argv[1]);
char buf[128];
int buflen;
@ -656,12 +656,12 @@ void syncCommand(client *c) {
*
* So the slave knows the new replid and offset to try a PSYNC later
* 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) {
server.stat_sync_partial_ok++;
return; /* No full resync needed, return. */
} else {
char *master_replid = c->argv[1]->ptr;
char *master_replid = ptrFromObj(c->argv[1]);
/* Increment stats for failed PSYNCs, but only if the
* 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. */
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;
if ((getLongFromObjectOrReply(c,c->argv[j+1],
&port,NULL) != C_OK))
return;
c->slave_listening_port = port;
} else if (!strcasecmp(c->argv[j]->ptr,"ip-address")) {
sds ip = c->argv[j+1]->ptr;
} else if (!strcasecmp(ptrFromObj(c->argv[j]),"ip-address")) {
sds ip = ptrFromObj(c->argv[j+1]);
if (sdslen(ip) < sizeof(c->slave_ip)) {
memcpy(c->slave_ip,ip,sdslen(ip)+1);
} else {
@ -801,13 +801,13 @@ void replconfCommand(client *c) {
"replica instance is too long: %zd bytes", sdslen(ip));
return;
}
} else if (!strcasecmp(c->argv[j]->ptr,"capa")) {
} else if (!strcasecmp(ptrFromObj(c->argv[j]),"capa")) {
/* 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;
else if (!strcasecmp(c->argv[j+1]->ptr,"psync2"))
else if (!strcasecmp(ptrFromObj(c->argv[j+1]),"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
* of replication stream that it processed so far. It is an
* internal only command that normal clients should never use. */
@ -826,14 +826,14 @@ void replconfCommand(client *c) {
putSlaveOnline(c);
/* Note: this command does not reply anything! */
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
* to the slave. */
if (server.masterhost && server.master) replicationSendAck();
return;
} else {
addReplyErrorFormat(c,"Unrecognized REPLCONF option: %s",
(char*)c->argv[j]->ptr);
(char*)ptrFromObj(c->argv[j]));
return;
}
}
@ -2020,8 +2020,8 @@ void replicaofCommand(client *c) {
/* The special host/port combination "NO" "ONE" turns the instance
* into a master. Otherwise the new master address is set. */
if (!strcasecmp(c->argv[1]->ptr,"no") &&
!strcasecmp(c->argv[2]->ptr,"one")) {
if (!strcasecmp(ptrFromObj(c->argv[1]),"no") &&
!strcasecmp(ptrFromObj(c->argv[2]),"one")) {
if (server.masterhost) {
replicationUnsetMaster();
sds client = catClientInfoString(sdsempty(),c);
@ -2036,7 +2036,7 @@ void replicaofCommand(client *c) {
return;
/* 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) {
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"));
@ -2044,7 +2044,7 @@ void replicaofCommand(client *c) {
}
/* There was no previous master or the user specified a different one,
* we can continue. */
replicationSetMaster(c->argv[1]->ptr, port);
replicationSetMaster(ptrFromObj(c->argv[1]), port);
sds client = catClientInfoString(sdsempty(),c);
serverLog(LL_NOTICE,"REPLICAOF %s:%d enabled (user request from '%s')",
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] &&
cached_objects_len[j] >= obj_len)
{
sds s = cached_objects[j]->ptr;
sds s = ptrFromObj(cached_objects[j]);
argv[j] = cached_objects[j];
cached_objects[j] = NULL;
memcpy(s,obj_s,obj_len+1);
@ -472,14 +472,14 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
break;
} else {
cmdlog = sdscatlen(cmdlog," ",1);
cmdlog = sdscatsds(cmdlog,c->argv[j]->ptr);
cmdlog = sdscatsds(cmdlog,ptrFromObj(c->argv[j]));
}
}
ldbLog(cmdlog);
}
/* Command lookup */
cmd = lookupCommand(argv[0]->ptr);
cmd = lookupCommand(ptrFromObj(argv[0]));
if (!cmd || ((cmd->arity > 0 && cmd->arity != argc) ||
(argc < -cmd->arity)))
{
@ -524,11 +524,11 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
!server.loading &&
!(server.lua_caller->flags & CLIENT_MASTER))
{
luaPushError(lua, shared.roslaveerr->ptr);
luaPushError(lua, ptrFromObj(shared.roslaveerr));
goto cleanup;
} else if (deny_write_type != DISK_ERROR_TYPE_NONE) {
if (deny_write_type == DISK_ERROR_TYPE_RDB) {
luaPushError(lua, shared.bgsaveerr->ptr);
luaPushError(lua, ptrFromObj(shared.bgsaveerr));
} else {
sds aof_write_err = sdscatfmt(sdsempty(),
"-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))
{
if (getMaxmemoryState(NULL,NULL,NULL,NULL) != C_OK) {
luaPushError(lua, shared.oomerr->ptr);
luaPushError(lua, ptrFromObj(shared.oomerr));
goto cleanup;
}
}
@ -652,9 +652,9 @@ cleanup:
o->refcount == 1 &&
(o->encoding == OBJ_ENCODING_RAW ||
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]);
cached_objects[j] = o;
cached_objects_len[j] = sdsalloc(s);
@ -1136,7 +1136,7 @@ void luaSetGlobalArray(lua_State *lua, char *var, robj **elev, int elec) {
lua_newtable(lua);
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_setglobal(lua,var);
@ -1212,7 +1212,7 @@ sds luaCreateFunction(client *c, lua_State *lua, robj *body) {
funcname[0] = 'f';
funcname[1] = '_';
sha1hex(funcname+2,body->ptr,sdslen(body->ptr));
sha1hex(funcname+2,ptrFromObj(body),sdslen(ptrFromObj(body)));
sds sha = sdsnewlen(funcname+2,40);
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 = sdscatlen(funcdef,funcname,42);
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);
if (luaL_loadbuffer(lua,funcdef,sdslen(funcdef),"@user_script")) {
@ -1328,11 +1328,11 @@ void evalGenericCommand(client *c, int evalsha) {
funcname[1] = '_';
if (!evalsha) {
/* 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 {
/* We already have the SHA if it is a EVALSHA */
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
* 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
* for AOF we need to do so every time we rewrite the AOF file. */
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
* EVAL, then add it into the script cache, as from now on
* 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);
/* 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) {
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
* not the right length. So we return an error ASAP, this way
* evalGenericCommand() can be implemented without string length
@ -1517,7 +1517,7 @@ void evalShaCommand(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[] = {
"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.",
@ -1527,27 +1527,27 @@ void scriptCommand(client *c) {
NULL
};
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();
addReply(c,shared.ok);
replicationScriptCacheFlush();
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;
addReplyArrayLen(c, c->argc-2);
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);
else
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]);
if (sha == NULL) return; /* The error was sent by luaCreateFunction(). */
addReplyBulkCBuffer(c,sha,40);
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) {
addReplySds(c,sdsnew("-NOTBUSY No scripts in execution right now.\r\n"));
} else if (server.lua_caller->flags & CLIENT_MASTER) {
@ -1558,18 +1558,18 @@ NULL
server.lua_kill = 1;
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)) {
addReplyError(c,"SCRIPT DEBUG must be called outside a pipeline");
return;
}
if (!strcasecmp(c->argv[2]->ptr,"no")) {
if (!strcasecmp(ptrFromObj(c->argv[2]),"no")) {
ldbDisable(c);
addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[2]->ptr,"yes")) {
} else if (!strcasecmp(ptrFromObj(c->argv[2]),"yes")) {
ldbEnable(c);
addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[2]->ptr,"sync")) {
} else if (!strcasecmp(ptrFromObj(c->argv[2]),"sync")) {
ldbEnable(c);
addReply(c,shared.ok);
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
* 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);
while(srclen && (srcstring[srclen-1] == '\n' ||
srcstring[srclen-1] == '\r'))

View File

@ -2950,7 +2950,7 @@ sentinelRedisInstance *sentinelGetMasterByNameOrReplyError(client *c,
{
sentinelRedisInstance *ri;
ri = dictFetchValue(sentinel.masters,name->ptr);
ri = dictFetchValue(sentinel.masters,ptrFromObj(name));
if (!ri) {
addReplyError(c,"No such master with that name");
return NULL;
@ -2984,11 +2984,11 @@ int sentinelIsQuorumReachable(sentinelRedisInstance *master, int *usableptr) {
}
void sentinelCommand(client *c) {
if (!strcasecmp(c->argv[1]->ptr,"masters")) {
if (!strcasecmp(ptrFromObj(c->argv[1]),"masters")) {
/* SENTINEL MASTERS */
if (c->argc != 2) goto numargserr;
addReplyDictOfRedisInstances(c,sentinel.masters);
} else if (!strcasecmp(c->argv[1]->ptr,"master")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"master")) {
/* SENTINEL MASTER <name> */
sentinelRedisInstance *ri;
@ -2996,8 +2996,8 @@ void sentinelCommand(client *c) {
if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2]))
== NULL) return;
addReplySentinelRedisInstance(c,ri);
} else if (!strcasecmp(c->argv[1]->ptr,"slaves") ||
!strcasecmp(c->argv[1]->ptr,"replicas"))
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"slaves") ||
!strcasecmp(ptrFromObj(c->argv[1]),"replicas"))
{
/* SENTINEL REPLICAS <master-name> */
sentinelRedisInstance *ri;
@ -3006,7 +3006,7 @@ void sentinelCommand(client *c) {
if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) == NULL)
return;
addReplyDictOfRedisInstances(c,ri->slaves);
} else if (!strcasecmp(c->argv[1]->ptr,"sentinels")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"sentinels")) {
/* SENTINEL SENTINELS <master-name> */
sentinelRedisInstance *ri;
@ -3014,7 +3014,7 @@ void sentinelCommand(client *c) {
if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2])) == NULL)
return;
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>
*
* Arguments:
@ -3045,7 +3045,7 @@ void sentinelCommand(client *c) {
!= C_OK)
return;
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.
* 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
* 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,
c->argv[5]->ptr,
ptrFromObj(c->argv[5]),
&leader_epoch);
}
@ -3068,16 +3068,16 @@ void sentinelCommand(client *c) {
addReplyBulkCString(c, leader ? leader : "*");
addReplyLongLong(c, (long long)leader_epoch);
if (leader) sdsfree(leader);
} else if (!strcasecmp(c->argv[1]->ptr,"reset")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"reset")) {
/* SENTINEL RESET <pattern> */
if (c->argc != 3) goto numargserr;
addReplyLongLong(c,sentinelResetMastersByPattern(c->argv[2]->ptr,SENTINEL_GENERATE_EVENT));
} else if (!strcasecmp(c->argv[1]->ptr,"get-master-addr-by-name")) {
addReplyLongLong(c,sentinelResetMastersByPattern(ptrFromObj(c->argv[2]),SENTINEL_GENERATE_EVENT));
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"get-master-addr-by-name")) {
/* SENTINEL GET-MASTER-ADDR-BY-NAME <master-name> */
sentinelRedisInstance *ri;
if (c->argc != 3) goto numargserr;
ri = sentinelGetMasterByName(c->argv[2]->ptr);
ri = sentinelGetMasterByName(ptrFromObj(c->argv[2]));
if (ri == NULL) {
addReplyNullArray(c);
} else {
@ -3087,7 +3087,7 @@ void sentinelCommand(client *c) {
addReplyBulkCString(c,addr->ip);
addReplyBulkLongLong(c,addr->port);
}
} else if (!strcasecmp(c->argv[1]->ptr,"failover")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"failover")) {
/* SENTINEL FAILOVER <master-name> */
sentinelRedisInstance *ri;
@ -3107,12 +3107,12 @@ void sentinelCommand(client *c) {
sentinelStartFailover(ri);
ri->flags |= SRI_FORCE_FAILOVER;
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 */
if (c->argc != 2) goto numargserr;
sentinelPendingScriptsCommand(c);
} else if (!strcasecmp(c->argv[1]->ptr,"monitor")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"monitor")) {
/* SENTINEL MONITOR <name> <ip> <port> <quorum> */
sentinelRedisInstance *ri;
long quorum, port;
@ -3132,14 +3132,14 @@ void sentinelCommand(client *c) {
/* Make sure the IP field is actually a valid IP before passing it
* to createSentinelRedisInstance(), otherwise we may trigger a
* 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");
return;
}
/* Parameters are valid. Try to create the master instance. */
ri = createSentinelRedisInstance(c->argv[2]->ptr,SRI_MASTER,
c->argv[3]->ptr,port,quorum,NULL);
ri = createSentinelRedisInstance(ptrFromObj(c->argv[2]),SRI_MASTER,
ptrFromObj(c->argv[3]),port,quorum,NULL);
if (ri == NULL) {
switch(errno) {
case EBUSY:
@ -3157,12 +3157,12 @@ void sentinelCommand(client *c) {
sentinelEvent(LL_WARNING,"+monitor",ri,"%@ quorum %d",ri->quorum);
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;
sentinelFlushConfig();
addReply(c,shared.ok);
return;
} else if (!strcasecmp(c->argv[1]->ptr,"remove")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"remove")) {
/* SENTINEL REMOVE <name> */
sentinelRedisInstance *ri;
@ -3170,10 +3170,10 @@ void sentinelCommand(client *c) {
if ((ri = sentinelGetMasterByNameOrReplyError(c,c->argv[2]))
== NULL) return;
sentinelEvent(LL_WARNING,"-monitor",ri,"%@");
dictDelete(sentinel.masters,c->argv[2]->ptr);
dictDelete(sentinel.masters,ptrFromObj(c->argv[2]));
sentinelFlushConfig();
addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"ckquorum")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"ckquorum")) {
/* SENTINEL CKQUORUM <name> */
sentinelRedisInstance *ri;
int usable;
@ -3200,10 +3200,10 @@ void sentinelCommand(client *c) {
e = sdscat(e,"\r\n");
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;
sentinelSetCommand(c);
} else if (!strcasecmp(c->argv[1]->ptr,"info-cache")) {
} else if (!strcasecmp(ptrFromObj(c->argv[1]),"info-cache")) {
/* SENTINEL INFO-CACHE <name> */
if (c->argc < 2) goto numargserr;
mstime_t now = mstime();
@ -3219,7 +3219,7 @@ void sentinelCommand(client *c) {
for (int i = 2; i < c->argc; i++) {
sentinelRedisInstance *ri;
ri = sentinelGetMasterByName(c->argv[i]->ptr);
ri = sentinelGetMasterByName(ptrFromObj(c->argv[i]));
if (!ri) continue; /* ignore non-existing names */
dictAdd(masters_local, ri->name, ri);
}
@ -3265,24 +3265,24 @@ void sentinelCommand(client *c) {
}
dictReleaseIterator(di);
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> */
int j;
sentinel.simfailure_flags = SENTINEL_SIMFAILURE_NONE;
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_CRASH_AFTER_ELECTION;
serverLog(LL_WARNING,"Failure simulation: this Sentinel "
"will crash after being successfully elected as failover "
"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_CRASH_AFTER_PROMOTION;
serverLog(LL_WARNING,"Failure simulation: this Sentinel "
"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);
addReplyBulkCString(c,"crash-after-election");
addReplyBulkCString(c,"crash-after-promotion");
@ -3294,13 +3294,13 @@ void sentinelCommand(client *c) {
addReply(c,shared.ok);
} else {
addReplyErrorFormat(c,"Unknown sentinel subcommand '%s'",
(char*)c->argv[1]->ptr);
(char*)ptrFromObj(c->argv[1]));
}
return;
numargserr:
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 { \
@ -3321,7 +3321,7 @@ void sentinelInfoCommand(client *c) {
}
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) {
allsections = !strcasecmp(section,"all");
defsections = !strcasecmp(section,"default");
@ -3409,7 +3409,7 @@ void sentinelSetCommand(client *c) {
/* Process option - value pairs. */
for (j = 3; j < c->argc; j++) {
int moreargs = (c->argc-1) - j;
option = c->argv[j]->ptr;
option = ptrFromObj(c->argv[j]);
long long ll;
int old_j = j; /* Used to know what to log as an event. */
@ -3443,7 +3443,7 @@ void sentinelSetCommand(client *c) {
changes++;
} else if (!strcasecmp(option,"notification-script") && moreargs > 0) {
/* notification-script <path> */
char *value = c->argv[++j]->ptr;
char *value = ptrFromObj(c->argv[++j]);
if (sentinel.deny_scripts_reconfig) {
addReplyError(c,
"Reconfiguration of scripts path is denied for "
@ -3463,7 +3463,7 @@ void sentinelSetCommand(client *c) {
changes++;
} else if (!strcasecmp(option,"client-reconfig-script") && moreargs > 0) {
/* client-reconfig-script <path> */
char *value = c->argv[++j]->ptr;
char *value = ptrFromObj(c->argv[++j]);
if (sentinel.deny_scripts_reconfig) {
addReplyError(c,
"Reconfiguration of scripts path is denied for "
@ -3484,7 +3484,7 @@ void sentinelSetCommand(client *c) {
changes++;
} else if (!strcasecmp(option,"auth-pass") && moreargs > 0) {
/* auth-pass <password> */
char *value = c->argv[++j]->ptr;
char *value = ptrFromObj(c->argv[++j]);
sdsfree(ri->auth_pass);
ri->auth_pass = strlen(value) ? sdsnew(value) : NULL;
changes++;
@ -3499,8 +3499,8 @@ void sentinelSetCommand(client *c) {
changes++;
} else if (!strcasecmp(option,"rename-command") && moreargs > 1) {
/* rename-command <oldname> <newname> */
sds oldname = c->argv[++j]->ptr;
sds newname = c->argv[++j]->ptr;
sds oldname = ptrFromObj(c->argv[++j]);
sds newname = ptrFromObj(c->argv[++j]);
if ((sdslen(oldname) == 0) || (sdslen(newname) == 0)) {
badarg = sdslen(newname) ? j-1 : j;
@ -3529,16 +3529,16 @@ void sentinelSetCommand(client *c) {
int numargs = j-old_j+1;
switch(numargs) {
case 2:
sentinelEvent(LL_WARNING,"+set",ri,"%@ %s %s",c->argv[old_j]->ptr,
c->argv[old_j+1]->ptr);
sentinelEvent(LL_WARNING,"+set",ri,"%@ %s %s",ptrFromObj(c->argv[old_j]),
ptrFromObj(c->argv[old_j+1]));
break;
case 3:
sentinelEvent(LL_WARNING,"+set",ri,"%@ %s %s %s",c->argv[old_j]->ptr,
c->argv[old_j+1]->ptr,
c->argv[old_j+2]->ptr);
sentinelEvent(LL_WARNING,"+set",ri,"%@ %s %s %s",ptrFromObj(c->argv[old_j]),
ptrFromObj(c->argv[old_j+1]),
ptrFromObj(c->argv[old_j+2]));
break;
default:
sentinelEvent(LL_WARNING,"+set",ri,"%@ %s",c->argv[old_j]->ptr);
sentinelEvent(LL_WARNING,"+set",ri,"%@ %s",ptrFromObj(c->argv[old_j]));
break;
}
}
@ -3550,7 +3550,7 @@ void sentinelSetCommand(client *c) {
badfmt: /* Bad format errors */
if (changes) sentinelFlushConfig();
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
@ -3560,11 +3560,11 @@ badfmt: /* Bad format errors */
* 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. */
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.");
return;
}
sentinelProcessHelloMessage(c->argv[2]->ptr,sdslen(c->argv[2]->ptr));
sentinelProcessHelloMessage(ptrFromObj(c->argv[2]),sdslen(ptrFromObj(c->argv[2])));
addReplyLongLong(c,1);
}

View File

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

View File

@ -633,9 +633,16 @@ typedef struct redisObject {
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;
void *ptr;
void *m_ptr;
} 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.
* 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
@ -644,7 +651,7 @@ typedef struct redisObject {
_var.refcount = 1; \
_var.type = OBJ_STRING; \
_var.encoding = OBJ_ENCODING_RAW; \
_var.ptr = _ptr; \
_var.m_ptr = _ptr; \
} while(0)
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... */
if (argv[j]->type == OBJ_STRING &&
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)",
(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);
} else if (argv[j]->refcount == OBJ_SHARED_REFCOUNT) {
se->argv[j] = argv[j];
@ -89,7 +89,7 @@ slowlogEntry *slowlogCreateEntry(client *c, robj **argv, int argc, long long dur
se->duration = duration;
se->id = server.slowlog_entry_id++;
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;
}
@ -140,7 +140,7 @@ void slowlogReset(void) {
/* The SLOWLOG command. Implements all the subcommands needed to handle the
* Redis slow log. */
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[] = {
"GET [count] -- Return top entries from the slowlog (default: 10)."
" Entries are made of:",
@ -150,13 +150,13 @@ void slowlogCommand(client *c) {
NULL
};
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();
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));
} 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;
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
* to implement the "SORT ... GET #" feature. */
spat = pattern->ptr;
spat = ptrFromObj(pattern);
if (spat[0] == '#' && spat[1] == '\0') {
incrRefCount(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
* increment the ref count, that we'll decrement later. */
subst = getDecodedObject(subst);
ssub = subst->ptr;
ssub = ptrFromObj(subst);
/* If we can't find '*' in the pattern we return NULL as to GET a
* fixed key does not make sense. */
@ -99,7 +99,7 @@ robj *lookupKeyByPattern(redisDb *db, robj *pattern, robj *subst) {
sublen = sdslen(ssub);
postfixlen = sdslen(spat)-(prefixlen+1)-(fieldlen ? fieldlen+2 : 0);
keyobj = createStringObject(NULL,prefixlen+sublen+postfixlen);
k = keyobj->ptr;
k = ptrFromObj(keyobj);
memcpy(k,spat,prefixlen);
memcpy(k+prefixlen,ssub,sublen);
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
* is a new object with refcount already incremented. */
o = hashTypeGetValueObject(o, fieldobj->ptr);
o = hashTypeGetValueObject(o, ptrFromObj(fieldobj));
} else {
if (o->type != OBJ_STRING) goto noobj;
@ -169,7 +169,7 @@ int sortCompare(const void *s1, const void *s2) {
} else {
/* Here we can use strcoll() directly as we are sure that
* 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 {
@ -225,13 +225,13 @@ void sortCommand(client *c) {
/* The SORT command has an SQL-alike syntax, parse it */
while(j < c->argc) {
int leftargs = c->argc-j-1;
if (!strcasecmp(c->argv[j]->ptr,"asc")) {
if (!strcasecmp(ptrFromObj(c->argv[j]),"asc")) {
desc = 0;
} else if (!strcasecmp(c->argv[j]->ptr,"desc")) {
} else if (!strcasecmp(ptrFromObj(c->argv[j]),"desc")) {
desc = 1;
} else if (!strcasecmp(c->argv[j]->ptr,"alpha")) {
} else if (!strcasecmp(ptrFromObj(c->argv[j]),"alpha")) {
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)
!= C_OK) ||
(getLongFromObjectOrReply(c, c->argv[j+2], &limit_count, NULL)
@ -241,14 +241,14 @@ void sortCommand(client *c) {
break;
}
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];
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];
/* If the BY pattern does not contain '*', i.e. it is constant,
* 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;
} else {
/* If BY is specified with a real patter, we can't accept
@ -260,7 +260,7 @@ void sortCommand(client *c) {
}
}
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) {
addReplyError(c,"GET option of SORT denied in Cluster mode.");
syntax_error++;
@ -309,7 +309,7 @@ void sortCommand(client *c) {
switch(sortval->type) {
case OBJ_LIST: vectorlen = listTypeLength(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 */
}
@ -396,7 +396,7 @@ void sortCommand(client *c) {
* Note that in this case we also handle LIMIT here in a direct
* way, just getting the required range, as an optimization. */
zset *zs = sortval->ptr;
zset *zs = ptrFromObj(sortval);
zskiplist *zsl = zs->zsl;
zskiplistNode *ln;
sds sdsele;
@ -404,7 +404,7 @@ void sortCommand(client *c) {
/* Check if starting point is trivial, before doing log(N) lookup. */
if (desc) {
long zsetlen = dictSize(((zset*)sortval->ptr)->pdict);
long zsetlen = dictSize(((zset*)ptrFromObj(sortval))->pdict);
ln = zsl->tail;
if (start > 0)
@ -428,7 +428,7 @@ void sortCommand(client *c) {
end -= start;
start = 0;
} else if (sortval->type == OBJ_ZSET) {
dict *set = ((zset*)sortval->ptr)->pdict;
dict *set = ((zset*)ptrFromObj(sortval))->pdict;
dictIterator *di;
dictEntry *setele;
sds sdsele;
@ -465,7 +465,7 @@ void sortCommand(client *c) {
if (sdsEncodedObject(byval)) {
char *eptr;
vector[j].u.score = strtod(byval->ptr,&eptr);
vector[j].u.score = strtod(ptrFromObj(byval),&eptr);
if (eptr[0] != '\0' || errno == ERANGE ||
isnan(vector[j].u.score))
{
@ -475,7 +475,7 @@ void sortCommand(client *c) {
/* Don't need to decode the object if it's
* integer-encoded (the only encoding supported) so
* far. We can just cast it */
vector[j].u.score = (long)byval->ptr;
vector[j].u.score = (long)byval->m_ptr;
} else {
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++) {
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);
break;
@ -64,7 +64,7 @@ int hashTypeGetFromZiplist(robj *o, sds field,
serverAssert(o->encoding == OBJ_ENCODING_ZIPLIST);
zl = o->ptr;
zl = ptrFromObj(o);
fptr = ziplistIndex(zl, ZIPLIST_HEAD);
if (fptr != NULL) {
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);
de = dictFind(o->ptr, field);
de = dictFind(ptrFromObj(o), field);
if (de == NULL) return NULL;
return dictGetVal(de);
}
@ -205,7 +205,7 @@ int hashTypeSet(robj *o, sds field, sds value, int flags) {
if (o->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl, *fptr, *vptr;
zl = o->ptr;
zl = ptrFromObj(o);
fptr = ziplistIndex(zl, ZIPLIST_HEAD);
if (fptr != NULL) {
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),
ZIPLIST_TAIL);
}
o->ptr = zl;
o->m_ptr = zl;
/* Check if the ziplist needs to be converted to a hash table */
if (hashTypeLength(o) > server.hash_max_ziplist_entries)
hashTypeConvert(o, OBJ_ENCODING_HT);
} else if (o->encoding == OBJ_ENCODING_HT) {
dictEntry *de = dictFind(o->ptr,field);
dictEntry *de = dictFind(ptrFromObj(o),field);
if (de) {
sdsfree(dictGetVal(de));
if (flags & HASH_SET_TAKE_VALUE) {
@ -261,7 +261,7 @@ int hashTypeSet(robj *o, sds field, sds value, int flags) {
} else {
v = sdsdup(value);
}
dictAdd(o->ptr,f,v);
dictAdd(ptrFromObj(o),f,v);
}
} else {
serverPanic("Unknown hash encoding");
@ -282,23 +282,23 @@ int hashTypeDelete(robj *o, sds field) {
if (o->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl, *fptr;
zl = o->ptr;
zl = ptrFromObj(o);
fptr = ziplistIndex(zl, ZIPLIST_HEAD);
if (fptr != NULL) {
fptr = ziplistFind(fptr, (unsigned char*)field, sdslen(field), 1);
if (fptr != NULL) {
zl = ziplistDelete(zl,&fptr); /* Delete the key. */
zl = ziplistDelete(zl,&fptr); /* Delete the value. */
o->ptr = zl;
o->m_ptr = zl;
deleted = 1;
}
}
} 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;
/* 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 {
@ -312,9 +312,9 @@ unsigned long hashTypeLength(const robj *o) {
unsigned long length = ULONG_MAX;
if (o->encoding == OBJ_ENCODING_ZIPLIST) {
length = ziplistLen(o->ptr) / 2;
length = ziplistLen(ptrFromObj(o)) / 2;
} else if (o->encoding == OBJ_ENCODING_HT) {
length = dictSize((const dict*)o->ptr);
length = dictSize((const dict*)ptrFromObj(o));
} else {
serverPanic("Unknown hash encoding");
}
@ -330,7 +330,7 @@ hashTypeIterator *hashTypeInitIterator(robj *subject) {
hi->fptr = NULL;
hi->vptr = NULL;
} else if (hi->encoding == OBJ_ENCODING_HT) {
hi->di = dictGetIterator(subject->ptr);
hi->di = dictGetIterator(subject->m_ptr);
} else {
serverPanic("Unknown hash encoding");
}
@ -350,7 +350,7 @@ int hashTypeNext(hashTypeIterator *hi) {
unsigned char *zl;
unsigned char *fptr, *vptr;
zl = hi->subject->ptr;
zl = hi->subject->m_ptr;
fptr = hi->fptr;
vptr = hi->vptr;
@ -484,14 +484,14 @@ void hashTypeConvertZiplist(robj *o, int enc) {
ret = dictAdd(dict, key, value);
if (ret != DICT_OK) {
serverLogHexDump(LL_WARNING,"ziplist with dup elements dump",
o->ptr,ziplistBlobLen(o->ptr));
ptrFromObj(o),ziplistBlobLen(ptrFromObj(o)));
serverPanic("Ziplist corruption detected");
}
}
hashTypeReleaseIterator(hi);
zfree(o->ptr);
zfree(ptrFromObj(o));
o->encoding = OBJ_ENCODING_HT;
o->ptr = dict;
o->m_ptr = dict;
} else {
serverPanic("Unknown hash encoding");
}
@ -516,10 +516,10 @@ void hsetnxCommand(client *c) {
if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
hashTypeTryConversion(o,c->argv,2,3);
if (hashTypeExists(o, c->argv[2]->ptr)) {
if (hashTypeExists(o, ptrFromObj(c->argv[2]))) {
addReply(c, shared.czero);
} 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);
signalModifiedKey(c->db,c->argv[1]);
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);
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. */
char *cmdname = c->argv[0]->ptr;
char *cmdname = ptrFromObj(c->argv[0]);
if (cmdname[1] == 's' || cmdname[1] == 'S') {
/* HSET */
addReplyLongLong(c, created);
@ -565,7 +565,7 @@ void hincrbyCommand(client *c) {
if (getLongLongFromObjectOrReply(c,c->argv[3],&incr,NULL) != C_OK) 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 (string2ll((char*)vstr,vlen,&value) == 0) {
addReplyError(c,"hash value is not an integer");
@ -584,7 +584,7 @@ void hincrbyCommand(client *c) {
}
value += incr;
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);
signalModifiedKey(c->db,c->argv[1]);
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 ((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 (string2ld((char*)vstr,vlen,&value) == 0) {
addReplyError(c,"hash value is not a float");
@ -619,7 +619,7 @@ void hincrbyfloatCommand(client *c) {
char buf[MAX_LONG_DOUBLE_CHARS];
int len = ld2string(buf,sizeof(buf),value,1);
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);
signalModifiedKey(c->db,c->argv[1]);
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 ||
checkType(c,o,OBJ_HASH)) return;
addHashFieldToReply(c, o, c->argv[2]->ptr);
addHashFieldToReply(c, o, ptrFromObj(c->argv[2]));
}
void hmgetCommand(client *c) {
@ -695,7 +695,7 @@ void hmgetCommand(client *c) {
addReplyArrayLen(c, c->argc-2);
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;
for (j = 2; j < c->argc; j++) {
if (hashTypeDelete(o,c->argv[j]->ptr)) {
if (hashTypeDelete(o,ptrFromObj(c->argv[j]))) {
deleted++;
if (hashTypeLength(o) == 0) {
dbDelete(c->db,c->argv[1]);
@ -741,7 +741,7 @@ void hstrlenCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
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) {
@ -816,7 +816,7 @@ void hexistsCommand(client *c) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
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) {

View File

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

View File

@ -52,7 +52,7 @@ robj *setTypeCreate(sds value) {
int setTypeAdd(robj *subject, sds value) {
long long llval;
if (subject->encoding == OBJ_ENCODING_HT) {
dict *ht = subject->ptr;
dict *ht = subject->m_ptr;
dictEntry *de = dictAddRaw(ht,value,NULL);
if (de) {
dictSetKey(ht,de,sdsdup(value));
@ -62,11 +62,11 @@ int setTypeAdd(robj *subject, sds value) {
} else if (subject->encoding == OBJ_ENCODING_INTSET) {
if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) {
uint8_t success = 0;
subject->ptr = intsetAdd(subject->ptr,llval,&success);
subject->m_ptr = intsetAdd(subject->m_ptr,llval,&success);
if (success) {
/* Convert to regular set when the intset contains
* 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);
return 1;
}
@ -76,7 +76,7 @@ int setTypeAdd(robj *subject, sds value) {
/* The set *was* an intset and this value is not integer
* 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;
}
} else {
@ -88,14 +88,14 @@ int setTypeAdd(robj *subject, sds value) {
int setTypeRemove(robj *setobj, sds value) {
long long llval;
if (setobj->encoding == OBJ_ENCODING_HT) {
if (dictDelete(setobj->ptr,value) == DICT_OK) {
if (htNeedsResize(setobj->ptr)) dictResize(setobj->ptr);
if (dictDelete(setobj->m_ptr,value) == DICT_OK) {
if (htNeedsResize(setobj->m_ptr)) dictResize(setobj->m_ptr);
return 1;
}
} else if (setobj->encoding == OBJ_ENCODING_INTSET) {
if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) {
int success;
setobj->ptr = intsetRemove(setobj->ptr,llval,&success);
setobj->m_ptr = intsetRemove(setobj->m_ptr,llval,&success);
if (success) return 1;
}
} else {
@ -107,10 +107,10 @@ int setTypeRemove(robj *setobj, sds value) {
int setTypeIsMember(robj *subject, sds value) {
long long llval;
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) {
if (isSdsRepresentableAsLongLong(value,&llval) == C_OK) {
return intsetFind((intset*)subject->ptr,llval);
return intsetFind((intset*)subject->m_ptr,llval);
}
} else {
serverPanic("Unknown set encoding");
@ -123,7 +123,7 @@ setTypeIterator *setTypeInitIterator(robj *subject) {
si->subject = subject;
si->encoding = subject->encoding;
if (si->encoding == OBJ_ENCODING_HT) {
si->di = dictGetIterator(subject->ptr);
si->di = dictGetIterator(subject->m_ptr);
} else if (si->encoding == OBJ_ENCODING_INTSET) {
si->ii = 0;
} else {
@ -158,7 +158,7 @@ int setTypeNext(setTypeIterator *si, sds *sdsele, int64_t *llele) {
*sdsele = dictGetKey(de);
*llele = -123456789; /* Not needed. Defensive. */
} 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;
*sdsele = NULL; /* Not needed. Defensive. */
} else {
@ -207,11 +207,11 @@ sds setTypeNextObject(setTypeIterator *si) {
* used field with values which are easy to trap if misused. */
int setTypeRandomElement(robj *setobj, sds *sdsele, int64_t *llele) {
if (setobj->encoding == OBJ_ENCODING_HT) {
dictEntry *de = dictGetRandomKey(setobj->ptr);
dictEntry *de = dictGetRandomKey(setobj->m_ptr);
*sdsele = dictGetKey(de);
*llele = -123456789; /* Not needed. Defensive. */
} else if (setobj->encoding == OBJ_ENCODING_INTSET) {
*llele = intsetRandom(setobj->ptr);
*llele = intsetRandom(setobj->m_ptr);
*sdsele = NULL; /* Not needed. Defensive. */
} else {
serverPanic("Unknown set encoding");
@ -221,9 +221,9 @@ int setTypeRandomElement(robj *setobj, sds *sdsele, int64_t *llele) {
unsigned long setTypeSize(const robj *subject) {
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) {
return intsetLen((const intset*)subject->ptr);
return intsetLen((const intset*)subject->m_ptr);
} else {
serverPanic("Unknown set encoding");
}
@ -243,7 +243,7 @@ void setTypeConvert(robj *setobj, int enc) {
sds element;
/* 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 */
si = setTypeInitIterator(setobj);
@ -254,8 +254,8 @@ void setTypeConvert(robj *setobj, int enc) {
setTypeReleaseIterator(si);
setobj->encoding = OBJ_ENCODING_HT;
zfree(setobj->ptr);
setobj->ptr = d;
zfree(setobj->m_ptr);
setobj->m_ptr = d;
} else {
serverPanic("Unsupported set conversion");
}
@ -267,7 +267,7 @@ void saddCommand(client *c) {
set = lookupKeyWrite(c->db,c->argv[1]);
if (set == NULL) {
set = setTypeCreate(c->argv[2]->ptr);
set = setTypeCreate(ptrFromObj(c->argv[2]));
dbAdd(c->db,c->argv[1],set);
} else {
if (set->type != OBJ_SET) {
@ -277,7 +277,7 @@ void saddCommand(client *c) {
}
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) {
signalModifiedKey(c->db,c->argv[1]);
@ -295,7 +295,7 @@ void sremCommand(client *c) {
checkType(c,set,OBJ_SET)) return;
for (j = 2; j < c->argc; j++) {
if (setTypeRemove(set,c->argv[j]->ptr)) {
if (setTypeRemove(set,ptrFromObj(c->argv[j]))) {
deleted++;
if (setTypeSize(set) == 0) {
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 == dstset) {
addReply(c,setTypeIsMember(srcset,ele->ptr) ?
addReply(c,setTypeIsMember(srcset,ptrFromObj(ele)) ?
shared.cone : shared.czero);
return;
}
/* 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);
return;
}
@ -354,7 +354,7 @@ void smoveCommand(client *c) {
/* Create the destination set when it doesn't exist */
if (!dstset) {
dstset = setTypeCreate(ele->ptr);
dstset = setTypeCreate(ptrFromObj(ele));
dbAdd(c->db,c->argv[2],dstset);
}
@ -363,7 +363,7 @@ void smoveCommand(client *c) {
server.dirty++;
/* An extra key has changed when ele was successfully added to dstset */
if (setTypeAdd(dstset,ele->ptr)) {
if (setTypeAdd(dstset,ptrFromObj(ele))) {
server.dirty++;
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 ||
checkType(c,set,OBJ_SET)) return;
if (setTypeIsMember(set,c->argv[2]->ptr))
if (setTypeIsMember(set,ptrFromObj(c->argv[2])))
addReply(c,shared.cone);
else
addReply(c,shared.czero);
@ -478,7 +478,7 @@ void spopWithCountCommand(client *c) {
if (encoding == OBJ_ENCODING_INTSET) {
addReplyBulkLongLong(c,llele);
objele = createStringObjectFromLongLong(llele);
set->ptr = intsetRemove(set->ptr,llele,NULL);
set->m_ptr = intsetRemove(set->m_ptr,llele,NULL);
} else {
addReplyBulkCBuffer(c,sdsele,sdslen(sdsele));
objele = createStringObject(sdsele,sdslen(sdsele));
@ -575,10 +575,10 @@ void spopCommand(client *c) {
/* Remove the element from the set */
if (encoding == OBJ_ENCODING_INTSET) {
ele = createStringObjectFromLongLong(llele);
set->ptr = intsetRemove(set->ptr,llele,NULL);
set->m_ptr = intsetRemove(set->m_ptr,llele,NULL);
} else {
ele = createStringObject(sdsele,sdslen(sdsele));
setTypeRemove(set,ele->ptr);
setTypeRemove(set,ptrFromObj(ele));
}
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) {
/* intset with intset is simple... and fast */
if (sets[j]->encoding == OBJ_ENCODING_INTSET &&
!intsetFind((intset*)sets[j]->ptr,intobj))
!intsetFind((intset*)sets[j]->m_ptr,intobj))
{
break;
/* 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,numfields);
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 = 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) {
int64_t 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;
unsigned char buf[LP_INTBUF_SIZE];
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))
lp = lpAppendInteger(lp,numfields);
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))
lp = lpAppend(lp,(unsigned char*)field,sdslen(field));
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. */
int streamGenericParseIDOrReply(client *c, robj *o, streamID *id, uint64_t missing_seq, int strict) {
char buf[128];
if (sdslen(o->ptr) > sizeof(buf)-1) goto invalid;
memcpy(buf,o->ptr,sdslen(o->ptr)+1);
if (sdslen(ptrFromObj(o)) > sizeof(buf)-1) goto invalid;
memcpy(buf,ptrFromObj(o),sdslen(ptrFromObj(o))+1);
if (strict && (buf[0] == '-' || buf[0] == '+') && buf[1] == '\0')
goto invalid;
@ -1178,14 +1178,14 @@ void xaddCommand(client *c) {
find an option, or the ID. */
for (; i < c->argc; i++) {
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') {
/* This is just a fast path for the common case of auto-ID
* creation. */
break;
} else if (!strcasecmp(opt,"maxlen") && moreargs) {
approx_maxlen = 0;
char *next = c->argv[i+1]->ptr;
char *next = ptrFromObj(c->argv[i+1]);
/* Check for the form MAXLEN ~ <count>. */
if (moreargs >= 2 && next[0] == '~' && next[1] == '\0') {
approx_maxlen = 1;
@ -1221,7 +1221,7 @@ void xaddCommand(client *c) {
robj *o;
stream *s;
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. */
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) {
for (int j = 4; j < c->argc; j++) {
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)
!= C_OK) return;
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 ||
checkType(c,o,OBJ_STREAM)) return;
s = o->ptr;
s = ptrFromObj(o);
if (count == 0) {
addReplyNullArray(c);
@ -1315,7 +1315,7 @@ void xlenCommand(client *c) {
robj *o;
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL
|| checkType(c,o,OBJ_STREAM)) return;
stream *s = o->ptr;
stream *s = ptrFromObj(o);
addReplyLongLong(c,s->length);
}
@ -1337,14 +1337,14 @@ void xreadCommand(client *c) {
streamID static_ids[STREAMID_STATIC_VECTOR_LEN];
streamID *ids = static_ids;
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 *consumername = NULL;
/* Parse arguments. */
for (int i = 1; i < c->argc; i++) {
int moreargs = c->argc-i-1;
char *o = c->argv[i]->ptr;
char *o = ptrFromObj(c->argv[i]);
if (!strcasecmp(o,"BLOCK") && moreargs) {
i++;
if (getTimeoutFromObjectOrReply(c,c->argv[i],&timeout,
@ -1419,18 +1419,18 @@ void xreadCommand(client *c) {
* key and group actually exist. */
if (groupname) {
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 "
"group '%s' in XREADGROUP with GROUP "
"option",
(char*)key->ptr,(char*)groupname->ptr);
(char*)ptrFromObj(key),(char*)ptrFromObj(groupname));
goto cleanup;
}
groups[id_idx] = group;
}
if (strcmp(c->argv[i]->ptr,"$") == 0) {
if (strcmp(ptrFromObj(c->argv[i]),"$") == 0) {
if (xreadgroup) {
addReplyError(c,"The $ ID is meaningless in the context of "
"XREADGROUP: you want to read the history of "
@ -1440,14 +1440,14 @@ void xreadCommand(client *c) {
goto cleanup;
}
if (o) {
stream *s = o->ptr;
stream *s = ptrFromObj(o);
ids[id_idx] = s->last_id;
} else {
ids[id_idx].ms = 0;
ids[id_idx].seq = 0;
}
continue;
} else if (strcmp(c->argv[i]->ptr,">") == 0) {
} else if (strcmp(ptrFromObj(c->argv[i]),">") == 0) {
if (!xreadgroup) {
addReplyError(c,"The > ID can be specified only when calling "
"XREADGROUP using the GROUP <group> "
@ -1471,7 +1471,7 @@ void xreadCommand(client *c) {
for (int i = 0; i < streams_count; i++) {
robj *o = lookupKeyRead(c->db,c->argv[streams_arg+i]);
if (o == NULL) continue;
stream *s = o->ptr;
stream *s = ptrFromObj(o);
streamID *gt = ids+i; /* ID must be greater than this. */
int serve_synchronously = 0;
int serve_history = 0; /* True for XREADGROUP with ID != ">". */
@ -1520,7 +1520,7 @@ void xreadCommand(client *c) {
addReplyBulk(c,c->argv[streams_arg+i]);
streamConsumer *consumer = NULL;
if (groups) consumer = streamLookupConsumer(groups[i],
consumername->ptr,1);
ptrFromObj(consumername),1);
streamPropInfo spi = {c->argv[i+streams_arg],groupname};
int flags = 0;
if (noack) flags |= STREAM_RWR_NOACK;
@ -1719,26 +1719,26 @@ NULL
stream *s = NULL;
sds grpname = NULL;
streamCG *cg = NULL;
char *opt = c->argv[1]->ptr; /* Subcommand name. */
char *opt = ptrFromObj(c->argv[1]); /* Subcommand name. */
int mkstream = 0;
robj *o;
/* CREATE has an MKSTREAM option that creates the stream if it
* does not exist. */
if (c->argc == 6 && !strcasecmp(opt,"CREATE")) {
if (strcasecmp(c->argv[5]->ptr,"MKSTREAM")) {
if (strcasecmp(ptrFromObj(c->argv[5]),"MKSTREAM")) {
addReplySubcommandSyntaxError(c);
return;
}
mkstream = 1;
grpname = c->argv[3]->ptr;
grpname = ptrFromObj(c->argv[3]);
}
/* Everything but the "HELP" option requires a key and group name. */
if (c->argc >= 4) {
o = lookupKeyWrite(c->db,c->argv[2]);
if (o) s = o->ptr;
grpname = c->argv[3]->ptr;
if (o) s = ptrFromObj(o);
grpname = ptrFromObj(c->argv[3]);
}
/* Check for missing key/group. */
@ -1761,7 +1761,7 @@ NULL
{
addReplyErrorFormat(c, "-NOGROUP No such consumer group '%s' "
"for key name '%s'",
(char*)grpname, (char*)c->argv[2]->ptr);
(char*)grpname, (char*)ptrFromObj(c->argv[2]));
return;
}
}
@ -1769,7 +1769,7 @@ NULL
/* Dispatch the different subcommands. */
if (!strcasecmp(opt,"CREATE") && (c->argc == 5 || c->argc == 6)) {
streamID id;
if (!strcmp(c->argv[4]->ptr,"$")) {
if (!strcmp(ptrFromObj(c->argv[4]),"$")) {
if (s) {
id = s->last_id;
} else {
@ -1784,7 +1784,7 @@ NULL
if (s == NULL && mkstream) {
o = createStreamObject();
dbAdd(c->db,c->argv[2],o);
s = o->ptr;
s = ptrFromObj(o);
}
streamCG *cg = streamCreateCG(s,grpname,sdslen(grpname),&id);
@ -1799,7 +1799,7 @@ NULL
}
} else if (!strcasecmp(opt,"SETID") && c->argc == 5) {
streamID id;
if (!strcmp(c->argv[4]->ptr,"$")) {
if (!strcmp(ptrFromObj(c->argv[4]),"$")) {
id = s->last_id;
} else if (streamParseIDOrReply(c,c->argv[4],&id,0) != C_OK) {
return;
@ -1822,7 +1822,7 @@ NULL
} else if (!strcasecmp(opt,"DELCONSUMER") && c->argc == 5) {
/* Delete the consumer and returns the number of pending messages
* 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);
server.dirty++;
notifyKeyspaceEvent(NOTIFY_STREAM,"xgroup-delconsumer",
@ -1841,7 +1841,7 @@ void xsetidCommand(client *c) {
robj *o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr);
if (o == NULL || checkType(c,o,OBJ_STREAM)) return;
stream *s = o->ptr;
stream *s = ptrFromObj(o);
streamID id;
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]);
if (o) {
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. */
@ -1955,11 +1955,11 @@ void xpendingCommand(client *c) {
if (o && checkType(c,o,OBJ_STREAM)) return;
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 "
"group '%s'",
(char*)key->ptr,(char*)groupname->ptr);
(char*)ptrFromObj(key),(char*)ptrFromObj(groupname));
return;
}
@ -2009,7 +2009,7 @@ void xpendingCommand(client *c) {
/* XPENDING <key> <group> <start> <stop> <count> [<consumer>] variant. */
else {
streamConsumer *consumer = consumername ?
streamLookupConsumer(group,consumername->ptr,0):
streamLookupConsumer(group,ptrFromObj(consumername),0):
NULL;
/* If a consumer name was mentioned but it does not exist, we can
@ -2138,15 +2138,15 @@ void xclaimCommand(client *c) {
if (o) {
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
* is mandatory. */
if (o == NULL || group == NULL) {
addReplyErrorFormat(c,"-NOGROUP No such key '%s' or "
"consumer group '%s'", (char*)c->argv[1]->ptr,
(char*)c->argv[2]->ptr);
"consumer group '%s'", (char*)ptrFromObj(c->argv[1]),
(char*)ptrFromObj(c->argv[2]));
return;
}
@ -2173,7 +2173,7 @@ void xclaimCommand(client *c) {
int propagate_last_id = 0;
for (; j < c->argc; j++) {
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")) {
force = 1;
} else if (!strcasecmp(opt,"JUSTID")) {
@ -2225,7 +2225,7 @@ void xclaimCommand(client *c) {
}
/* 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);
size_t arraylen = 0;
for (int j = 5; j <= last_id_arg; j++) {
@ -2245,7 +2245,7 @@ void xclaimCommand(client *c) {
* and replication of consumer groups. */
if (force && nack == raxNotFound) {
streamIterator myiterator;
streamIteratorStart(&myiterator,o->ptr,&id,&id,0);
streamIteratorStart(&myiterator,ptrFromObj(o),&id,&id,0);
int64_t numfields;
int found = 0;
streamID item_id;
@ -2287,7 +2287,7 @@ void xclaimCommand(client *c) {
if (justid) {
addReplyStreamID(c,&id);
} 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);
if (!emitted) addReplyNull(c);
}
@ -2318,7 +2318,7 @@ void xdelCommand(client *c) {
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL
|| 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
* 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. */
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL
|| checkType(c,o,OBJ_STREAM)) return;
stream *s = o->ptr;
stream *s = ptrFromObj(o);
/* Argument parsing. */
int trim_strategy = TRIM_STRATEGY_NONE;
@ -2376,11 +2376,11 @@ void xtrimCommand(client *c) {
int i = 2; /* Start of options. */
for (; i < c->argc; i++) {
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) {
approx_maxlen = 0;
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>. */
if (moreargs >= 2 && next[0] == '~' && next[1] == '\0') {
approx_maxlen = 1;
@ -2439,7 +2439,7 @@ NULL
robj *key;
/* HELP is special. Handle it ASAP. */
if (!strcasecmp(c->argv[1]->ptr,"HELP")) {
if (!strcasecmp(ptrFromObj(c->argv[1]),"HELP")) {
addReplyHelp(c, help);
return;
} else if (c->argc < 3) {
@ -2449,22 +2449,22 @@ NULL
/* With the exception of HELP handled before any other sub commands, all
* the ones are in the form of "<subcommand> <key>". */
opt = c->argv[1]->ptr;
opt = ptrFromObj(c->argv[1]);
key = c->argv[2];
/* Lookup the key now, this is common for all the subcommands but HELP. */
robj *o = lookupKeyWriteOrReply(c,key,shared.nokeyerr);
if (o == NULL || checkType(c,o,OBJ_STREAM)) return;
s = o->ptr;
s = ptrFromObj(o);
/* Dispatch the different subcommands. */
if (!strcasecmp(opt,"CONSUMERS") && c->argc == 4) {
/* XINFO CONSUMERS <key> <group>. */
streamCG *cg = streamLookupCG(s,c->argv[3]->ptr);
streamCG *cg = streamLookupCG(s,ptrFromObj(c->argv[3]));
if (cg == NULL) {
addReplyErrorFormat(c, "-NOGROUP No such consumer group '%s' "
"for key name '%s'",
(char*)c->argv[3]->ptr, (char*)key->ptr);
(char*)ptrFromObj(c->argv[3]), (char*)ptrFromObj(key));
return;
}

View File

@ -100,7 +100,7 @@ void setCommand(client *c) {
int flags = OBJ_SET_NO_FLAGS;
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];
if ((a[0] == 'n' || a[0] == 'N') &&
@ -184,7 +184,7 @@ void getsetCommand(client *c) {
void setrangeCommand(client *c) {
robj *o;
long offset;
sds value = c->argv[3]->ptr;
sds value = ptrFromObj(c->argv[3]);
if (getLongFromObjectOrReply(c,c->argv[2],&offset,NULL) != C_OK)
return;
@ -231,14 +231,14 @@ void setrangeCommand(client *c) {
}
if (sdslen(value) > 0) {
o->ptr = sdsgrowzero(o->ptr,offset+sdslen(value));
memcpy((char*)o->ptr+offset,value,sdslen(value));
o->m_ptr = sdsgrowzero(ptrFromObj(o),offset+sdslen(value));
memcpy((char*)ptrFromObj(o)+offset,value,sdslen(value));
signalModifiedKey(c->db,c->argv[1]);
notifyKeyspaceEvent(NOTIFY_STRING,
"setrange",c->argv[1],c->db->id);
server.dirty++;
}
addReplyLongLong(c,sdslen(o->ptr));
addReplyLongLong(c,sdslen(ptrFromObj(o)));
}
void getrangeCommand(client *c) {
@ -256,9 +256,9 @@ void getrangeCommand(client *c) {
if (o->encoding == OBJ_ENCODING_INT) {
str = llbuf;
strlen = ll2string(llbuf,sizeof(llbuf),(long)o->ptr);
strlen = ll2string(llbuf,sizeof(llbuf),(long)ptrFromObj(o));
} else {
str = o->ptr;
str = ptrFromObj(o);
strlen = sdslen(str);
}
@ -357,7 +357,7 @@ void incrDecrCommand(client *c, long long incr) {
value >= LONG_MIN && value <= LONG_MAX)
{
new = o;
o->ptr = (void*)((long)value);
o->m_ptr = (void*)((long)value);
} else {
new = createStringObjectFromLongLongForValue(value);
if (o) {
@ -448,14 +448,14 @@ void appendCommand(client *c) {
/* "append" is an argument, so always an sds */
append = c->argv[2];
totlen = stringObjectLen(o)+sdslen(append->ptr);
totlen = stringObjectLen(o)+sdslen(ptrFromObj(append));
if (checkStringLength(c,totlen) != C_OK)
return;
/* Append the value */
o = dbUnshareStringValue(c->db,c->argv[1],o);
o->ptr = sdscatlen(o->ptr,append->ptr,sdslen(append->ptr));
totlen = sdslen(o->ptr);
o->m_ptr = sdscatlen(ptrFromObj(o),ptrFromObj(append),sdslen(ptrFromObj(append)));
totlen = sdslen(ptrFromObj(o));
}
signalModifiedKey(c->db,c->argv[1]);
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 instead match min <= x <= max */
if (min->encoding == OBJ_ENCODING_INT) {
spec->min = (long)min->ptr;
spec->min = (long)min->m_ptr;
} else {
if (((char*)min->ptr)[0] == '(') {
spec->min = strtod((char*)min->ptr+1,&eptr);
if (((char*)ptrFromObj(min))[0] == '(') {
spec->min = strtod((char*)ptrFromObj(min)+1,&eptr);
if (eptr[0] != '\0' || isnan(spec->min)) return C_ERR;
spec->minex = 1;
} 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 (max->encoding == OBJ_ENCODING_INT) {
spec->max = (long)max->ptr;
spec->max = (long)max->m_ptr;
} else {
if (((char*)max->ptr)[0] == '(') {
spec->max = strtod((char*)max->ptr+1,&eptr);
if (((char*)ptrFromObj(max))[0] == '(') {
spec->max = strtod((char*)ptrFromObj(max)+1,&eptr);
if (eptr[0] != '\0' || isnan(spec->max)) return C_ERR;
spec->maxex = 1;
} 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;
}
}
@ -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
* of *dest and *ex is undefined. */
int zslParseLexRangeItem(robj *item, sds *dest, int *ex) {
char *c = item->ptr;
char *c = ptrFromObj(item);
switch(c[0]) {
case '+':
@ -1156,9 +1156,9 @@ unsigned char *zzlDeleteRangeByRank(unsigned char *zl, unsigned int start, unsig
unsigned long zsetLength(const robj *zobj) {
unsigned long length = 0;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
length = zzlLength(zobj->ptr);
length = zzlLength(zobj->m_ptr);
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
length = ((const zset*)zobj->ptr)->zsl->length;
length = ((const zset*)zobj->m_ptr)->zsl->length;
} else {
serverPanic("Unknown sorted set encoding");
}
@ -1173,7 +1173,7 @@ void zsetConvert(robj *zobj, int encoding) {
if (zobj->encoding == encoding) return;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr;
unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr;
unsigned char *vstr;
unsigned int vlen;
@ -1204,8 +1204,8 @@ void zsetConvert(robj *zobj, int encoding) {
zzlNext(zl,&eptr,&sptr);
}
zfree(zobj->ptr);
zobj->ptr = zs;
zfree(zobj->m_ptr);
zobj->m_ptr = zs;
zobj->encoding = OBJ_ENCODING_SKIPLIST;
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
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
* the same time as creating the ziplist. */
zs = zobj->ptr;
zs = zobj->m_ptr;
dictRelease(zs->pdict);
node = zs->zsl->header->level[0].forward;
zfree(zs->zsl->header);
@ -1229,7 +1229,7 @@ void zsetConvert(robj *zobj, int encoding) {
}
zfree(zs);
zobj->ptr = zl;
zobj->m_ptr = zl;
zobj->encoding = OBJ_ENCODING_ZIPLIST;
} else {
serverPanic("Unknown sorted set encoding");
@ -1241,7 +1241,7 @@ void zsetConvert(robj *zobj, int encoding) {
* expected ranges. */
void zsetConvertToZiplistIfNeeded(robj *zobj, size_t maxelelen) {
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 &&
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->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) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
dictEntry *de = dictFind(zs->pdict, member);
if (de == NULL) return C_ERR;
*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) {
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. */
if (nx) {
*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. */
if (score != curscore) {
zobj->ptr = zzlDelete(zobj->ptr,eptr);
zobj->ptr = zzlInsert(zobj->ptr,ele,score);
zobj->m_ptr = zzlDelete(zobj->m_ptr,eptr);
zobj->m_ptr = zzlInsert(zobj->m_ptr,ele,score);
*flags |= ZADD_UPDATED;
}
return 1;
} else if (!xx) {
/* Optimize: check if the element is too large or the list
* becomes too long *before* executing zzlInsert. */
zobj->ptr = zzlInsert(zobj->ptr,ele,score);
if (zzlLength(zobj->ptr) > server.zset_max_ziplist_entries)
zobj->m_ptr = zzlInsert(zobj->m_ptr,ele,score);
if (zzlLength(zobj->m_ptr) > server.zset_max_ziplist_entries)
zsetConvert(zobj,OBJ_ENCODING_SKIPLIST);
if (sdslen(ele) > server.zset_max_ziplist_value)
zsetConvert(zobj,OBJ_ENCODING_SKIPLIST);
@ -1369,7 +1369,7 @@ int zsetAdd(robj *zobj, double score, sds ele, int *flags, double *newscore) {
return 1;
}
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
zskiplistNode *znode;
dictEntry *de;
@ -1425,12 +1425,12 @@ int zsetDel(robj *zobj, sds ele) {
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *eptr;
if ((eptr = zzlFind(zobj->ptr,ele,NULL)) != NULL) {
zobj->ptr = zzlDelete(zobj->ptr,eptr);
if ((eptr = zzlFind(zobj->m_ptr,ele,NULL)) != NULL) {
zobj->m_ptr = zzlDelete(zobj->m_ptr,eptr);
return 1;
}
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
dictEntry *de;
double score;
@ -1477,7 +1477,7 @@ long zsetRank(robj *zobj, sds ele, int reverse) {
llen = zsetLength(zobj);
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr;
unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr;
eptr = ziplistIndex(zl,0);
@ -1502,7 +1502,7 @@ long zsetRank(robj *zobj, sds ele, int reverse) {
return -1;
}
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl;
dictEntry *de;
double score;
@ -1550,7 +1550,7 @@ void zaddGenericCommand(client *c, int flags) {
* of the score of the first score-element pair. */
scoreidx = 2;
while(scoreidx < c->argc) {
char *opt = c->argv[scoreidx]->ptr;
char *opt = ptrFromObj(c->argv[scoreidx]);
if (!strcasecmp(opt,"nx")) flags |= ZADD_NX;
else if (!strcasecmp(opt,"xx")) flags |= ZADD_XX;
else if (!strcasecmp(opt,"ch")) flags |= ZADD_CH;
@ -1601,7 +1601,7 @@ void zaddGenericCommand(client *c, int flags) {
if (zobj == NULL) {
if (xx) goto reply_to_client; /* No key + XX option: nothing to do. */
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();
} else {
@ -1620,7 +1620,7 @@ void zaddGenericCommand(client *c, int flags) {
score = scores[j];
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);
if (retval == 0) {
addReplyError(c,nanerr);
@ -1669,7 +1669,7 @@ void zremCommand(client *c) {
checkType(c,zobj,OBJ_ZSET)) return;
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) {
dbDelete(c->db,key);
keyremoved = 1;
@ -1741,21 +1741,21 @@ void zremrangeGenericCommand(client *c, int rangetype) {
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
switch(rangetype) {
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;
case ZRANGE_SCORE:
zobj->ptr = zzlDeleteRangeByScore(zobj->ptr,&range,&deleted);
zobj->m_ptr = zzlDeleteRangeByScore(zobj->m_ptr,&range,&deleted);
break;
case ZRANGE_LEX:
zobj->ptr = zzlDeleteRangeByLex(zobj->ptr,&lexrange,&deleted);
zobj->m_ptr = zzlDeleteRangeByLex(zobj->m_ptr,&lexrange,&deleted);
break;
}
if (zzlLength(zobj->ptr) == 0) {
if (zzlLength(zobj->m_ptr) == 0) {
dbDelete(c->db,key);
keyremoved = 1;
}
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
switch(rangetype) {
case ZRANGE_RANK:
deleted = zslDeleteRangeByRank(zs->zsl,start+1,end+1,zs->pdict);
@ -1869,11 +1869,11 @@ void zuiInitIterator(zsetopsrc *op) {
if (op->type == OBJ_SET) {
iterset *it = &op->iter.set;
if (op->encoding == OBJ_ENCODING_INTSET) {
it->is.is = op->subject->ptr;
it->is.is = op->subject->m_ptr;
it->is.ii = 0;
} else if (op->encoding == OBJ_ENCODING_HT) {
it->ht.dict = op->subject->ptr;
it->ht.di = dictGetIterator(op->subject->ptr);
it->ht.dict = op->subject->m_ptr;
it->ht.di = dictGetIterator(op->subject->m_ptr);
it->ht.de = dictNext(it->ht.di);
} else {
serverPanic("Unknown set encoding");
@ -1881,14 +1881,14 @@ void zuiInitIterator(zsetopsrc *op) {
} else if (op->type == OBJ_ZSET) {
iterzset *it = &op->iter.zset;
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);
if (it->zl.eptr != NULL) {
it->zl.sptr = ziplistNext(it->zl.zl,it->zl.eptr);
serverAssert(it->zl.sptr != NULL);
}
} 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;
} else {
serverPanic("Unknown sorted set encoding");
@ -1931,18 +1931,18 @@ unsigned long zuiLength(zsetopsrc *op) {
if (op->type == OBJ_SET) {
if (op->encoding == OBJ_ENCODING_INTSET) {
return intsetLen(op->subject->ptr);
return intsetLen(op->subject->m_ptr);
} else if (op->encoding == OBJ_ENCODING_HT) {
dict *ht = op->subject->ptr;
dict *ht = op->subject->m_ptr;
return dictSize(ht);
} else {
serverPanic("Unknown set encoding");
}
} else if (op->type == OBJ_ZSET) {
if (op->encoding == OBJ_ENCODING_ZIPLIST) {
return zzlLength(op->subject->ptr);
return zzlLength(op->subject->m_ptr);
} else if (op->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = op->subject->ptr;
zset *zs = op->subject->m_ptr;
return zs->zsl->length;
} else {
serverPanic("Unknown sorted set encoding");
@ -2085,7 +2085,7 @@ int zuiFind(zsetopsrc *op, zsetopval *val, double *score) {
if (op->type == OBJ_SET) {
if (op->encoding == OBJ_ENCODING_INTSET) {
if (zuiLongLongFromValue(val) &&
intsetFind(op->subject->ptr,val->ell))
intsetFind(op->subject->m_ptr,val->ell))
{
*score = 1.0;
return 1;
@ -2093,7 +2093,7 @@ int zuiFind(zsetopsrc *op, zsetopval *val, double *score) {
return 0;
}
} else if (op->encoding == OBJ_ENCODING_HT) {
dict *ht = op->subject->ptr;
dict *ht = op->subject->m_ptr;
zuiSdsFromValue(val);
if (dictFind(ht,val->ele) != NULL) {
*score = 1.0;
@ -2108,14 +2108,14 @@ int zuiFind(zsetopsrc *op, zsetopval *val, double *score) {
zuiSdsFromValue(val);
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. */
return 1;
} else {
return 0;
}
} else if (op->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = op->subject->ptr;
zset *zs = op->subject->m_ptr;
dictEntry *de;
if ((de = dictFind(zs->pdict,val->ele)) != NULL) {
*score = *(double*)dictGetVal(de);
@ -2230,7 +2230,7 @@ void zunionInterGenericCommand(client *c, robj *dstkey, int op) {
while (remaining) {
if (remaining >= (setnum + 1) &&
!strcasecmp(c->argv[j]->ptr,"weights"))
!strcasecmp(ptrFromObj(c->argv[j]),"weights"))
{
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 &&
!strcasecmp(c->argv[j]->ptr,"aggregate"))
!strcasecmp(ptrFromObj(c->argv[j]),"aggregate"))
{
j++; remaining--;
if (!strcasecmp(c->argv[j]->ptr,"sum")) {
if (!strcasecmp(ptrFromObj(c->argv[j]),"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;
} else if (!strcasecmp(c->argv[j]->ptr,"max")) {
} else if (!strcasecmp(ptrFromObj(c->argv[j]),"max")) {
aggregate = REDIS_AGGR_MAX;
} else {
zfree(src);
@ -2270,7 +2270,7 @@ void zunionInterGenericCommand(client *c, robj *dstkey, int op) {
qsort(src,setnum,sizeof(zsetopsrc),zuiCompareByCardinality);
dstobj = createZsetObject();
dstzset = dstobj->ptr;
dstzset = ptrFromObj(dstobj);
memset(&zval, 0, sizeof(zval));
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) ||
(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;
} else if (c->argc >= 5) {
addReply(c,shared.syntaxerr);
@ -2454,7 +2454,7 @@ void zrangeGenericCommand(client *c, int reverse) {
addReplyArrayLen(c, rangelen);
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr;
unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr;
unsigned char *vstr;
unsigned int vlen;
@ -2486,7 +2486,7 @@ void zrangeGenericCommand(client *c, int reverse) {
}
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl;
zskiplistNode *ln;
sds ele;
@ -2555,10 +2555,10 @@ void genericZrangebyscoreCommand(client *c, int reverse) {
int pos = 4;
while (remaining) {
if (remaining >= 1 && !strcasecmp(c->argv[pos]->ptr,"withscores")) {
if (remaining >= 1 && !strcasecmp(ptrFromObj(c->argv[pos]),"withscores")) {
pos++; remaining--;
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)
!= C_OK) ||
(getLongFromObjectOrReply(c, c->argv[pos+2], &limit, NULL)
@ -2579,7 +2579,7 @@ void genericZrangebyscoreCommand(client *c, int reverse) {
checkType(c,zobj,OBJ_ZSET)) return;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr;
unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr;
unsigned char *vstr;
unsigned int vlen;
@ -2649,7 +2649,7 @@ void genericZrangebyscoreCommand(client *c, int reverse) {
}
}
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl;
zskiplistNode *ln;
@ -2734,7 +2734,7 @@ void zcountCommand(client *c) {
checkType(c, zobj, OBJ_ZSET)) return;
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr;
unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr;
double score;
@ -2765,7 +2765,7 @@ void zcountCommand(client *c) {
}
}
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl;
zskiplistNode *zn;
unsigned long rank;
@ -2815,7 +2815,7 @@ void zlexcountCommand(client *c) {
}
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr;
unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr;
/* 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) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl;
zskiplistNode *zn;
unsigned long rank;
@ -2904,7 +2904,7 @@ void genericZrangebylexCommand(client *c, int reverse) {
int pos = 4;
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) ||
(getLongFromObjectOrReply(c, c->argv[pos+2], &limit, NULL) != C_OK)) return;
pos += 3; remaining -= 3;
@ -2925,7 +2925,7 @@ void genericZrangebylexCommand(client *c, int reverse) {
}
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr;
unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr;
unsigned char *vstr;
unsigned int vlen;
@ -2991,7 +2991,7 @@ void genericZrangebylexCommand(client *c, int reverse) {
}
}
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl;
zskiplistNode *ln;
@ -3076,7 +3076,7 @@ void zscoreCommand(client *c) {
if ((zobj = lookupKeyReadOrReply(c,key,shared.null[c->resp])) == NULL ||
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);
} else {
addReplyDouble(c,score);
@ -3093,7 +3093,7 @@ void zrankGenericCommand(client *c, int reverse) {
checkType(c,zobj,OBJ_ZSET)) return;
serverAssertWithInfo(c,ele,sdsEncodedObject(ele));
rank = zsetRank(zobj,ele->ptr,reverse);
rank = zsetRank(zobj,ptrFromObj(ele),reverse);
if (rank >= 0) {
addReplyLongLong(c,rank);
} else {
@ -3168,7 +3168,7 @@ void genericZpopCommand(client *c, robj **keyv, int keyc, int where, int emitkey
/* Remove the element. */
do {
if (zobj->encoding == OBJ_ENCODING_ZIPLIST) {
unsigned char *zl = zobj->ptr;
unsigned char *zl = zobj->m_ptr;
unsigned char *eptr, *sptr;
unsigned char *vstr;
unsigned int vlen;
@ -3188,7 +3188,7 @@ void genericZpopCommand(client *c, robj **keyv, int keyc, int where, int emitkey
serverAssertWithInfo(c,zobj,sptr != NULL);
score = zzlGetScore(sptr);
} else if (zobj->encoding == OBJ_ENCODING_SKIPLIST) {
zset *zs = zobj->ptr;
zset *zs = zobj->m_ptr;
zskiplist *zsl = zs->zsl;
zskiplistNode *zln;