forked from acl-dev/acl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquery.hpp
188 lines (166 loc) · 4.54 KB
/
query.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#pragma once
#include "acl_cpp/acl_cpp_define.hpp"
#include "acl_cpp/stdlib/string.hpp"
#include <map>
namespace acl
{
/**
* SQL 查询语句查询器,该类会自动对 sql 中的一些特殊字符进行转义,使用方式类似于
* java hibernate 的 SQL 语句构建方式
*/
class ACL_CPP_API query
{
public:
query();
~query();
/**
* 创建 sql 语句
* @param sql_fmt {const char*} sql 语句,格式如:
* select * from xxx where name = :name and len >= :len
* 其中的 :name, :len 将由 set_parameter 中的值进行替换
* @return {query&}
*/
query& create_sql(const char* sql_fmt, ...) ACL_CPP_PRINTF(2, 3);;
/**
* 设置字符串类型的变量值
* @param name {const char*} 变量名
* @param value {const char*} 变量值
* @return {query&}
*/
query& set_parameter(const char* name, const char *value);
/**
* 设置字符类型的变量值
* @param name {const char*} 变量名
* @param value {char} 变量值
* @return {query&}
*/
query& set_parameter(const char* name, char value);
/**
* 设置 16 位短整类型的变量值
* @param name {const char*} 变量名
* @param value {short} 变量值
* @return {query&}
*/
query& set_parameter(const char* name, short value);
/**
* 设置 32 位短整类型的变量值
* @param name {const char*} 变量名
* @param value {int} 变量值
* @return {query&}
*/
query& set_parameter(const char* name, int value);
/**
* 设置单精度浮点类型的变量值
* @param name {const char*} 变量名
* @param value {float} 单精度浮点类型
* @param precision {int} 尾数的精度值
* @return {query&}
*/
query& set_parameter(const char* name, float value, int precision = 8);
/**
* 设置双精度浮点类型的变量值
* @param name {const char*} 变量名
* @param value {double} 双精度浮点类型
* @param precision {int} 尾数的精度值
* @return {query&}
*/
query& set_parameter(const char* name, double value, int precision = 8);
/**
* 设置 64 位短整类型的变量值
* @param name {const char*} 变量名
* @param value {long long int} 变量值
* @return {query&}
*/
#if defined(_WIN32) || defined(_WIN64)
query& set_parameter(const char* name, __int64 value);
#else
query& set_parameter(const char* name, long long int value);
#endif
/**
* 设置日期(time_t)类型的变量值
* @param name {const char*} 变量名
* @param value {time_t} 变量值
* @param fmt {const char*} 日期格式
* @return {query&}
*/
query& set_date(const char* name, time_t value,
const char* fmt = "%Y-%m-%d %H:%M:%S");
/**
* 以变参方式设置变量值
* @param name {const char*} 变量名
* @param fmt {const char*} 变参值格式
* @return {query&}
*/
query& set_format(const char* name, const char* fmt, ...)
ACL_CPP_PRINTF(3, 4);
/**
* 以变参方式设置变量值
* @param name {const char*} 变量名
* @param fmt {const char*} 变参值格式
* @param ap {va_list} 变参值列表
* @return {query&}
*/
query& set_vformat(const char* name, const char* fmt, va_list ap);
/**
* 对查询 sql 语句进行转义后返回给调用者
* @return {const string&}
*/
const string& to_string();
/**
* 清空查询器上一次的缓存数据,当该 SQL 查询器对象被多次使用时,应该提前调用
* 本函数清除之前的 SQL 查询器状态
*/
void reset();
/**
* 对 sql 中的一些特殊字符进行转义处理,以防止 SQL 注入问题
* @param in {const char*} 变量值
* @param len {size_t} in 数据长度
* @param out {string&} 存储转换后的结果的缓冲区,该参数输入后会先被清空
* @return {const string&} 转义处理后的结果(其实是 out 的地址引用)
*/
static const string& escape(const char* in, size_t len, string& out);
/**
* 将时间转换成 DateTime 格式的字符串(YYYY-MM-DD HH:MM:SS)
* @param t {time_t} 时间截
* @param out {string&} 存储转换结果的缓冲区
* @param fmt {const char*} 日期格式,在 _WIN32 下必须保证该格式的正确性,
* 否则 _WIN32 API 会产生断言,格式如:"%Y-%m-%d %H:%M:%S"
* @return {const char*} 转换后缓冲区地址,若返回 NULL 则表示转换失败
*/
static const char* to_date(time_t t, string& out,
const char* fmt = "%Y-%m-%d %H:%M:%S");
private:
typedef enum
{
DB_PARAM_CHAR,
DB_PARAM_SHORT,
DB_PARAM_INT32,
DB_PARAM_INT64,
DB_PARAM_FLOAT,
DB_PARAM_DOUBLE,
DB_PARAM_STR
} db_param_type;
struct query_param
{
char type;
int dlen;
int precision;
union
{
char c;
short s;
int n;
long long int l;
double d;
float f;
char S[1];
} v;
};
std::map<string, query_param*> params_;
string* sql_buf_;
string sql_;
string buf_;
void del_param(const string& key);
bool append_key(string& buf, char* key);
};
} // namespace acl