introduced execute_result

This commit is contained in:
Sascha Kühl 2026-02-10 11:57:09 +01:00
parent d9f9712487
commit 99677b0e21
28 changed files with 158 additions and 170 deletions

View File

@ -31,7 +31,7 @@ public:
[[nodiscard]] utils::result<utils::version, utils::error> client_version() const override; [[nodiscard]] utils::result<utils::version, utils::error> client_version() const override;
[[nodiscard]] utils::result<utils::version, utils::error> server_version() const override; [[nodiscard]] utils::result<utils::version, utils::error> server_version() const override;
utils::result<size_t, utils::error> execute(const std::string &stmt) override; utils::result<sql::execute_result, utils::error> execute(const std::string &stmt) override;
utils::result<std::unique_ptr<sql::statement_impl>, utils::error> prepare(const sql::query_context &context) override; utils::result<std::unique_ptr<sql::statement_impl>, utils::error> prepare(const sql::query_context &context) override;
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch(const sql::query_context &context) override; utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch(const sql::query_context &context) override;

View File

@ -14,7 +14,7 @@ public:
postgres_statement(PGconn *db, PGresult *res, std::string name, const sql::query_context &query); postgres_statement(PGconn *db, PGresult *res, std::string name, const sql::query_context &query);
~postgres_statement() override; ~postgres_statement() override;
utils::result<size_t, utils::error> execute(const sql::parameter_binder& bindings) override; utils::result<sql::execute_result, utils::error> execute(const sql::parameter_binder& bindings) override;
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch(const sql::parameter_binder& bindings) override; utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch(const sql::parameter_binder& bindings) override;
protected: protected:

View File

@ -142,18 +142,18 @@ utils::result<std::unique_ptr<sql::statement_impl>, utils::error> postgres_conne
return utils::ok(std::move(s)); return utils::ok(std::move(s));
} }
utils::result<size_t, utils::error> postgres_connection::execute(const std::string &stmt) { utils::result<sql::execute_result, utils::error> postgres_connection::execute(const std::string &stmt) {
PGresult *res = PQexec(conn_, stmt.c_str()); PGresult *res = PQexec(conn_, stmt.c_str());
if (const auto status = PQresultStatus(res); status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) { if (const auto status = PQresultStatus(res); status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) {
return utils::failure(make_error(sql::error_code::FAILURE, res, conn_, "Failed to execute", stmt)); return utils::failure(make_error(sql::error_code::FAILURE, res, conn_, "Failed to execute", stmt));
} }
const auto affected_rows = utils::to<size_t>(PQcmdTuples(res)); const size_t affected_rows = utils::to<size_t>(PQcmdTuples(res));
PQclear(res); PQclear(res);
return utils::ok(static_cast<size_t>(affected_rows)); return utils::ok(sql::execute_result{affected_rows});
} }
utils::basic_type oid2type(const Oid oid) { utils::basic_type oid2type(const Oid oid) {

View File

@ -1,4 +1,6 @@
#include "postgres_statement.hpp" #include "postgres_statement.hpp"
#include "matador/sql/execute_result.hpp"
#include "postgres_error.hpp" #include "postgres_error.hpp"
#include "postgres_parameter_binder.h" #include "postgres_parameter_binder.h"
#include "postgres_result_reader.hpp" #include "postgres_result_reader.hpp"
@ -16,7 +18,7 @@ postgres_statement::~postgres_statement() {
PQclear(res_); PQclear(res_);
} }
utils::result<size_t, utils::error> postgres_statement::execute(const sql::parameter_binder& bindings) { utils::result<sql::execute_result, utils::error> postgres_statement::execute(const sql::parameter_binder& bindings) {
const auto* postgres_bindings = dynamic_cast<const postgres_parameter_binder*>(&bindings); const auto* postgres_bindings = dynamic_cast<const postgres_parameter_binder*>(&bindings);
if (!postgres_bindings) { if (!postgres_bindings) {
return utils::failure(utils::error(sql::error_code::EXECUTE_FAILED, "Failed to cast bindings to postgres bindings")); return utils::failure(utils::error(sql::error_code::EXECUTE_FAILED, "Failed to cast bindings to postgres bindings"));
@ -40,7 +42,7 @@ utils::result<size_t, utils::error> postgres_statement::execute(const sql::param
PQclear(res); PQclear(res);
return utils::ok(value); return utils::ok(sql::execute_result{value});
} }
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> postgres_statement::fetch(const sql::parameter_binder& bindings) { utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> postgres_statement::fetch(const sql::parameter_binder& bindings) {

View File

@ -130,14 +130,14 @@ public:
[[nodiscard]] utils::result<sql::query_result<sql::record>, utils::error> [[nodiscard]] utils::result<sql::query_result<sql::record>, utils::error>
fetch_all(const sql::query_context &q) const; fetch_all(const sql::query_context &q) const;
[[nodiscard]] utils::result<size_t, utils::error> execute(const std::string &sql) const; [[nodiscard]] utils::result<sql::execute_result, utils::error> execute(const std::string &sql) const;
[[nodiscard]] std::vector<object::attribute> describe_table(const std::string &table_name) const; [[nodiscard]] std::vector<object::attribute> describe_table(const std::string &table_name) const;
[[nodiscard]] bool table_exists(const std::string &table_name) const; [[nodiscard]] bool table_exists(const std::string &table_name) const;
[[nodiscard]] utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch( [[nodiscard]] utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch(
const sql::query_context &ctx) const override; const sql::query_context &ctx) const override;
[[nodiscard]] utils::result<size_t, utils::error> execute(const sql::query_context &ctx) const override; [[nodiscard]] utils::result<sql::execute_result, utils::error> execute(const sql::query_context &ctx) const override;
[[nodiscard]] utils::result<sql::statement, utils::error> prepare(const sql::query_context &ctx) override; [[nodiscard]] utils::result<sql::statement, utils::error> prepare(const sql::query_context &ctx) override;
[[nodiscard]] std::string str(const sql::query_context &ctx) const override; [[nodiscard]] std::string str(const sql::query_context &ctx) const override;
[[nodiscard]] const sql::dialect &dialect() const override; [[nodiscard]] const sql::dialect &dialect() const override;

View File

@ -9,6 +9,7 @@
namespace matador::sql { namespace matador::sql {
class executor; class executor;
class statement; class statement;
struct execute_result;
struct query_context; struct query_context;
} }
@ -18,7 +19,7 @@ class executable_query : public query_intermediate {
public: public:
using query_intermediate::query_intermediate; using query_intermediate::query_intermediate;
[[nodiscard]] utils::result<size_t, utils::error> execute(const sql::executor &exec) const; [[nodiscard]] utils::result<sql::execute_result, utils::error> execute(const sql::executor &exec) const;
[[nodiscard]] utils::result<sql::statement, utils::error> prepare(sql::executor &exec) const; [[nodiscard]] utils::result<sql::statement, utils::error> prepare(sql::executor &exec) const;
[[nodiscard]] sql::query_context compile(const sql::executor &exec) const; [[nodiscard]] sql::query_context compile(const sql::executor &exec) const;
[[nodiscard]] std::string str(const sql::executor &exec) const; [[nodiscard]] std::string str(const sql::executor &exec) const;

View File

@ -5,6 +5,7 @@
#include "matador/sql/abstract_sql_logger.hpp" #include "matador/sql/abstract_sql_logger.hpp"
#include "matador/sql/connection_info.hpp" #include "matador/sql/connection_info.hpp"
#include "matador/sql/execute_result.hpp"
#include "matador/sql/executor.hpp" #include "matador/sql/executor.hpp"
#include "matador/sql/resolver_service.hpp" #include "matador/sql/resolver_service.hpp"
#include "matador/sql/statement.hpp" #include "matador/sql/statement.hpp"
@ -134,10 +135,8 @@ public:
[[nodiscard]] utils::result<bool, utils::error> exists(const std::string &schema_name, const std::string &table_name) const; [[nodiscard]] utils::result<bool, utils::error> exists(const std::string &schema_name, const std::string &table_name) const;
[[nodiscard]] utils::result<bool, utils::error> exists(const std::string &table_name) const; [[nodiscard]] utils::result<bool, utils::error> exists(const std::string &table_name) const;
[[nodiscard]] utils::result<size_t, utils::error> execute(const std::string &sql) const;
[[nodiscard]] utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const query_context &ctx) const override; [[nodiscard]] utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const query_context &ctx) const override;
[[nodiscard]] utils::result<size_t, utils::error> execute(const query_context &ctx) const override; [[nodiscard]] utils::result<execute_result, utils::error> execute(const query_context &ctx) const override;
[[nodiscard]] utils::result<statement, utils::error> prepare(const query_context &ctx) override; [[nodiscard]] utils::result<statement, utils::error> prepare(const query_context &ctx) override;
[[nodiscard]] std::string str( const query_context& ctx ) const override; [[nodiscard]] std::string str( const query_context& ctx ) const override;

View File

@ -0,0 +1,11 @@
#ifndef MATADOR_EXECUTE_RESULT_HPP
#define MATADOR_EXECUTE_RESULT_HPP
#include <vector>
namespace matador::sql {
struct execute_result {
size_t affected_rows{};
std::vector<long long> insert_ids{};
};
}
#endif // MATADOR_EXECUTE_RESULT_HPP

View File

@ -11,6 +11,7 @@
namespace matador::sql { namespace matador::sql {
struct query_context; struct query_context;
struct execute_result;
class query_result_impl; class query_result_impl;
class statement; class statement;
@ -18,7 +19,7 @@ class executor {
public: public:
virtual ~executor() = default; virtual ~executor() = default;
[[nodiscard]] virtual const class dialect& dialect() const = 0; [[nodiscard]] virtual const class dialect& dialect() const = 0;
[[nodiscard]] virtual utils::result<size_t, utils::error> execute(const query_context &ctx) const = 0; [[nodiscard]] virtual utils::result<execute_result, utils::error> execute(const query_context &ctx) const = 0;
[[nodiscard]] virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const query_context &ctx) const = 0; [[nodiscard]] virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const query_context &ctx) const = 0;
[[nodiscard]] virtual utils::result<statement, utils::error> prepare(const query_context &ctx) = 0; [[nodiscard]] virtual utils::result<statement, utils::error> prepare(const query_context &ctx) = 0;
[[nodiscard]] virtual std::string str(const query_context &ctx) const = 0; [[nodiscard]] virtual std::string str(const query_context &ctx) const = 0;

View File

@ -6,7 +6,7 @@
#include "matador/object/attribute.hpp" #include "matador/object/attribute.hpp"
#include "matador/sql/connection_info.hpp" #include "matador/sql/connection_info.hpp"
#include "matador/sql/query_context.hpp" #include "matador/sql/execute_result.hpp"
#include "matador/utils/error.hpp" #include "matador/utils/error.hpp"
#include "matador/utils/result.hpp" #include "matador/utils/result.hpp"
@ -18,6 +18,7 @@ using blob_type_t = std::vector<unsigned char>;
namespace matador::sql { namespace matador::sql {
struct query_context;
class query_result_impl; class query_result_impl;
class statement_impl; class statement_impl;
@ -34,7 +35,7 @@ public:
[[nodiscard]] virtual utils::result<utils::version, utils::error> client_version() const = 0; [[nodiscard]] virtual utils::result<utils::version, utils::error> client_version() const = 0;
[[nodiscard]] virtual utils::result<utils::version, utils::error> server_version() const = 0; [[nodiscard]] virtual utils::result<utils::version, utils::error> server_version() const = 0;
virtual utils::result<size_t, utils::error> execute(const std::string &stmt) = 0; virtual utils::result<execute_result, utils::error> execute(const std::string &stmt) = 0;
virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const query_context &context) = 0; virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const query_context &context) = 0;
virtual utils::result<std::unique_ptr<statement_impl>, utils::error> prepare(const query_context &context) = 0; virtual utils::result<std::unique_ptr<statement_impl>, utils::error> prepare(const query_context &context) = 0;

View File

@ -13,6 +13,7 @@
#include <memory> #include <memory>
namespace matador::sql { namespace matador::sql {
struct execute_result;
class query_result_impl; class query_result_impl;
class sql_error; class sql_error;
@ -23,7 +24,7 @@ protected:
public: public:
virtual ~statement_impl() = default; virtual ~statement_impl() = default;
virtual utils::result<size_t, utils::error> execute(const parameter_binder& bindings) = 0; virtual utils::result<execute_result, utils::error> execute(const parameter_binder& bindings) = 0;
virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const parameter_binder& bindings) = 0; virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(const parameter_binder& bindings) = 0;
template < class Type > template < class Type >

View File

@ -12,7 +12,7 @@ protected:
public: public:
virtual ~statement_proxy() = default; virtual ~statement_proxy() = default;
virtual utils::result<size_t, utils::error> execute(parameter_binder& bindings) = 0; virtual utils::result<execute_result, utils::error> execute(parameter_binder& bindings) = 0;
virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(parameter_binder& bindings) = 0; virtual utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(parameter_binder& bindings) = 0;
template<class Type> template<class Type>

View File

@ -71,7 +71,7 @@ public:
* *
* @return The number of affected rows * @return The number of affected rows
*/ */
[[nodiscard]] utils::result<size_t, utils::error> execute() const; [[nodiscard]] utils::result<execute_result, utils::error> execute() const;
/** /**
* Fetches the result of the prepared * Fetches the result of the prepared

View File

@ -14,8 +14,8 @@ public:
*/ */
primary_key_attribute() = default; primary_key_attribute() = default;
/** /**
* Creates primary_key_attribute instance * Creates a primary_key_attribute instance with a
* with given size. * given size.
* *
* @param size Size of the attribute * @param size Size of the attribute
*/ */
@ -44,7 +44,7 @@ public:
[[nodiscard]] generator_type generator() const; [[nodiscard]] generator_type generator() const;
private: private:
size_t size_ = 0; size_t size_ = 0;
generator_type generator_ = generator_type::MANUALLY; generator_type generator_ = generator_type::Manually;
}; };
const primary_key_attribute default_pk_attributes {}; const primary_key_attribute default_pk_attributes {};

View File

@ -3,11 +3,11 @@
namespace matador::utils { namespace matador::utils {
enum class generator_type { enum class generator_type {
MANUALLY, Manually, /**< User sets the primary key value manually. */
AUTO, Auto, /**< Matador chooses the best generator type depending on the underlying dbms. */
IDENTITY, Identity, /**< DBMS automatically generates the primary key value. */
SEQUENCE, Sequence, /**< DBMS automatically generates the primary key value by using a sequence table. */
TABLE Table /**< DBMS automatically generates the primary key value by using a table. */
}; };
} }
#endif //PRIMARY_KEY_GENERATOR_TYPE_HPP #endif //PRIMARY_KEY_GENERATOR_TYPE_HPP

View File

@ -76,6 +76,7 @@ add_library(matador-orm STATIC
../../include/matador/sql/dialect_builder.hpp ../../include/matador/sql/dialect_builder.hpp
../../include/matador/sql/dialect_token.hpp ../../include/matador/sql/dialect_token.hpp
../../include/matador/sql/error_code.hpp ../../include/matador/sql/error_code.hpp
../../include/matador/sql/execute_result.hpp
../../include/matador/sql/executor.hpp ../../include/matador/sql/executor.hpp
../../include/matador/sql/field.hpp ../../include/matador/sql/field.hpp
../../include/matador/sql/interface/connection_impl.hpp ../../include/matador/sql/interface/connection_impl.hpp

View File

@ -60,7 +60,7 @@ utils::result<sql::query_result<sql::record>, utils::error> session::fetch_all(c
return utils::ok(sql::query_result<sql::record>{std::move(*res), prototype}); return utils::ok(sql::query_result<sql::record>{std::move(*res), prototype});
} }
utils::result<size_t, utils::error> session::execute(const std::string &sql) const { utils::result<sql::execute_result, utils::error> session::execute(const std::string &sql) const {
return execute(sql::query_context{sql}); return execute(sql::query_context{sql});
} }
@ -102,7 +102,7 @@ utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> session::fe
} }
} }
utils::result<size_t, utils::error> session::execute(const sql::query_context& ctx) const { utils::result<sql::execute_result, utils::error> session::execute(const sql::query_context& ctx) const {
if (const auto result = cache_.acquire(ctx); !result) { if (const auto result = cache_.acquire(ctx); !result) {
return utils::failure(result.err()); return utils::failure(result.err());
} else if (auto exec_result = result->execute(); !exec_result) { } else if (auto exec_result = result->execute(); !exec_result) {

View File

@ -1,12 +1,13 @@
#include "matador/query/intermediates/executable_query.hpp" #include "matador/query/intermediates/executable_query.hpp"
#include "matador/query/query_builder.hpp" #include "matador/query/query_builder.hpp"
#include "matador/sql/execute_result.hpp"
#include "matador/sql/executor.hpp" #include "matador/sql/executor.hpp"
#include "matador/sql/statement.hpp" #include "matador/sql/statement.hpp"
namespace matador::query { namespace matador::query {
utils::result<size_t, utils::error> executable_query::execute(const sql::executor &exec) const { utils::result<sql::execute_result, utils::error> executable_query::execute(const sql::executor &exec) const {
query_builder compiler; query_builder compiler;
return exec.execute(compiler.compile(*context_, exec.dialect(), std::nullopt)); return exec.execute(compiler.compile(*context_, exec.dialect(), std::nullopt));
} }

View File

@ -56,7 +56,7 @@ utils::result<void, utils::error> schema::create(const sql::connection &conn) co
.compile(conn); .compile(conn);
std::cout << ctx.sql << std::endl; std::cout << ctx.sql << std::endl;
if (auto result = conn.execute(ctx.sql); !result) { if (auto result = conn.execute(ctx); !result) {
return utils::failure(result.err()); return utils::failure(result.err());
} }
} }
@ -70,7 +70,7 @@ utils::result<void, utils::error> schema::create(const sql::connection &conn) co
auto ctx = build_add_constraint_context(node, cons, conn); auto ctx = build_add_constraint_context(node, cons, conn);
std::cout << ctx.sql << std::endl; std::cout << ctx.sql << std::endl;
if (auto result = conn.execute(ctx.sql); !result) { if (auto result = conn.execute(ctx); !result) {
return utils::failure(result.err()); return utils::failure(result.err());
} }
} }
@ -84,7 +84,7 @@ utils::result<void, utils::error> schema::create(const sql::connection &conn) co
auto ctx = build_add_constraint_context(node, cons, conn); auto ctx = build_add_constraint_context(node, cons, conn);
std::cout << ctx.sql << std::endl; std::cout << ctx.sql << std::endl;
if (auto result = conn.execute(ctx.sql); !result) { if (auto result = conn.execute(ctx); !result) {
return utils::failure(result.err()); return utils::failure(result.err());
} }
} }
@ -105,7 +105,7 @@ utils::result<void, utils::error> schema::drop(const sql::connection &conn) cons
.compile(conn); .compile(conn);
std::cout << ctx.sql << std::endl; std::cout << ctx.sql << std::endl;
if (auto result = conn.execute(ctx.sql); !result) { if (auto result = conn.execute(ctx); !result) {
return utils::failure(result.err()); return utils::failure(result.err());
} }
} }
@ -123,7 +123,7 @@ utils::result<void, utils::error> schema::drop(const sql::connection &conn) cons
.compile(conn); .compile(conn);
std::cout << ctx.sql << std::endl; std::cout << ctx.sql << std::endl;
if (auto result = conn.execute(ctx.sql); !result) { if (auto result = conn.execute(ctx); !result) {
return utils::failure(result.err()); return utils::failure(result.err());
} }
} }
@ -136,7 +136,7 @@ utils::result<void, utils::error> schema::drop(const sql::connection &conn) cons
.compile(conn); .compile(conn);
std::cout << ctx.sql << std::endl; std::cout << ctx.sql << std::endl;
if (auto result = conn.execute(ctx.sql); !result) { if (auto result = conn.execute(ctx); !result) {
return utils::failure(result.err()); return utils::failure(result.err());
} }
} }

View File

@ -18,7 +18,7 @@ public:
explicit connection_statement_proxy(std::unique_ptr<statement_impl>&& stmt) explicit connection_statement_proxy(std::unique_ptr<statement_impl>&& stmt)
: statement_proxy(std::move(stmt)) {} : statement_proxy(std::move(stmt)) {}
utils::result<size_t, utils::error> execute(parameter_binder& bindings) override { utils::result<execute_result, utils::error> execute(parameter_binder& bindings) override {
return statement_->execute(bindings); return statement_->execute(bindings);
} }
utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(parameter_binder& bindings) override { utils::result<std::unique_ptr<query_result_impl>, utils::error> fetch(parameter_binder& bindings) override {
@ -163,53 +163,22 @@ utils::result<bool, utils::error> connection::exists(const std::string &table_na
return connection_->exists(dialect().default_schema_name(), table_name); return connection_->exists(dialect().default_schema_name(), table_name);
} }
utils::result<size_t, utils::error> connection::execute(const std::string &sql) const {
logger_->on_execute(sql);
std::cout << sql << std::endl;
return connection_->execute(sql);
}
bool has_unknown_columns(const std::vector<object::attribute> &columns) { bool has_unknown_columns(const std::vector<object::attribute> &columns) {
return std::any_of(std::begin(columns), std::end(columns), [](const auto &col) { return std::any_of(std::begin(columns), std::end(columns), [](const auto &col) {
return col.type() == utils::basic_type::Null; return col.type() == utils::basic_type::Null;
}); });
} }
// query_result<record> connection::fetch(const query_context &ctx) const
// {
// if (ctx.prototype.empty() || is_unknown(ctx.prototype)) {
// const auto table_prototype = describe(ctx.table.name);
// for (auto &col : ctx.prototype) {
// const auto rit = std::find_if(std::begin(table_prototype), std::end(table_prototype), [&col](const auto &value) {
// return value.name() == col.name();
// });
// if (col.type() == data_type::type_unknown && rit != table_prototype.end()) {
// const_cast<column_definition&>(col).type(rit->type());
// }
// }
// }
// // auto it = prototypes_.find(q.table_name);
// // if (it == prototypes_.end()) {
// // it = prototypes_.emplace(q.table_name, describe(q.table_name)).first;
// // }
// // // adjust columns from given query
// // for (auto &col : q.prototype) {
// // if (const auto rit = it->second.find(col.name()); col.type() == data_type_t::type_unknown && rit != it->second.end()) {
// // const_cast<column&>(col).type(rit->type());
// // }
// // }
// auto res = fetch(ctx.sql);
// return query_result<record>{std::move(res), ctx.prototype};
// }
utils::result<std::unique_ptr<query_result_impl>, utils::error> connection::fetch(const query_context &ctx) const { utils::result<std::unique_ptr<query_result_impl>, utils::error> connection::fetch(const query_context &ctx) const {
logger_->on_fetch(ctx.sql); logger_->on_fetch(ctx.sql);
std::cout << ctx.sql << std::endl; std::cout << ctx.sql << std::endl;
return connection_->fetch(ctx); return connection_->fetch(ctx);
} }
utils::result<size_t, utils::error> connection::execute(const query_context& ctx) const { utils::result<execute_result, utils::error> connection::execute(const query_context& ctx) const {
return execute(ctx.sql); logger_->on_execute(ctx.sql);
std::cout << ctx.sql << std::endl;
return connection_->execute(ctx.sql);
} }
utils::result<statement, utils::error> connection::prepare(const query_context &ctx) { utils::result<statement, utils::error> connection::prepare(const query_context &ctx) {

View File

@ -1,4 +1,5 @@
#include "matador/sql/statement.hpp" #include "matador/sql/statement.hpp"
#include "matador/sql/execute_result.hpp"
#include "matador/sql/record.hpp" #include "matador/sql/record.hpp"
#include <algorithm> #include <algorithm>
@ -49,7 +50,7 @@ statement &statement::bind(const size_t pos, std::string &val, const size_t size
return *this; return *this;
} }
utils::result<size_t, utils::error> statement::execute() const { utils::result<execute_result, utils::error> statement::execute() const {
logger_->on_execute(statement_proxy_->sql()); logger_->on_execute(statement_proxy_->sql());
std::cout << statement_proxy_->sql() << std::endl; std::cout << statement_proxy_->sql() << std::endl;
return statement_proxy_->execute(*bindings_); return statement_proxy_->execute(*bindings_);

View File

@ -31,10 +31,10 @@ public:
, connection_id_(connection_id) , connection_id_(connection_id)
, bus_(bus) {} , bus_(bus) {}
utils::result<size_t, utils::error> execute(parameter_binder& bindings) override { utils::result<execute_result, utils::error> execute(parameter_binder& bindings) override {
execution_metrics metrics{std::chrono::steady_clock::now()}; execution_metrics metrics{std::chrono::steady_clock::now()};
auto result = try_with_retry([this, &bindings, &metrics]() -> utils::result<size_t, utils::error> { auto result = try_with_retry([this, &bindings, &metrics]() -> utils::result<execute_result, utils::error> {
const auto query = sql(); const auto query = sql();
if (!try_lock()) { if (!try_lock()) {
++metrics.lock_attempts; ++metrics.lock_attempts;

View File

@ -73,7 +73,7 @@ TEST_CASE_METHOD(QueryFixture, "Insert and select basic datatypes", "[query][dat
.values(t) .values(t)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto result = query::select<types>(repo) auto result = query::select<types>(repo)
.from("types") .from("types")
@ -110,7 +110,7 @@ TEST_CASE_METHOD( QueryFixture, "Test quoted identifier", "[query][quotes][ident
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("quotes"); tables_to_drop.emplace("quotes");
// check table description // check table description
@ -131,7 +131,7 @@ TEST_CASE_METHOD( QueryFixture, "Test quoted identifier", "[query][quotes][ident
.values({"Berlin", "London"}) .values({"Berlin", "London"})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto row = query::select({"from", "to"}) auto row = query::select({"from", "to"})
.from("quotes") .from("quotes")
@ -147,7 +147,7 @@ TEST_CASE_METHOD( QueryFixture, "Test quoted identifier", "[query][quotes][ident
.where("from"_col == "Berlin") .where("from"_col == "Berlin")
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
row = query::select({"from", "to"}) row = query::select({"from", "to"})
.from("quotes") .from("quotes")
@ -182,7 +182,7 @@ TEST_CASE_METHOD( QueryFixture, "Test quoted column names", "[query][quotes][col
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
const auto columns = db.describe("quotes"); const auto columns = db.describe("quotes");
REQUIRE(columns.is_ok()); REQUIRE(columns.is_ok());
@ -196,7 +196,7 @@ TEST_CASE_METHOD( QueryFixture, "Test quoted column names", "[query][quotes][col
.table("quotes") .table("quotes")
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
} }
} }
@ -208,7 +208,7 @@ TEST_CASE_METHOD(QueryFixture, "Test quoted literals", "[query][quotes][literals
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("escapes"); tables_to_drop.emplace("escapes");
res = query::insert() res = query::insert()
@ -216,7 +216,7 @@ TEST_CASE_METHOD(QueryFixture, "Test quoted literals", "[query][quotes][literals
.values({"text"}) .values({"text"})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto row = query::select({"name"}) auto row = query::select({"name"})
.from("escapes") .from("escapes")
@ -230,7 +230,7 @@ TEST_CASE_METHOD(QueryFixture, "Test quoted literals", "[query][quotes][literals
.set({{"name", "text'd"}}) .set({{"name", "text'd"}})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
row = query::select({"name"}) row = query::select({"name"})
.from("escapes") .from("escapes")
@ -244,7 +244,7 @@ TEST_CASE_METHOD(QueryFixture, "Test quoted literals", "[query][quotes][literals
.set({{"name", "text\nhello\tworld"}}) .set({{"name", "text\nhello\tworld"}})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
row = query::select({"name"}) row = query::select({"name"})
.from("escapes") .from("escapes")
@ -258,7 +258,7 @@ TEST_CASE_METHOD(QueryFixture, "Test quoted literals", "[query][quotes][literals
.set({{"name", "text \"text\""}}) .set({{"name", "text \"text\""}})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
row = query::select({"name"}) row = query::select({"name"})
.from("escapes") .from("escapes")
@ -350,7 +350,7 @@ TEST_CASE_METHOD(QueryFixture, "Test primary key", "[query][primary key]") {
.values(pk1) .values(pk1)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto row = query::select<pk>(repo) auto row = query::select<pk>(repo)
.from("pk") .from("pk")
@ -377,7 +377,7 @@ TEST_CASE_METHOD(QueryFixture, "Test primary key prepared", "[query][primary key
auto res = stmt->bind(pk1) auto res = stmt->bind(pk1)
.execute(); .execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
stmt = query::select<pk>(repo) stmt = query::select<pk>(repo)
.from("pk") .from("pk")
@ -418,7 +418,7 @@ TEST_CASE_METHOD(QueryFixture, "Test primary key prepared", "[query][primary key
// .table<appointment>("appointment", schema) // .table<appointment>("appointment", schema)
// .execute(db); // .execute(db);
// REQUIRE(res.is_ok()); // REQUIRE(res.is_ok());
// REQUIRE(*res == 0); // REQUIRE(res->affected_rows == 0);
// tables_to_drop.emplace("appointment"); // tables_to_drop.emplace("appointment");
// //
// auto dinner = appointment{ 1, "dinner" }; // auto dinner = appointment{ 1, "dinner" };
@ -430,7 +430,7 @@ TEST_CASE_METHOD(QueryFixture, "Test primary key prepared", "[query][primary key
// .values(dinner) // .values(dinner)
// .execute(db); // .execute(db);
// REQUIRE(res.is_ok()); // REQUIRE(res.is_ok());
// REQUIRE(*res == 1); // REQUIRE(res->affected_rows == 1);
// //
// auto row = query::select<appointment>(schema) // auto row = query::select<appointment>(schema)
// .from("appointment") // .from("appointment")
@ -453,7 +453,7 @@ TEST_CASE_METHOD(QueryFixture, "Test primary key prepared", "[query][primary key
// }) // })
// .execute(db); // .execute(db);
// REQUIRE(res.is_ok()); // REQUIRE(res.is_ok());
// REQUIRE(*res == 0); // REQUIRE(res->affected_rows == 0);
// tables_to_drop.emplace("person"); // tables_to_drop.emplace("person");
// //
// res = query::insert() // res = query::insert()
@ -461,14 +461,14 @@ TEST_CASE_METHOD(QueryFixture, "Test primary key prepared", "[query][primary key
// .values({1, "george"}) // .values({1, "george"})
// .execute(db); // .execute(db);
// REQUIRE(res.is_ok()); // REQUIRE(res.is_ok());
// REQUIRE(*res == 1); // REQUIRE(res->affected_rows == 1);
// //
// res = query::insert() // res = query::insert()
// .into("person", {"id", "last_name"}) // .into("person", {"id", "last_name"})
// .values({2, "clooney"}) // .values({2, "clooney"})
// .execute(db); // .execute(db);
// REQUIRE(res.is_ok()); // REQUIRE(res.is_ok());
// REQUIRE(*res == 1); // REQUIRE(res->affected_rows == 1);
// //
// auto result = query::select({"id", "first_name", "last_name"}) // auto result = query::select({"id", "first_name", "last_name"})
// .from("person") // .from("person")
@ -498,7 +498,7 @@ TEST_CASE_METHOD(QueryFixture, "Test primary key prepared", "[query][primary key
// }) // })
// .execute(db); // .execute(db);
// REQUIRE(res.is_ok()); // REQUIRE(res.is_ok());
// REQUIRE(*res == 0); // REQUIRE(res->affected_rows == 0);
// tables_to_drop.emplace("person"); // tables_to_drop.emplace("person");
// //
// res = query::insert() // res = query::insert()
@ -506,14 +506,14 @@ TEST_CASE_METHOD(QueryFixture, "Test primary key prepared", "[query][primary key
// .values({1, "george"}) // .values({1, "george"})
// .execute(db); // .execute(db);
// REQUIRE(res.is_ok()); // REQUIRE(res.is_ok());
// REQUIRE(*res == 1); // REQUIRE(res->affected_rows == 1);
// //
// res = query::insert() // res = query::insert()
// .into("person", {"id", "last_name"}) // .into("person", {"id", "last_name"})
// .values({2, "clooney"}) // .values({2, "clooney"})
// .execute(db); // .execute(db);
// REQUIRE(res.is_ok()); // REQUIRE(res.is_ok());
// REQUIRE(*res == 1); // REQUIRE(res->affected_rows == 1);
// //
// auto result = query::select({"id", "first_name", "last_name"}) // auto result = query::select({"id", "first_name", "last_name"})
// .from("person") // .from("person")

View File

@ -52,7 +52,7 @@ TEST_CASE_METHOD(QueryFixture, "Test all data types for record", "[query][record
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
check_table_exists("types"); check_table_exists("types");
tables_to_drop.emplace("types"); tables_to_drop.emplace("types");
@ -95,7 +95,7 @@ TEST_CASE_METHOD(QueryFixture, "Test all data types for record", "[query][record
.values({id, c, s, i, ll, uc, us, ui, ull, b, f, d, str, varchar, md, mt, bin}) .values({id, c, s, i, ll, uc, us, ui, ull, b, f, d, str, varchar, md, mt, bin})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 1); REQUIRE(res->affected_rows == 1);
auto result = query::select(cols) auto result = query::select(cols)
.from("types") .from("types")
@ -139,7 +139,7 @@ TEST_CASE_METHOD(QueryFixture, "Create and drop table statement", "[query][recor
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
check_table_exists("person"); check_table_exists("person");
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
@ -148,7 +148,7 @@ TEST_CASE_METHOD(QueryFixture, "Create and drop table statement", "[query][recor
.table("person") .table("person")
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
check_table_not_exists("person"); check_table_not_exists("person");
} }
@ -167,7 +167,7 @@ TEST_CASE_METHOD(QueryFixture, "Create and drop table statement with foreign key
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
check_table_exists("airplane"); check_table_exists("airplane");
tables_to_drop.emplace("airplane"); tables_to_drop.emplace("airplane");
@ -185,7 +185,7 @@ TEST_CASE_METHOD(QueryFixture, "Create and drop table statement with foreign key
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
check_table_exists("flight"); check_table_exists("flight");
tables_to_drop.emplace("flight"); tables_to_drop.emplace("flight");
@ -194,7 +194,7 @@ TEST_CASE_METHOD(QueryFixture, "Create and drop table statement with foreign key
.table("flight") .table("flight")
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
check_table_not_exists("flight"); check_table_not_exists("flight");
@ -202,7 +202,7 @@ TEST_CASE_METHOD(QueryFixture, "Create and drop table statement with foreign key
.table("airplane") .table("airplane")
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
check_table_not_exists("airplane"); check_table_not_exists("airplane");
} }
@ -220,7 +220,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute insert record statement", "[query][recor
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
res = query::insert() res = query::insert()
@ -228,7 +228,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute insert record statement", "[query][recor
.values({7, "george", 45}) .values({7, "george", 45})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 1); REQUIRE(res->affected_rows == 1);
auto result = query::select({"id", "name", "age"}) auto result = query::select({"id", "name", "age"})
.from("person") .from("person")
@ -263,7 +263,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute insert record statement with foreign key
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("airplane"); tables_to_drop.emplace("airplane");
res = query::create() res = query::create()
@ -279,7 +279,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute insert record statement with foreign key
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("flight"); tables_to_drop.emplace("flight");
std::vector<std::vector<database_type>> values_list{ std::vector<std::vector<database_type>> values_list{
@ -294,7 +294,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute insert record statement with foreign key
.values(std::move(values)) .values(std::move(values))
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 1); REQUIRE(res->affected_rows == 1);
} }
auto count = query::select({count_all()}) auto count = query::select({count_all()})
@ -309,7 +309,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute insert record statement with foreign key
.values({4, 1, "George"}) .values({4, 1, "George"})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 1); REQUIRE(res->affected_rows == 1);
} }
TEST_CASE_METHOD(QueryFixture, "Execute update record statement", "[query][record]") TEST_CASE_METHOD(QueryFixture, "Execute update record statement", "[query][record]")
@ -326,7 +326,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute update record statement", "[query][recor
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
res = query::insert() res = query::insert()
@ -335,7 +335,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute update record statement", "[query][recor
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 1); REQUIRE(res->affected_rows == 1);
res = query::update("person") res = query::update("person")
.set({{"id", 7}, .set({{"id", 7},
@ -344,7 +344,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute update record statement", "[query][recor
.where("id"_col == 7) .where("id"_col == 7)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 1); REQUIRE(res->affected_rows == 1);
auto result = query::select({"id", "name", "age"}) auto result = query::select({"id", "name", "age"})
.from("person") .from("person")
@ -379,7 +379,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute select statement", "[query][record]")
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
std::vector<std::vector<database_type>> values_list{ std::vector<std::vector<database_type>> values_list{
@ -395,7 +395,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute select statement", "[query][record]")
.values(std::move(values)) .values(std::move(values))
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 1); REQUIRE(res->affected_rows == 1);
} }
auto result = query::select({"id", "name", "age"}) auto result = query::select({"id", "name", "age"})
@ -439,7 +439,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute select statement with order by", "[query
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
std::vector<std::vector<database_type>> values_list{ std::vector<std::vector<database_type>> values_list{
@ -455,7 +455,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute select statement with order by", "[query
.values(std::move(values)) .values(std::move(values))
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 1); REQUIRE(res->affected_rows == 1);
} }
auto result = query::select({"id", "name", "age"}) auto result = query::select({"id", "name", "age"})
@ -485,7 +485,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute select statement with group by and order
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
std::vector<std::vector<database_type>> values_list{ std::vector<std::vector<database_type>> values_list{
@ -503,7 +503,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute select statement with group by and order
.values(std::move(values)) .values(std::move(values))
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(res.value() == 1); REQUIRE(res->affected_rows == 1);
} }
auto result = query::select({count("age").as("age_count"), "age"}) auto result = query::select({count("age").as("age_count"), "age"})
@ -538,7 +538,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute delete statement", "[query][record]") {
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
res = query::insert() res = query::insert()
@ -546,13 +546,13 @@ TEST_CASE_METHOD(QueryFixture, "Execute delete statement", "[query][record]") {
.values({1, "george", 45}) .values({1, "george", 45})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
res = query::insert() res = query::insert()
.into("person", {"id", "name", "age"}) .into("person", {"id", "name", "age"})
.values({2, "jane", 45}) .values({2, "jane", 45})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto count = query::select({count_all()}) auto count = query::select({count_all()})
.from("person") .from("person")
@ -566,7 +566,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute delete statement", "[query][record]") {
.where("id"_col == 1) .where("id"_col == 1)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
count = query::select({count_all()}) count = query::select({count_all()})
.from("person") .from("person")
@ -584,7 +584,7 @@ TEST_CASE_METHOD(QueryFixture, "Test quoted identifier record", "[query][record]
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("quotes"); tables_to_drop.emplace("quotes");
// check table description // check table description
@ -608,7 +608,7 @@ TEST_CASE_METHOD(QueryFixture, "Test quoted identifier record", "[query][record]
.values({"Berlin", "London"}) .values({"Berlin", "London"})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto result = query::select({"from", "to"}) auto result = query::select({"from", "to"})
.from("quotes") .from("quotes")
@ -624,7 +624,7 @@ TEST_CASE_METHOD(QueryFixture, "Test quoted identifier record", "[query][record]
.where("from"_col == "Berlin") .where("from"_col == "Berlin")
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
result = query::select({"from", "to"}) result = query::select({"from", "to"})
.from("quotes") .from("quotes")
@ -649,7 +649,7 @@ TEST_CASE_METHOD(QueryFixture, "Test create record", "[query][record][create]")
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
check_table_exists("person"); check_table_exists("person");
@ -676,7 +676,7 @@ TEST_CASE_METHOD(QueryFixture, "Test insert record", "[query][record][insert]")
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
check_table_exists("person"); check_table_exists("person");
@ -686,7 +686,7 @@ TEST_CASE_METHOD(QueryFixture, "Test insert record", "[query][record][insert]")
.values({1, "hans", 45}) .values({1, "hans", 45})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto row = query::select({"id", "name", "age"}) auto row = query::select({"id", "name", "age"})
.from("person") .from("person")
@ -713,7 +713,7 @@ TEST_CASE_METHOD(QueryFixture, "Test update record", "[query][record][update]")
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
check_table_exists("person"); check_table_exists("person");
@ -723,7 +723,7 @@ TEST_CASE_METHOD(QueryFixture, "Test update record", "[query][record][update]")
.values({1, "hans", 45}) .values({1, "hans", 45})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto row = query::select({"id", "name", "age"}) auto row = query::select({"id", "name", "age"})
.from("person") .from("person")
@ -740,7 +740,7 @@ TEST_CASE_METHOD(QueryFixture, "Test update record", "[query][record][update]")
.where("name"_col == "hans") .where("name"_col == "hans")
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
row = query::select({"id", "name", "age"}) row = query::select({"id", "name", "age"})
.from("person") .from("person")
@ -771,7 +771,7 @@ TEST_CASE_METHOD(QueryFixture, "Test prepared record statement", "[query][record
auto res = stmt->execute(); auto res = stmt->execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
check_table_exists("person"); check_table_exists("person");
const std::vector<std::string> cols = {"id", "name", "age"}; const std::vector<std::string> cols = {"id", "name", "age"};
@ -795,7 +795,7 @@ TEST_CASE_METHOD(QueryFixture, "Test scalar result", "[query][record][scalar][re
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
check_table_exists("person"); check_table_exists("person");
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
@ -808,7 +808,7 @@ TEST_CASE_METHOD(QueryFixture, "Test scalar result", "[query][record][scalar][re
.values({id}) .values({id})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto stmt = query::select({"id"}) auto stmt = query::select({"id"})

View File

@ -32,7 +32,7 @@ TEST_CASE_METHOD(QueryFixture, "Test create statement", "[query][statement][crea
auto res = stmt->execute(); auto res = stmt->execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
tables_to_drop.emplace("persons"); tables_to_drop.emplace("persons");
check_table_exists("persons"); check_table_exists("persons");
@ -63,7 +63,7 @@ TEST_CASE_METHOD(QueryFixture, "Test insert statement", "[query][statement][inse
auto res = stmt->bind(george) auto res = stmt->bind(george)
.execute(); .execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto row = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image}) auto row = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.from(PERSON) .from(PERSON)
@ -94,7 +94,7 @@ TEST_CASE_METHOD(QueryFixture, "Test update statement", "[query][statement][upda
auto res = stmt->bind(george) auto res = stmt->bind(george)
.execute(); .execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto row = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image}) auto row = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.from(PERSON) .from(PERSON)
@ -119,7 +119,7 @@ TEST_CASE_METHOD(QueryFixture, "Test update statement", "[query][statement][upda
.bind(4, george.id) .bind(4, george.id)
.execute(); .execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
row = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image}) row = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image})
.from(PERSON) .from(PERSON)
@ -156,7 +156,7 @@ TEST_CASE_METHOD(QueryFixture, "Test delete statement", "[query][statement][dele
auto res = stmt->bind(p) auto res = stmt->bind(p)
.execute(); .execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
stmt->reset(); stmt->reset();
} }
@ -187,7 +187,7 @@ TEST_CASE_METHOD(QueryFixture, "Test delete statement", "[query][statement][dele
auto res = stmt->bind(0, "jane") auto res = stmt->bind(0, "jane")
.execute(); .execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
select_stmt->reset(); select_stmt->reset();
auto row = select_stmt->bind(0, "jane") auto row = select_stmt->bind(0, "jane")
@ -198,7 +198,7 @@ TEST_CASE_METHOD(QueryFixture, "Test delete statement", "[query][statement][dele
res = stmt->bind(0, "merlin") res = stmt->bind(0, "merlin")
.execute(); .execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
select_stmt->reset(); select_stmt->reset();
row = select_stmt->bind(0, "merlin") row = select_stmt->bind(0, "merlin")
@ -229,7 +229,7 @@ TEST_CASE_METHOD(QueryFixture, "Test reuse prepared statement", "[query][stateme
auto res = stmt->bind(p) auto res = stmt->bind(p)
.execute(); .execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
stmt->reset(); stmt->reset();
} }

View File

@ -51,7 +51,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute select statement with where clause", "[q
.values(george) .values(george)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
// fetch person as record // fetch person as record
auto result_record = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image}) auto result_record = query::select({PERSON.id, PERSON.name, PERSON.age, PERSON.image})
@ -100,7 +100,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute insert statement", "[query][insert]") {
}) })
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 0); REQUIRE(res->affected_rows == 0);
REQUIRE(db.exists("person")); REQUIRE(db.exists("person"));
tables_to_drop.emplace("person"); tables_to_drop.emplace("person");
@ -110,7 +110,7 @@ TEST_CASE_METHOD(QueryFixture, "Execute insert statement", "[query][insert]") {
.values({7, "george", "green"}) .values({7, "george", "green"})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
// fetch person as record // fetch person as record
auto result_record = query::select({"id", "name", "color"}) auto result_record = query::select({"id", "name", "color"})
@ -154,7 +154,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with foreign key", "[query][for
.values(*plane) .values(*plane)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto count = query::select({count_all()}) auto count = query::select({count_all()})
@ -171,7 +171,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with foreign key", "[query][for
.values(f4711) .values(f4711)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto f = query::select({FLIGHT.id, FLIGHT.airplane_id, FLIGHT.pilot_name}) auto f = query::select({FLIGHT.id, FLIGHT.airplane_id, FLIGHT.pilot_name})
.from(FLIGHT) .from(FLIGHT)
@ -204,7 +204,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with foreign key and join_left"
.values(*plane) .values(*plane)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto count = query::select({count_all()}) auto count = query::select({count_all()})
@ -225,7 +225,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with foreign key and join_left"
.values(*f) .values(*f)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto flight_result = query::select({FLIGHT.id, FLIGHT.airplane_id, FLIGHT.pilot_name}) auto flight_result = query::select({FLIGHT.id, FLIGHT.airplane_id, FLIGHT.pilot_name})
@ -285,7 +285,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with foreign key and for single
.values(*plane) .values(*plane)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto count = query::select({count_all()}) auto count = query::select({count_all()})
@ -308,7 +308,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with foreign key and for single
.values(*f) .values(*f)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto flight_result = query::select({FLIGHT.id, FLIGHT.airplane_id, FLIGHT.pilot_name}) auto flight_result = query::select({FLIGHT.id, FLIGHT.airplane_id, FLIGHT.pilot_name})
@ -368,7 +368,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with many to many relationship"
.values(i) .values(i)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
std::vector<recipe> recipes{ std::vector<recipe> recipes{
@ -383,7 +383,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with many to many relationship"
.values(r) .values(r)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
std::vector<std::pair<int, int>> recipe_ingredients { std::vector<std::pair<int, int>> recipe_ingredients {
@ -403,7 +403,7 @@ TEST_CASE_METHOD(QueryFixture, "Select statement with many to many relationship"
.values({recipe_id, ingredient_id}) .values({recipe_id, ingredient_id})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
@ -510,7 +510,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with eager has many relation",
.values(*sh) .values(*sh)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto count = query::select({count_all()}) auto count = query::select({count_all()})
@ -533,7 +533,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with eager has many relation",
.values(*pkg) .values(*pkg)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
count = query::select({count_all()}) count = query::select({count_all()})
@ -621,7 +621,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with lazy has many relation", "
.values(*a) .values(*a)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto count = query::select({count_all()}) auto count = query::select({count_all()})
@ -636,7 +636,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with lazy has many relation", "
.values(*b) .values(*b)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
count = query::select({count_all()}) count = query::select({count_all()})
@ -698,7 +698,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with lazy belongs to relation",
.values(*dep) .values(*dep)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto count = query::select({count_all()}) auto count = query::select({count_all()})
@ -713,7 +713,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with lazy belongs to relation",
.values(*emp) .values(*emp)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
count = query::select({count_all()}) count = query::select({count_all()})
@ -769,7 +769,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with eager belongs to relation"
.values(*a) .values(*a)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto count = query::select({count_all()}) auto count = query::select({count_all()})
@ -784,7 +784,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with eager belongs to relation"
.values(*b) .values(*b)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
count = query::select({count_all()}) count = query::select({count_all()})
@ -845,7 +845,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with eager has many to many rel
.values(i) .values(i)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
std::vector<recipe> recipes{ std::vector<recipe> recipes{
@ -860,7 +860,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with eager has many to many rel
.values(r) .values(r)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
std::vector<std::pair<int, int>> recipe_ingredients { std::vector<std::pair<int, int>> recipe_ingredients {
@ -880,7 +880,7 @@ TEST_CASE_METHOD(QueryFixture, "Test load entity with eager has many to many rel
.values({recipe_id, ingredient_id}) .values({recipe_id, ingredient_id})
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
const auto r = RECIPE.as("r"); const auto r = RECIPE.as("r");

View File

@ -49,7 +49,7 @@ TEST_CASE_METHOD(StatementTestFixture, "Create prepared statement", "[statement]
for (const auto &plane: planes) { for (const auto &plane: planes) {
auto res = stmt->bind(plane).execute(); auto res = stmt->bind(plane).execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
stmt->reset(); stmt->reset();
} }
@ -73,7 +73,7 @@ TEST_CASE_METHOD(StatementTestFixture, "Create prepared statement", "[statement]
.values(plane) .values(plane)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
} }
auto stmt = query::select({AIRPLANE.id, AIRPLANE.brand, AIRPLANE.model}) auto stmt = query::select({AIRPLANE.id, AIRPLANE.brand, AIRPLANE.model})

View File

@ -36,7 +36,7 @@ TEST_CASE_METHOD(TypeTraitsTestFixture, "Special handling of attributes with typ
.values(loc) .values(loc)
.execute(db); .execute(db);
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto result = query::select(generator::columns<location>(repo)) auto result = query::select(generator::columns<location>(repo))
.from("location") .from("location")
@ -61,7 +61,7 @@ TEST_CASE_METHOD(TypeTraitsTestFixture, "Special handling of attributes with typ
auto res = stmt->bind(loc) auto res = stmt->bind(loc)
.execute(); .execute();
REQUIRE(res.is_ok()); REQUIRE(res.is_ok());
REQUIRE(*res == 1); REQUIRE(res->affected_rows == 1);
auto result = query::select(generator::columns<location>(repo)) auto result = query::select(generator::columns<location>(repo))
.from("location") .from("location")