Reduce memory usage for in place strings by 8 bytes
This commit is contained in:
parent
dac1213462
commit
f6736cd713
@ -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. */
|
||||
}
|
||||
|
||||
|
22
src/acl.c
22
src/acl.c
@ -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;
|
||||
|
32
src/aof.c
32
src/aof.c
@ -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);
|
||||
|
40
src/bitops.c
40
src/bitops.c
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
158
src/cluster.c
158
src/cluster.c
@ -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:
|
||||
|
64
src/config.c
64
src/config.c
@ -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;
|
||||
|
84
src/db.c
84
src/db.c
@ -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 {
|
||||
|
114
src/debug.c
114
src/debug.c
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
20
src/geo.c
20
src/geo.c
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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]));
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
92
src/module.c
92
src/module.c
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
145
src/object.c
145
src/object.c
@ -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]));
|
||||
}
|
||||
}
|
||||
|
20
src/pubsub.c
20
src/pubsub.c
@ -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
102
src/rdb.c
@ -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);
|
||||
|
@ -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. */
|
||||
|
@ -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);
|
||||
|
@ -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'))
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
43
src/server.c
43
src/server.c
@ -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);
|
||||
|
11
src/server.h
11
src/server.h
@ -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 */
|
||||
|
@ -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;
|
||||
|
38
src/sort.c
38
src/sort.c
@ -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);
|
||||
}
|
||||
|
62
src/t_hash.c
62
src/t_hash.c
@ -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) {
|
||||
|
34
src/t_list.c
34
src/t_list.c
@ -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);
|
||||
}
|
||||
|
60
src/t_set.c
60
src/t_set.c
@ -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
|
||||
|
102
src/t_stream.c
102
src/t_stream.c
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
152
src/t_zset.c
152
src/t_zset.c
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user