1#ifndef MSTL_DATABASE_SQL_BUILDER_HPP__
2#define MSTL_DATABASE_SQL_BUILDER_HPP__
3#include "../core/config/undef_cmacro.hpp"
4#include "../core/container/vector.hpp"
12enum class SQL_OPERATE_TYPE {
13 SELECT, INSERT, UPDATE, DELETE
16enum class SQL_JOIN_TYPE {
17 INNER, LEFT, RIGHT, FULL
20enum class SQL_ORDER_TYPE {
25struct MSTL_API select_data {
26 vector<string> fields;
27 vector<string> join_clauses;
28 vector<string> group_by_fields;
29 vector<string> having_conditions;
30 vector<string> order_by_clauses;
32 int offset_count = -1;
33 bool distinct =
false;
36struct MSTL_API insert_data {
37 vector<string> fields;
38 vector<string> placeholders;
41struct MSTL_API update_data {
42 vector<string> assignments;
46class MSTL_API sql_builder {
48 SQL_OPERATE_TYPE sql_type_ = SQL_OPERATE_TYPE::SELECT;
51 vector<string> where_conditions_;
53 unique_ptr<select_data> select_data_;
54 unique_ptr<insert_data> insert_data_;
55 unique_ptr<update_data> update_data_;
58 select_data* ensure_select_data();
59 insert_data* ensure_insert_data();
60 update_data* ensure_update_data();
62 void clear_data() noexcept;
65 sql_builder() = default;
66 ~sql_builder() = default;
68 sql_builder(const sql_builder& other);
69 sql_builder& operator =(const sql_builder& other);
71 sql_builder(sql_builder&&) noexcept = default;
72 sql_builder& operator =(sql_builder&&) noexcept = default;
74 sql_builder& select(vector<
string> fields);
75 sql_builder& select(std::initializer_list<
string> fields);
76 sql_builder& select(
string field);
77 sql_builder& select_all() noexcept;
79 sql_builder& distinct();
81 sql_builder& from(
string table) noexcept;
82 sql_builder& from(
string table,
string alias) noexcept;
84 sql_builder& join(SQL_JOIN_TYPE type,
string table,
string on_condition);
85 sql_builder& join(
string table,
string on_condition);
87 sql_builder& left_join(
string table,
string on_condition);
88 sql_builder& right_join(
string table,
string on_condition);
89 sql_builder& inner_join(
string table,
string on_condition);
90 sql_builder& full_join(
string table,
string on_condition);
92 sql_builder& where(
string condition);
94 sql_builder& where_eq(
string field,
string value);
95 sql_builder& where_ne(
string field,
string value);
96 sql_builder& where_gt(
string field,
string value);
97 sql_builder& where_ge(
string field,
string value);
98 sql_builder& where_lt(
string field,
string value);
99 sql_builder& where_le(
string field,
string value);
101 sql_builder& where_like(
string field,
string pattern);
102 sql_builder& where_not_like(
string field,
string pattern);
104 sql_builder& where_in(
string field, vector<
string> values);
105 sql_builder& where_not_in(
string field, vector<
string> values);
107 sql_builder& where_between(
string field,
string start,
string end);
108 sql_builder& where_not_between(
string field,
string start,
string end);
110 sql_builder& where_is_null(
string field);
111 sql_builder& where_is_not_null(
string field);
113 sql_builder& where_exists(
string subquery);
114 sql_builder& where_not_exists(
string subquery);
116 sql_builder& or_where(
string condition);
118 sql_builder& group_by(
string field);
119 sql_builder& group_by(vector<
string> fields);
121 sql_builder& having(
string condition);
123 sql_builder& order_by(
string field, SQL_ORDER_TYPE order = SQL_ORDER_TYPE::ASC);
124 sql_builder& order_by_asc(
string field);
125 sql_builder& order_by_desc(
string field);
127 sql_builder& limit(
int count);
128 sql_builder& offset(
int count);
129 sql_builder& page(
int page_num,
int page_size);
131 sql_builder& insert_into(
string table, vector<
string> fields);
132 sql_builder& insert_into(
string table);
134 sql_builder& values(vector<
string> values);
135 sql_builder& columns(vector<
string> fields);
137 sql_builder& update(
string table);
139 sql_builder& set(
string assignment);
140 sql_builder& set(
string field,
string value);
142 sql_builder& set_increment(
string field,
int value = 1);
143 sql_builder& set_decrement(
string field,
int value = 1);
146 sql_builder& delete_from(
string table);
148 sql_builder& select_count(
string field,
string alias);
149 sql_builder& select_count(
string field);
150 sql_builder& select_count();
152 sql_builder& select_sum(
string field,
string alias);
153 sql_builder& select_sum(
string field);
155 sql_builder& select_avg(
string field,
string alias);
156 sql_builder& select_avg(
string field);
158 sql_builder& select_max(
string field,
string alias);
159 sql_builder& select_max(
string field);
161 sql_builder& select_min(
string field,
string alias);
162 sql_builder& select_min(
string field);
164 sql_builder& select_distinct(
string field);
166 sql_builder& select_subquery(
string subquery,
string alias);
167 sql_builder& select_subquery(
string subquery);
169 sql_builder& from_subquery(
string subquery,
string alias);
171 sql_builder& reset() noexcept;
173 MSTL_NODISCARD SQL_OPERATE_TYPE get_type() const noexcept {
return sql_type_; }
174 MSTL_NODISCARD string_view get_table() const noexcept {
return table_.view(); }
175 MSTL_NODISCARD
bool empty() const noexcept {
return table_.empty(); }
177 MSTL_NODISCARD
string build()
const;
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr Iterator remove(Iterator first, Iterator last, const T &value)
移除范围中等于指定值的元素
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr bool empty(const Container &cont) noexcept(noexcept(cont.empty()))
检查容器是否为空
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器