From f6736cd713aa040684d7e9d14211d3cea45ae58c Mon Sep 17 00:00:00 2001 From: John Sully Date: Sat, 9 Feb 2019 13:04:18 -0500 Subject: [PATCH] Reduce memory usage for in place strings by 8 bytes --- README.md | 2 +- src/acl.c | 22 +++--- src/aof.c | 32 ++++----- src/bitops.c | 40 +++++------ src/blocked.c | 6 +- src/cluster.c | 158 +++++++++++++++++++++--------------------- src/config.c | 64 ++++++++--------- src/db.c | 84 +++++++++++----------- src/debug.c | 114 +++++++++++++++--------------- src/expire.c | 6 +- src/geo.c | 20 +++--- src/hyperloglog.c | 58 ++++++++-------- src/latency.c | 20 +++--- src/lazyfree.c | 12 ++-- src/module.c | 92 ++++++++++++------------ src/multi.c | 2 +- src/networking.c | 86 +++++++++++------------ src/notify.c | 4 +- src/object.c | 145 +++++++++++++++++++------------------- src/pubsub.c | 20 +++--- src/rdb.c | 102 +++++++++++++-------------- src/redis-check-rdb.c | 4 +- src/replication.c | 44 ++++++------ src/scripting.c | 56 +++++++-------- src/sentinel.c | 98 +++++++++++++------------- src/server.c | 43 ++++++------ src/server.h | 11 ++- src/slowlog.c | 16 ++--- src/sort.c | 38 +++++----- src/t_hash.c | 62 ++++++++--------- src/t_list.c | 34 ++++----- src/t_set.c | 60 ++++++++-------- src/t_stream.c | 102 +++++++++++++-------------- src/t_string.c | 22 +++--- src/t_zset.c | 152 ++++++++++++++++++++-------------------- 35 files changed, 919 insertions(+), 912 deletions(-) diff --git a/README.md b/README.md index 0940f6ce3..352630b7d 100644 --- a/README.md +++ b/README.md @@ -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. */ } diff --git a/src/acl.c b/src/acl.c index 50d91aa54..42cd0c734 100644 --- a/src/acl.c +++ b/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 */ 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; diff --git a/src/aof.c b/src/aof.c index d548c72b8..c71f88aa6 100644 --- a/src/aof.c +++ b/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); diff --git a/src/bitops.c b/src/bitops.c index c35b2ca23..b473d9b97 100644 --- a/src/bitops.c +++ b/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); diff --git a/src/blocked.c b/src/blocked.c index 24d674935..2ac57b5db 100644 --- a/src/blocked.c +++ b/src/blocked.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; } diff --git a/src/cluster.c b/src/cluster.c index c4c0d814c..11eb170fc 100644 --- a/src/cluster.c +++ b/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 ...] -- 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 [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] ... */ /* CLUSTER DELSLOTS [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 */ /* SETSLOT 10 IMPORTING */ /* 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 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 NODE */ - 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 */ - 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 */ 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 */ 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 */ - 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 */ - 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 */ - 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 */ - 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 * @@ -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: diff --git a/src/config.c b/src/config.c index 4df08e47f..7e9b19d76 100644 --- a/src/config.c +++ b/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: */ 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 -- Return parameters matching the glob-like and their values.", "SET -- 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; diff --git a/src/db.c b/src/db.c index c3b8ffd80..c8553c985 100644 --- a/src/db.c +++ b/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 { diff --git a/src/debug.c b/src/debug.c index 36942e61e..51e5f39f5 100644 --- a/src/debug.c +++ b/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); diff --git a/src/expire.c b/src/expire.c index 0b92ee3fe..20acd7f45 100644 --- a/src/expire.c +++ b/src/expire.c @@ -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); } diff --git a/src/geo.c b/src/geo.c index dace5542a..f04e83f5e 100644 --- a/src/geo.c +++ b/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; diff --git a/src/hyperloglog.c b/src/hyperloglog.c index fc21ea006..16ff7c679 100644 --- a/src/hyperloglog.c +++ b/src/hyperloglog.c @@ -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 ... 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 */ 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) { diff --git a/src/latency.c b/src/latency.c index ddb235c13..278ef4d29 100644 --- a/src/latency.c +++ b/src/latency.c @@ -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 */ - 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 */ 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])); } diff --git a/src/lazyfree.c b/src/lazyfree.c index 74c71beb8..6ea21768e 100644 --- a/src/lazyfree.c +++ b/src/lazyfree.c @@ -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); diff --git a/src/module.c b/src/module.c index e5af4ba0e..45fa4e293 100644 --- a/src/module.c +++ b/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 [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; diff --git a/src/multi.c b/src/multi.c index aec913a0a..6d722b8af 100644 --- a/src/multi.c +++ b/src/multi.c @@ -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; } } diff --git a/src/networking.c b/src/networking.c index 3b43707e2..1c917af2a 100644 --- a/src/networking.c +++ b/src/networking.c @@ -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 * CLIENT KILL