int getLongLongFromObjectOrReply(redisClient *c, robj *o, long long *target, const char *msg) { long long value; if (getLongLongFromObject(o, &value) != REDIS_OK) { if (msg != NULL) { addReplyError(c,(char*)msg); } else { addReplyError(c,"value is not an integer or out of range"); } return REDIS_ERR; } *target = value; return REDIS_OK; }
void incrDecrCommand(redisClient *c, long long init_value, long long incr) { c->returncode = REDIS_ERR; long long value, oldvalue; robj *o; o = lookupKeyWriteWithVersion(c->db,c->argv[1],&(c->version)); if (o != NULL && checkType(c,o,REDIS_STRING)) { c->returncode = REDIS_ERR_WRONG_TYPE_ERROR; return; } robj* key = c->argv[1]; if(o != NULL) { uint16_t version = sdsversion(key->ptr); if(c->version_care && version != 0 && version != c->version) { c->returncode = REDIS_ERR_VERSION_ERROR; return; } else { sdsversion_change(key->ptr, c->version); } } else { sdsversion_change(key->ptr, 0); } if(c->version_care) { sdsversion_add(key->ptr, 1); } if (o == NULL) { value = init_value; } else if (getLongLongFromObject(o,&value) != REDIS_OK) { c->returncode = REDIS_ERR_IS_NOT_INTEGER; return; } oldvalue = value; value += incr; value = (int32_t)value; o = createStringObjectFromLongLong(value); dbSuperReplace(c->db,c->argv[1],o); c->db->dirty++; EXPIRE_OR_NOT c->retvalue.llnum = value; c->returncode = REDIS_OK; }
void moveCommand(redisClient *c) { robj *o; redisDb *src, *dst; int srcid; long long dbid; /* Obtain source and target DB pointers */ src = c->db; srcid = c->db->id; if (getLongLongFromObject(c->argv[2],&dbid) == REDIS_ERR || dbid < INT_MIN || dbid > INT_MAX || selectDb(c,dbid) == REDIS_ERR) { addReply(c,shared.outofrangeerr); return; } dst = c->db; selectDb(c,srcid); /* Back to the source DB */ /* If the user is moving using as target the same * DB as the source DB it is probably an error. */ if (src == dst) { addReply(c,shared.sameobjecterr); return; } /* Check if the element exists and get a reference */ o = lookupKeyWrite(c->db,c->argv[1]); if (!o) { addReply(c,shared.czero); return; } /* Return zero if the key already exists in the target DB */ if (lookupKeyWrite(dst,c->argv[1]) != NULL) { addReply(c,shared.czero); return; } dbAdd(dst,c->argv[1],o); incrRefCount(o); /* OK! key moved, free the entry in the source DB */ dbDelete(src,c->argv[1]); server.dirty++; addReply(c,shared.cone); }
void smemrmCommand(client *c) { long long ll_var; int mem_id; int free_cnt = 0; struct smem_t * smem_p = NULL; listNode *lnode; int j; for (j = 1; j < c->argc; j++){ // check the size if(getLongLongFromObject(c->argv[j],&ll_var) == C_OK){ //serverLog(LL_WARNING,"get share memory id: %lld", ll_var); mem_id = ll_var; // get the item from list lnode = listSearchKey(server.smem_list_available, &mem_id); if(lnode){ smem_p = lnode->value; // update the share memory used status server.share_memory_size -= smem_p->size; //serverLog(LL_WARNING,"[smemrmCommand] rm the id(%d) in list.", mem_id); listDelNode(server.smem_list_available, lnode); }else serverLog(LL_WARNING,"[smemrmCommand] not found the id(%d) in list, try to free.", mem_id); if(!smem_free_buffer(mem_id)){ free_cnt ++; } } } addReplyLongLong(c,free_cnt); return C_OK; }
void smemgetCommand(client *c) { long long ll_size; int size; int mem_id = -1; listNode *ln; listIter li; struct smem_t * smem_p = NULL; // check the size if(getLongLongFromObject(c->argv[1],&ll_size) == C_OK){ //serverLog(LL_WARNING,"[smemgetCommand] will get share memory size: %lld", ll_size); size = ll_size; // get buffer from list listRewind(server.smem_list_available, &li); while ((ln = listNext(&li)) != NULL) { smem_p = ln->value; // compare the size if((smem_p->state == SMEM_T_STATE_AVAILAVLE) && (size <= smem_p->size)){ smem_p->state = SMEM_T_STATE_USED; smem_p->cnt = 1; smem_p->free_cnt = 0; smem_p->last_time = server.unixtime; mem_id = smem_p->id; // move it to used list smemlistMoveNode(server.smem_list_available, server.smem_list_used, ln); break; } } if(mem_id == -1){ // check the share memory max limit if((server.share_memory_size + size) <= server.share_memory_limit){ // get buffer by use smem mem_id = smem_get_buffer(size); if(mem_id != -1){ smem_p = zmalloc(sizeof(struct smem_t)); if(smem_p == NULL){ mem_id = -1; serverLog(LL_WARNING,"[smemgetCommand] zmalloc failed."); }else{ smem_p->id = mem_id; smem_p->size = size; smem_p->state = SMEM_T_STATE_USED; smem_p->cnt = 1; smem_p->free_cnt = 0; smem_p->last_time = server.unixtime; // add itme to list listAddNodeTail(server.smem_list_used, smem_p); // update the share memory used status server.share_memory_size += size; } } }else{ serverLog(LL_WARNING,"[smemgetCommand] server.share_memory_size:%d + %d > server.share_memory_limit:%d", server.share_memory_size, size, server.share_memory_limit); } } } //serverLog(LL_WARNING,"[smemgetCommand] get share memory id: %d", mem_id); addReplyLongLong(c,mem_id); return C_OK; }