moved parameter_binder from member to parameter to bind, execute and fetch methods
This commit is contained in:
@@ -1,14 +1,13 @@
|
||||
#ifndef QUERY_POSTGRES_PARAMETER_BINDER_H
|
||||
#define QUERY_POSTGRES_PARAMETER_BINDER_H
|
||||
|
||||
#include "matador/utils/attribute_writer.hpp"
|
||||
#include "matador/sql/interface/parameter_binder.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace matador::backends::postgres {
|
||||
|
||||
class postgres_parameter_binder final : public utils::attribute_writer
|
||||
{
|
||||
class postgres_parameter_binder final : public sql::interface::parameter_binder {
|
||||
public:
|
||||
struct bind_data {
|
||||
explicit bind_data(size_t size);
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
#define QUERY_POSTGRES_STATEMENT_HPP
|
||||
|
||||
#include "matador/sql/interface/statement_impl.hpp"
|
||||
|
||||
#include "postgres_parameter_binder.h"
|
||||
#include "matador/sql/interface/parameter_binder.hpp"
|
||||
|
||||
#include <libpq-fe.h>
|
||||
|
||||
@@ -14,18 +13,17 @@ class postgres_statement final : public sql::statement_impl
|
||||
public:
|
||||
postgres_statement(PGconn *db, std::string name, const sql::query_context &query);
|
||||
|
||||
utils::result<size_t, utils::error> execute() override;
|
||||
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch() override;
|
||||
utils::result<size_t, utils::error> execute(const sql::interface::parameter_binder& bindings) override;
|
||||
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> fetch(const sql::interface::parameter_binder& bindings) override;
|
||||
void reset() override;
|
||||
|
||||
protected:
|
||||
utils::attribute_writer& binder() override;
|
||||
[[nodiscard]] std::unique_ptr<utils::attribute_writer> create_binder() const override;
|
||||
|
||||
private:
|
||||
PGconn *db_{nullptr};
|
||||
|
||||
std::string name_;
|
||||
|
||||
postgres_parameter_binder binder_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ postgres_parameter_binder::bind_data::bind_data(const size_t size)
|
||||
, formats(size)
|
||||
{}
|
||||
|
||||
postgres_parameter_binder::postgres_parameter_binder(size_t size)
|
||||
postgres_parameter_binder::postgres_parameter_binder(const size_t size)
|
||||
: bind_data_(size)
|
||||
{}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "postgres_statement.hpp"
|
||||
#include "postgres_error.hpp"
|
||||
#include "postgres_parameter_binder.h"
|
||||
#include "postgres_result_reader.hpp"
|
||||
|
||||
namespace matador::backends::postgres {
|
||||
@@ -8,17 +9,19 @@ postgres_statement::postgres_statement(PGconn *db, std::string name, const sql::
|
||||
: statement_impl(query)
|
||||
, db_(db)
|
||||
, name_(std::move(name))
|
||||
, binder_(query_.bind_vars.size())
|
||||
{}
|
||||
|
||||
utils::result<size_t, utils::error> postgres_statement::execute()
|
||||
{
|
||||
utils::result<size_t, utils::error> postgres_statement::execute(const sql::interface::parameter_binder& bindings) {
|
||||
const auto* postgres_bindings = dynamic_cast<const postgres_parameter_binder*>(&bindings);
|
||||
if (!postgres_bindings) {
|
||||
return utils::failure(utils::error(sql::error_code::EXECUTE_FAILED, "Failed to cast bindings to postgres bindings"));
|
||||
}
|
||||
PGresult *res = PQexecPrepared(db_,
|
||||
name_.c_str(),
|
||||
static_cast<int>(binder_.params().values.size()),
|
||||
binder_.params().values.data(),
|
||||
binder_.params().lengths.data(),
|
||||
binder_.params().formats.data(),
|
||||
static_cast<int>(postgres_bindings->params().values.size()),
|
||||
postgres_bindings->params().values.data(),
|
||||
postgres_bindings->params().lengths.data(),
|
||||
postgres_bindings->params().formats.data(),
|
||||
0);
|
||||
|
||||
if (is_result_error(res)) {
|
||||
@@ -30,17 +33,20 @@ utils::result<size_t, utils::error> postgres_statement::execute()
|
||||
return utils::ok(static_cast<size_t>(0));
|
||||
}
|
||||
|
||||
return utils::ok(static_cast<size_t>(std::stoul(tuples)));
|
||||
return utils::ok((std::stoul(tuples)));
|
||||
}
|
||||
|
||||
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> postgres_statement::fetch()
|
||||
{
|
||||
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> postgres_statement::fetch(const sql::interface::parameter_binder& bindings) {
|
||||
const auto* postgres_bindings = dynamic_cast<const postgres_parameter_binder*>(&bindings);
|
||||
if (!postgres_bindings) {
|
||||
return utils::failure(utils::error(sql::error_code::EXECUTE_FAILED, "Failed to cast bindings to postgres bindings"));
|
||||
}
|
||||
PGresult *res = PQexecPrepared(db_,
|
||||
name_.c_str(),
|
||||
static_cast<int>(binder_.params().values.size()),
|
||||
binder_.params().values.data(),
|
||||
binder_.params().lengths.data(),
|
||||
binder_.params().formats.data(),
|
||||
static_cast<int>(postgres_bindings->params().values.size()),
|
||||
postgres_bindings->params().values.data(),
|
||||
postgres_bindings->params().lengths.data(),
|
||||
postgres_bindings->params().formats.data(),
|
||||
0);
|
||||
|
||||
if (is_result_error(res)) {
|
||||
@@ -52,9 +58,7 @@ utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> postgres_st
|
||||
|
||||
void postgres_statement::reset() {}
|
||||
|
||||
utils::attribute_writer& postgres_statement::binder()
|
||||
{
|
||||
return binder_;
|
||||
std::unique_ptr<utils::attribute_writer> postgres_statement::create_binder() const {
|
||||
return std::make_unique<postgres_parameter_binder>(query_.bind_vars.size());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user