1#ifndef MSTL_DATABASE_POSTGRESQL_PREPARED_STATEMENT_HPP__
2#define MSTL_DATABASE_POSTGRESQL_PREPARED_STATEMENT_HPP__
3#ifdef MSTL_SUPPORT_POSTGRESQL__
4#include "MSTL/database/db_interface.hpp"
9struct __pgsql_pstmt_data {
10 vector<string> param_values{};
11 vector<const char*> param_ptrs{};
12 vector<int> param_lengths{};
13 vector<int> param_formats{};
17class MSTL_API postgresql_prepared_statement final :
public idb_prepared_statement {
19 ::PGconn* conn_ =
nullptr;
23 _INNER __pgsql_pstmt_data* data_ =
new _INNER __pgsql_pstmt_data();
24 vector<vector<char>> param_buffers_{};
28 void init_params()
const;
30 void clear_error() noexcept;
31 void set_error(
string error,
uint32_t errno_val = 0) noexcept;
34 postgresql_prepared_statement(PGconn* conn, const
string& sql);
35 ~postgresql_prepared_statement() override;
37 MSTL_NODISCARD
uint32_t param_count() const noexcept
override {
return param_count_; }
39 bool bind_param(
uint32_t index,
const string& value)
override {
return bind_param(index, value.view()); }
40 bool bind_param(
uint32_t index, string_view value)
override;
41 bool bind_param(
uint32_t index,
const char* value)
override {
return bind_param(index, string_view(value)); }
45 bool bind_param(
uint32_t index,
const void*
data,
size_t length)
override;
47 bool execute()
override;
48 MSTL_NODISCARD unique_ptr<idb_prepared_result> execute_query()
override;
49 MSTL_NODISCARD string_view get_error() const noexcept
override {
return last_error_.view(); }
50 MSTL_NODISCARD
uint32_t get_errno() const noexcept
override {
return last_errno_; }
unsigned int uint32_t
32位无符号整数类型
long long int64_t
64位有符号整数类型
double float64_t
64位双精度浮点数类型
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针