Example #1
0
/**
 * @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;
}
Example #2
0
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;
}