1#ifndef MSTL_DATABASE_MYSQL_PREPARED_STATEMENT_HPP__
2#define MSTL_DATABASE_MYSQL_PREPARED_STATEMENT_HPP__
3#ifdef MSTL_SUPPORT_MYSQL__
4#include "MSTL/database/db_interface.hpp"
11class MSTL_API mysql_prepared_statement final :
public idb_prepared_statement {
13 ::MYSQL_STMT* stmt_ =
nullptr;
14 ::MYSQL* conn_ =
nullptr;
17 vector<::MYSQL_BIND> bind_params_;
18 vector<vector<char>> param_buffers_;
20 MSTL_ALWAYS_INLINE
void throw_if_stmt_null()
const {
22 throw_exception(database_prepared_stmt_exception(
"Prepared statement not initialized"));
27 explicit mysql_prepared_statement(::MYSQL* conn, string_view sql);
29 explicit mysql_prepared_statement(::MYSQL* conn,
const string& sql)
30 : mysql_prepared_statement(conn, sql.view()) {}
32 explicit mysql_prepared_statement(::MYSQL* conn,
const char* sql)
33 : mysql_prepared_statement(conn, string_view{sql}) {}
35 mysql_prepared_statement(mysql_prepared_statement&& other)
noexcept;
36 mysql_prepared_statement& operator =(mysql_prepared_statement&& other)
noexcept;
38 mysql_prepared_statement(
const mysql_prepared_statement&) =
delete;
39 mysql_prepared_statement& operator =(
const mysql_prepared_statement&) =
delete;
41 ~mysql_prepared_statement()
override;
43 MSTL_NODISCARD
uint32_t param_count() const noexcept
override {
return param_count_; }
45 bool bind_param(
uint32_t index,
const string& value)
override {
return bind_param(index, value.view()); }
46 bool bind_param(
uint32_t index, string_view value)
override;
47 bool bind_param(
uint32_t index,
const char* value)
override {
return bind_param(index, string_view{value}); }
51 bool bind_param(
uint32_t index,
const void*
data,
size_t length)
override;
53 bool execute()
override;
54 MSTL_NODISCARD unique_ptr<idb_prepared_result> execute_query()
override;
56 MSTL_NODISCARD string_view get_error() const noexcept override;
57 MSTL_NODISCARD
uint32_t get_errno() const noexcept override;
59 void swap(mysql_prepared_statement& other) noexcept;
unsigned int uint32_t
32位无符号整数类型
long long int64_t
64位有符号整数类型
double float64_t
64位双精度浮点数类型
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
void swap()=delete
删除无参数的swap重载
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针