/** * @return -1: error, 0: item updated, 1: new item inserted */ int SSDB::zset(const Bytes &name, const Bytes &key, const Bytes &score, char log_type){ Transaction trans(binlogs); int ret = zset_one(this, name, key, score, log_type); if(ret >= 0){ if(ret > 0){ if(incr_zsize(this, name, ret) == -1){ return -1; } } leveldb::Status s = binlogs->commit(); if(!s.ok()){ log_error("zset error: %s", s.ToString().c_str()); return -1; } } return ret; }
int zset_incr(ldb_context_t* context, const ldb_slice_t* name, const ldb_slice_t* key, const ldb_meta_t* meta, int64_t by, int64_t* val){ int64_t old_score = 0; int ret = zset_get(context, name, key, &old_score); int retval = LDB_OK; if(ret == LDB_OK){ *val = old_score + by; }else if(ret == LDB_OK_NOT_EXIST){ *val = by; }else{ retval = ret; goto end; } ret = zset_one(context, name, key, meta, *val); if(ret >= 0){ if(ret > 0){ if(zset_incr_size(context, name, ret) == -1){ retval = LDB_ERR; goto end; } } char* errptr = NULL; ldb_context_writebatch_commit(context, &errptr); if(errptr!=NULL){ fprintf(stderr, "leveldb_write fail %s.\n", errptr); leveldb_free(errptr); retval = LDB_ERR; goto end; } retval = LDB_OK; }else{ retval = LDB_ERR; } end: return retval; }