diff --git a/mgclient_cpp/include/mgclient.hpp b/mgclient_cpp/include/mgclient.hpp index 9070f83..241fee6 100644 --- a/mgclient_cpp/include/mgclient.hpp +++ b/mgclient_cpp/include/mgclient.hpp @@ -113,6 +113,8 @@ class Client { /// \brief Fetches all results. std::optional>> FetchAll(); + const std::vector &GetColumns() const; + /// \brief Start a transaction. /// \return true when the transaction was successfully started, false /// otherwise. @@ -138,6 +140,7 @@ class Client { explicit Client(mg_session *session); mg_session *session_; + std::vector columns_; }; inline std::unique_ptr Client::Connect(const Client::Params ¶ms) { @@ -177,8 +180,9 @@ inline int Client::Init() { return mg_init(); } inline void Client::Finalize() { mg_finalize(); } inline bool Client::Execute(const std::string &statement) { + const mg_list *columns; int status = mg_session_run(session_, statement.c_str(), nullptr, nullptr, - nullptr, nullptr); + &columns, nullptr); if (status < 0) { return false; } @@ -188,13 +192,21 @@ inline bool Client::Execute(const std::string &statement) { return false; } + const size_t list_length = mg_list_size(columns); + columns_.clear(); + for (size_t i = 0; i < list_length; i++) { + columns_.push_back( + std::string(Value(mg_list_at(columns, i)).ValueString())); + } + return true; } inline bool Client::Execute(const std::string &statement, const ConstMap ¶ms) { + const mg_list *columns; int status = mg_session_run(session_, statement.c_str(), params.ptr(), - nullptr, nullptr, nullptr); + nullptr, &columns, nullptr); if (status < 0) { return false; } @@ -203,6 +215,14 @@ inline bool Client::Execute(const std::string &statement, if (status < 0) { return false; } + + const size_t list_length = mg_list_size(columns); + columns_.clear(); + for (size_t i = 0; i < list_length; i++) { + columns_.push_back( + std::string(Value(mg_list_at(columns, i)).ValueString())); + } + return true; } @@ -248,6 +268,10 @@ inline std::optional>> Client::FetchAll() { return data; } +inline const std::vector &Client::GetColumns() const { + return columns_; +} + inline bool Client::BeginTransaction() { return mg_session_begin_transaction(session_, nullptr) == 0; }