Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 17 additions & 23 deletions bindings/cpp/src/connection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,13 @@ Connection& Connection::operator=(Connection&& other) noexcept {
}

Result Connection::Create(const Configuration& config, Connection& out) {
try {
auto ffi_config = utils::to_ffi_config(config);
out.conn_ = ffi::new_connection(ffi_config);
return utils::make_ok();
} catch (const rust::Error& e) {
return utils::make_client_error(e.what());
} catch (const std::exception& e) {
return utils::make_client_error(e.what());
auto ffi_config = utils::to_ffi_config(config);
auto ffi_result = ffi::new_connection(ffi_config);
auto result = utils::from_ffi_result(ffi_result.result);
if (result.Ok()) {
out.conn_ = utils::ptr_from_ffi<ffi::Connection>(ffi_result);
}
return result;
}

bool Connection::Available() const { return conn_ != nullptr; }
Expand All @@ -65,30 +63,26 @@ Result Connection::GetAdmin(Admin& out) {
return utils::make_client_error("Connection not available");
}

try {
out.admin_ = conn_->get_admin();
return utils::make_ok();
} catch (const rust::Error& e) {
return utils::make_client_error(e.what());
} catch (const std::exception& e) {
return utils::make_client_error(e.what());
auto ffi_result = conn_->get_admin();
auto result = utils::from_ffi_result(ffi_result.result);
if (result.Ok()) {
out.admin_ = utils::ptr_from_ffi<ffi::Admin>(ffi_result);
}
return result;
}

Result Connection::GetTable(const TablePath& table_path, Table& out) {
if (!Available()) {
return utils::make_client_error("Connection not available");
}

try {
auto ffi_path = utils::to_ffi_table_path(table_path);
out.table_ = conn_->get_table(ffi_path);
return utils::make_ok();
} catch (const rust::Error& e) {
return utils::make_client_error(e.what());
} catch (const std::exception& e) {
return utils::make_client_error(e.what());
auto ffi_path = utils::to_ffi_table_path(table_path);
auto ffi_result = conn_->get_table(ffi_path);
auto result = utils::from_ffi_result(ffi_result.result);
if (result.Ok()) {
out.table_ = utils::ptr_from_ffi<ffi::Table>(ffi_result);
}
return result;
}

} // namespace fluss
8 changes: 8 additions & 0 deletions bindings/cpp/src/ffi_converter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

#pragma once

#include <cassert>

#include "fluss.hpp"
#include "lib.rs.h"

Expand All @@ -37,6 +39,12 @@ inline Result from_ffi_result(const ffi::FfiResult& ffi_result) {
return Result{ffi_result.error_code, std::string(ffi_result.error_message)};
}

template <typename T>
inline T* ptr_from_ffi(const ffi::FfiPtrResult& r) {
assert(r.ptr != 0 && "ptr_from_ffi: null pointer in FfiPtrResult");
return reinterpret_cast<T*>(r.ptr);
Comment thread
fresh-borzoni marked this conversation as resolved.
}

inline ffi::FfiTablePath to_ffi_table_path(const TablePath& path) {
ffi::FfiTablePath ffi_path;
ffi_path.database_name = rust::String(path.database_name);
Expand Down
Loading
Loading