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