acl  3.5.3.0
hsproto.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/noncopyable.hpp"
4 #include <vector>
5 
6 #ifndef ACL_CLIENT_ONLY
7 
8 namespace acl {
9 
10 class string;
11 class hsrow;
12 
14 {
15 public:
16  hsproto(bool cache_enable);
17  ~hsproto();
18 
19  /**
20  * 创建打开数据库索引的请求协议数据
21  * @param out {string&} 存储请求协议结果
22  * @param id {int} 对应打开索引的表ID号
23  * @param dbn {const char*} 数据库名称
24  * @param tbl {const char*} 数据库表名
25  * @param idx {const char*} 索引字段名
26  * @param flds {const char*} 要打开的数据字段名集合,格式为
27  * 由分隔符 ",; \t" 分隔的字段名称,如:user_id,user_name,user_mail
28  * @return {bool} 是否成功
29  */
30  static bool build_open(string& out, int id,
31  const char* dbn, const char* tbl,
32  const char* idx, const char* flds);
33 
34  /**
35  * 创建查询数据库记录的请求协议数据
36  * @param out {string&} 存储请求协议结果
37  * @param id {int} 对应打开索引的表ID号
38  * @param values {const char*[]} 匹配字段值数组,字段值的加入顺序应与打开索引
39  * 中各个字段的顺序相同
40  * @param num {int} values 数组长度,该值不应超过在打开索引时的字段个数
41  * @param cond {const char*} 匹配条件,可以为:
42  * = 等于; >= 大于等于; > 大于; < 小于; <= 小于等于
43  * @param nlimit {int} 结果集个数限制,0 表示不限制个数
44  * @param noffset {int} 结果集开始位置(0表示从第一个结果开始)
45  * @return {bool} 是否成功
46  */
47  static bool build_get(string& out, int id,
48  const char* values[], int num,
49  const char* cond = "=", int nlimit = 0, int noffset = 0);
50 
51  /**
52  * 创建查询数据库记录的请求协议数据
53  * @param out {string&} 存储请求协议数据
54  * @param id {int} 对应打开索引的表ID号
55  * @param nfld {int} 在打开索引时字段个数
56  * @param first_value {const char*} 第一个参数
57  * @param ... {const char*} 参数列表,最后一个参数为 NULL 表示结束
58  * @return {bool} 是否成功
59  */
60  static bool ACL_CPP_PRINTF(4, 5) build_get(string& out, int id,
61  int nfld, const char* first_value, ...);
62 
63  /**
64  * 创建修改数据库记录的请求协议数据
65  * @param out {string&} 存储请求协议数据
66  * @param id {int} 对应打开索引的表ID号
67  * @param values {const char*[]} 匹配字段值数组,字段值的加入顺序应与打开索引
68  * 中各个字段的顺序相同
69  * @param num {int} values 数组长度,该值不应超过在打开索引时的字段个数
70  * @param to_values {cosnt *[]} 匹配字段新值,字段值的顺序应与 open 方法中
71  * 的字段顺序相同
72  * @param to_num {int} to_values 数组长度
73  * @param cond {const char*} 匹配条件,可以为:
74  * @param nlimit {int} 结果集个数限制,0 表示不限制个数
75  * @param noffset {int} 结果集开始位置(0表示从第一个结果开始)
76  * @return {bool} 是否成功
77  */
78  static bool build_mod(string& out, int id,
79  const char* values[], int num,
80  const char* to_values[], int to_num,
81  const char* cond = "=", int nlimit = 0, int noffset = 0);
82 
83  /**
84  * 创建删除数据库记录的请求协议数据
85  * @param out {string&} 存储请求协议数据
86  * @param id {int} 对应打开索引的表ID号
87  * @param values {const char*[]} 匹配字段值数组,字段值的加入顺序应与打开索引
88  * 中各个字段的顺序相同
89  * @param num {int} values 数组长度,该值不应超过在打开索引时的字段个数
90  * @param cond {const char*} 匹配条件,可以为:
91  * @param nlimit {int} 结果集个数限制,0 表示不限制个数
92  * @param noffset {int} 结果集开始位置(0表示从第一个结果开始)
93  * @return {bool} 是否成功
94  */
95  static bool build_del(string& out, int id, const char* values[],
96  int num, const char* cond = "=",
97  int nlimit = 0, int noffset = 0);
98 
99  /**
100  * 创建删除数据库记录的请求协议数据
101  * @param out {string&} 存储请求协议数据
102  * @param id {int} 对应打开索引的表ID号
103  * @param nfld {int} 在打开索引时字段个数
104  * @param first_value {const char*} 第一个参数
105  * @param ... {const char*} 参数列表,最后一个参数为 NULL 表示结束
106  * @return {bool} 是否成功
107  */
108  static bool ACL_CPP_PRINTF(4, 5) build_del(string& out, int id,
109  int nfld, const char* first_value, ...);
110 
111  /**
112  * 创建添加数据库记录的请求协议数据
113  * @param out {string&} 存储请求协议数据
114  * @param id {int} 对应打开索引的表ID号
115  * @param values {const char*[]} 匹配字段值数组,字段值的加入顺序应与打开索引
116  * 中各个字段的顺序相同
117  * @param num {int} values 数组长度,该值不应超过在打开索引时的字段个数
118  * @return {bool} 是否成功
119  */
120  static bool build_add(string& out, int id,
121  const char* values[], int num);
122 
123  /**
124  * 创建添加数据库记录的请求协议数据
125  * @param out {string&} 存储请求协议数据
126  * @param id {int} 对应打开索引的表ID号
127  * @param nfld {int} 在打开索引时字段个数
128  * @param first_value {const char*} 第一个参数
129  * @param ... {const char*} 参数列表,最后一个参数为 NULL 表示结束
130  * @return {bool} 是否成功
131  */
132  static bool ACL_CPP_PRINTF(4, 5) build_add(string& out, int id,
133  int nfld, const char* first_value, ...);
134 
135  /**
136  * 通用的创建数据库处理的请求协议数据
137  * @param out {string&} 存储请求协议数据
138  * @param id {int} 对应打开索引的表ID号
139  * @param oper {const char*} 操作方式,对应的操作符为:
140  * 添加: +
141  * 查询: =, >, >=, <, <=
142  * 修改: =, >, >=, <, <=
143  * 删除: =, >, >=, <, <=
144  * @param values {const char*[]} 匹配字段值数组,字段值的加入顺序应与打开索引
145  * 中各个字段的顺序相同
146  * @param num {int} values 数组长度,该值不应超过在打开索引时的字段个数
147  * @param limit_offset {const char*} 要求的查询范围
148  * @param mop {char} 仅针对删除,修改操作有效,其对应的操作符分别为:
149  * D: 删除, U: 修改
150  * @param to_values {const char*[]} 目标值指针数组
151  * @param to_num {int} to_values 数组的长度
152  */
153  static void build_request(string& out, int id, const char* oper,
154  const char* values[], int num,
155  const char* limit_offset, char mop,
156  const char* to_values[], int to_num);
157 
158  /**
159  * 分析数据库的返回数据
160  * @param nfld {int} 打开的表的元素个数
161  * @param in {string&} 从数据库读到的数据行, 尾部应该不包含 "\r\n"
162  * @param errnum_out {int&} 存储处理过程的出错号,参见: hserror.hpp
163  * @param serror_out {const char*&} 存储处理过程的出错描述信息
164  * @return {bool} 分析是否成功
165  */
166  bool parse_respond(int nfld, string& in,
167  int& errnum_out, const char*& serror_out);
168 
169  /**
170  * 当执行查询语句时,可以通过此函数获得查询的结果集
171  * @return {const std::vector<hsrow*>&}
172  */
173  const std::vector<hsrow*>& get();
174 
175  /**
176  * 当用户用完查询结果集后进行第二次查询时调用此函数清理上次查询结果
177  */
178  void reset();
179 private:
180  bool debugOn_;
181  bool cache_enable_;
182  //int nfld_;
183  int ntoken_;
184  char* buf_ptr_;
185 
186  // 查询结果集
187  std::vector<hsrow*> rows_;
188 
189  // 行记录对象缓存,当行记录对象用完后,为了保证内存
190  // 复用,将不再使用的行记录对象进行缓存,以备后用
191  std::vector<hsrow*> rows_cache_;
192 
193  // 清除行缓存对象集合
194  void clear_cache();
195 
196  // 获得下一个查询结果
197  hsrow* get_next_row();
198 };
199 
200 } // namespace acl
201 
202 #endif // ACL_CLIENT_ONLY
#define ACL_CPP_PRINTF(format_idx, arg_idx)
Definition: atomic.hpp:75
#define ACL_CPP_API