int SSDB::hincr(const Bytes &name, const Bytes &key, int64_t by, std::string *new_val, char log_type){ Transaction trans(binlogs); int64_t val; std::string old; int ret = this->hget(name, key, &old); if(ret == -1){ return -1; }else if(ret == 0){ val = by; }else{ val = str_to_int64(old.data(), old.size()) + by; } *new_val = int64_to_str(val); ret = hset_one(this, name, key, *new_val, log_type); if(ret >= 0){ if(ret > 0){ if(incr_hsize(this, name, ret) == -1){ return -1; } } leveldb::Status s = binlogs->commit(); if(!s.ok()){ return -1; } } return ret; }
int SSDBImpl::hincr(const Bytes &name, const Bytes &key, int64_t by, int64_t *new_val, char log_type){ Transaction trans(binlogs); std::string old; int ret = this->hget(name, key, &old); if(ret == -1){ return -1; }else if(ret == 0){ *new_val = by; }else{ *new_val = str_to_int64(old) + by; if(errno != 0){ return 0; } } ret = hset_one(this, name, key, str(*new_val), log_type); if(ret == -1){ return -1; } if(ret >= 0){ if(ret > 0){ if(incr_hsize(this, name, ret) == -1){ return -1; } } leveldb::Status s = binlogs->commit(); if(!s.ok()){ return -1; } } return 1; }
int SSDB::multi_hset(const Bytes &name, const std::vector<Bytes> &kvs, int offset, char log_type){ Transaction trans(binlogs); int ret = 0; std::vector<Bytes>::const_iterator it; it = kvs.begin() + offset; for(; it != kvs.end(); it += 2){ const Bytes &key = *it; const Bytes &val = *(it + 1); int tmp = hset_one(this, name, key, val, log_type); if(tmp == -1){ return -1; } ret += tmp; } if(ret >= 0){ if(ret > 0){ if(incr_hsize(this, name, ret) == -1){ return -1; } } leveldb::Status s = binlogs->commit(); if(!s.ok()){ log_error("zdel error: %s", s.ToString().c_str()); return -1; } } return ret; }
int SSDB::hset(const Bytes &name, const Bytes &key, const Bytes &val, char log_type){ Transaction trans(binlogs); int ret = hset_one(this, name, key, val, log_type); if(ret >= 0){ if(ret > 0){ if(incr_hsize(this, name, ret) == -1){ return -1; } } leveldb::Status s = binlogs->commit(); if(!s.ok()){ return -1; } } return ret; }
int SSDBImpl::hmax_or_min(const Bytes &name, const Bytes &key, int64_t new_val, int64_t *ret_val, bool is_max, char log_type){ Transaction trans(binlogs); std::string old; int ret = this->hget(name, key, &old); if(ret == -1){ return -1; }else if(ret == 0){ *ret_val = new_val; }else{ int64_t old_val = str_to_int64(old); if(errno != 0){ return 0; } if (is_max) { *ret_val = old_val > new_val ? old_val : new_val; } else { *ret_val = old_val < new_val ? old_val : new_val; } } ret = hset_one(this, name, key, str(*ret_val), log_type); if(ret == -1){ return -1; } if(ret >= 0){ if(ret > 0){ if(incr_hsize(this, name, ret) == -1){ return -1; } } leveldb::Status s = binlogs->commit(); if(!s.ok()){ return -1; } } return 1; }