MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
sql_builder.hpp
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"
7
8#ifdef DELETE
9#undef DELETE
10#endif
11
12enum class SQL_OPERATE_TYPE {
13 SELECT, INSERT, UPDATE, DELETE
14};
15
16enum class SQL_JOIN_TYPE {
17 INNER, LEFT, RIGHT, FULL
18};
19
20enum class SQL_ORDER_TYPE {
21 ASC, DESC
22};
23
24
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;
31 int limit_count = -1;
32 int offset_count = -1;
33 bool distinct = false;
34};
35
36struct MSTL_API insert_data {
37 vector<string> fields;
38 vector<string> placeholders;
39};
40
41struct MSTL_API update_data {
42 vector<string> assignments;
43};
44
45
46class MSTL_API sql_builder {
47private:
48 SQL_OPERATE_TYPE sql_type_ = SQL_OPERATE_TYPE::SELECT;
49 string table_;
50 string table_alias_;
51 vector<string> where_conditions_;
52
53 unique_ptr<select_data> select_data_;
54 unique_ptr<insert_data> insert_data_;
55 unique_ptr<update_data> update_data_;
56
57private:
58 select_data* ensure_select_data();
59 insert_data* ensure_insert_data();
60 update_data* ensure_update_data();
61
62 void clear_data() noexcept;
63
64public:
65 sql_builder() = default;
66 ~sql_builder() = default;
67
68 sql_builder(const sql_builder& other);
69 sql_builder& operator =(const sql_builder& other);
70
71 sql_builder(sql_builder&&) noexcept = default;
72 sql_builder& operator =(sql_builder&&) noexcept = default;
73
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;
78
79 sql_builder& distinct();
80
81 sql_builder& from(string table) noexcept;
82 sql_builder& from(string table, string alias) noexcept;
83
84 sql_builder& join(SQL_JOIN_TYPE type, string table, string on_condition);
85 sql_builder& join(string table, string on_condition);
86
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);
91
92 sql_builder& where(string condition);
93
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);
100
101 sql_builder& where_like(string field, string pattern);
102 sql_builder& where_not_like(string field, string pattern);
103
104 sql_builder& where_in(string field, vector<string> values);
105 sql_builder& where_not_in(string field, vector<string> values);
106
107 sql_builder& where_between(string field, string start, string end);
108 sql_builder& where_not_between(string field, string start, string end);
109
110 sql_builder& where_is_null(string field);
111 sql_builder& where_is_not_null(string field);
112
113 sql_builder& where_exists(string subquery);
114 sql_builder& where_not_exists(string subquery);
115
116 sql_builder& or_where(string condition);
117
118 sql_builder& group_by(string field);
119 sql_builder& group_by(vector<string> fields);
120
121 sql_builder& having(string condition);
122
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);
126
127 sql_builder& limit(int count);
128 sql_builder& offset(int count);
129 sql_builder& page(int page_num, int page_size);
130
131 sql_builder& insert_into(string table, vector<string> fields);
132 sql_builder& insert_into(string table);
133
134 sql_builder& values(vector<string> values);
135 sql_builder& columns(vector<string> fields);
136
137 sql_builder& update(string table);
138
139 sql_builder& set(string assignment);
140 sql_builder& set(string field, string value);
141
142 sql_builder& set_increment(string field, int value = 1);
143 sql_builder& set_decrement(string field, int value = 1);
144
145 sql_builder& remove();
146 sql_builder& delete_from(string table);
147
148 sql_builder& select_count(string field, string alias);
149 sql_builder& select_count(string field);
150 sql_builder& select_count();
151
152 sql_builder& select_sum(string field, string alias);
153 sql_builder& select_sum(string field);
154
155 sql_builder& select_avg(string field, string alias);
156 sql_builder& select_avg(string field);
157
158 sql_builder& select_max(string field, string alias);
159 sql_builder& select_max(string field);
160
161 sql_builder& select_min(string field, string alias);
162 sql_builder& select_min(string field);
163
164 sql_builder& select_distinct(string field);
165
166 sql_builder& select_subquery(string subquery, string alias);
167 sql_builder& select_subquery(string subquery);
168
169 sql_builder& from_subquery(string subquery, string alias);
170
171 sql_builder& reset() noexcept;
172
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(); }
176
177 MSTL_NODISCARD string build() const;
178};
179
181#endif // MSTL_DATABASE_SQL_BUILDER_HPP__
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()))
获取容器的结束迭代器
MSTL独占智能指针