acl  3.5.3.0
hsclient.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <map>
4 #include <vector>
5 #include "../stdlib/string.hpp"
6 #include "../stdlib/noncopyable.hpp"
7 #include "../stream/socket_stream.hpp"
8 #include "../hsocket/hsproto.hpp"
9 
10 #ifndef ACL_CLIENT_ONLY
11 
12 struct ACL_ARGV;
13 
14 namespace acl {
15 
16 class hsrow;
17 class hstable;
18 
20 {
21 public:
22  /**
23  * 构造函数
24  * @param addr {const char*} handlersocket 插件在 Mysql 上的监听地址,
25  * @param cache_enable {bool} 内部是否启用行缓存功能
26  * @param retry_enable {bool} 当因为网络原因出错时是否需要重试
27  * 格式为:ip:port
28  */
29  hsclient(const char* addr, bool cache_enable = true, bool retry_enable = true);
30  ~hsclient();
31 
32  /**
33  * 查询与所给字段值匹配的结果
34  * @param values {const char*[]} 匹配字段值数组,字段值的加入顺序应与 open
35  * 函数中 flds 中各个字段的顺序相同
36  * @param num {int} values 数组长度,该值不应超过构造函数中 flds 所含有的
37  * 字段个数
38  * @param cond {const char*} 匹配条件,可以为:
39  * = 等于; >= 大于等于; > 大于; < 小于; <= 小于等于
40  * @param nlimit {int} 结果集个数限制,0 表示不限制个数
41  * @param noffset {int} 结果集开始位置(0表示从第一个结果开始)
42  * @return {const std::verctor<hsrow*>&} 返回结果集
43  */
44  const std::vector<hsrow*>& get(const char* values[], int num,
45  const char* cond = "=", int nlimit = 0, int noffset = 0);
46 
47  /**
48  * 查询与所给字段值匹配的结果
49  * @param first_value {const char*} 为对应于构造函数中 flds 字段集中
50  * 的第一个字段的字段值
51  * @param ... {const char*} 参数列表,最后一个参数为 NULL 表示结束
52  * @return {const std::verctor<hsrow*>&} 返回结果集
53  */
54  const std::vector<hsrow*>& get(const char* first_value, ...)
55  ACL_CPP_PRINTF(2, 3);
56 
57  /**
58  * 更新数据库表中匹配字段的数值
59  * @param values {const char*[]} 匹配字段值数组,字段值的加入顺序应与 open
60  * 函数中 flds 中各个字段的顺序相同
61  * @param num {int} values 数组长度,该值不应超过构造函数中 flds 所含有的
62  * 字段个数
63  * @param to_values {cosnt *[]} 匹配字段新值,字段值的顺序应与 open 方法中
64  * 的字段顺序相同
65  * @param to_num {int} to_values 数组长度
66  * @param cond {const char*} 匹配条件,可以为:
67  * = 等于; >= 大于等于; > 大于; < 小于; <= 小于等于
68  * @param nlimit {int} 结果集个数限制,0 表示不限制个数
69  * @param noffset {int} 结果集开始位置(0表示从第一个结果开始)
70  * @return {bool} 更新是否成功
71  */
72  bool mod(const char* values[], int num,
73  const char* to_values[], int to_num,
74  const char* cond = "=", int nlimit = 0, int noffset = 0);
75 
76  /**
77  * 删除数据库表中匹配字段的记录
78  * @param values {const char*[]} 匹配字段值数组,字段值的加入顺序应与 open
79  * 函数中 flds 中各个字段的顺序相同
80  * @param num {int} values 数组长度,该值不应超过构造函数中 flds 所含有的
81  * 字段个数
82  * @param cond {const char*} 匹配条件,可以为:
83  * = 等于; >= 大于等于; > 大于; < 小于; <= 小于等于
84  * @param nlimit {int} 删除数据的个数, 0 表示不限制
85  * @param noffset {int} 结果集开始位置(0表示从第一个结果开始)
86  * @return {bool} 更新是否成功
87  */
88  bool del(const char* values[], int num, const char* cond = "=",
89  int nlimit = 0, int noffset = 0);
90 
91  /**
92  * 删除数据库表中匹配字段的记录
93  * @param first_value {const char*} 为对应于构造函数中 flds 字段集中
94  * 的第一个字段的字段值
95  * @param ... {const char*} 参数列表,最后一个参数为 NULL 表示结束
96  * @return {bool} 添加记录是否成功
97  */
98  bool fmt_del(const char* first_value, ...) ACL_CPP_PRINTF(2, 3);
99 
100  /**
101  * 向数据库添加新记录
102  * @param values {const char*[]} 匹配字段值数组,字段值的加入顺序应与构造
103  * 函数中 flds 中各个字段的顺序相同
104  * @param num {int} values 数组长度,该值不应超过构造函数中 flds 所含有的
105  * 字段个数
106  * @return {bool} 添加记录是否成功
107  */
108  bool add(const char* values[], int num);
109 
110  /**
111  * 向数据库中添加新记录
112  * @param first_value {const char*} 为对应于构造函数中 flds 字段集中
113  * 的第一个字段的字段值
114  * @param ... {const char*} 参数列表,最后一个参数为 NULL 表示结束
115  * @return {bool} 添加记录是否成功
116  */
117  bool fmt_add(const char* first_value, ...) ACL_CPP_PRINTF(2, 3);
118 
119  /**
120  * 设置是否进行调试
121  * @param on {bool} true 则表示进行调试,会将一些中间信息记入日志中
122  */
123  void debug_enable(bool on);
124 
125  /**
126  * 打开数据库表
127  * @param dbn {const char*} 数据库名称
128  * @param tbl {const char*} 数据库表名
129  * @param idx {const char*} 索引字段名
130  * @param flds {const char*} 要打开的数据字段名集合,格式为
131  * 由分隔符 ",; \t" 分隔的字段名称,如:user_id,user_name,user_mail
132  * @param auto_open {bool} 当表未打开是否自动打开
133  * @return {bool} true 表示正常打开,否则表示打开表失败
134  */
135  bool open_tbl(const char* dbn, const char* tbl,
136  const char* idx, const char* flds, bool auto_open = true);
137 
138  /**
139  * 获得连接地址
140  * @return {const char*} 永不为空
141  */
142  const char* get_addr() const;
143 
144  /**
145  * 获得出错错误号
146  * @return {int}
147  */
148  int get_error() const;
149 
150  /**
151  * 获得出错错误信息描述
152  * @param errnum {int} 由 get_error 获得的错误号
153  * @return {const char*}
154  */
155  const char* get_serror(int errnum) const;
156 
157  /**
158  * 获得上次出错时的错误描述信息
159  * @return {const char*}
160  */
161  const char* get_last_serror() const;
162 
163  /**
164  * 获得当前 hsclient 对象所用的 id 号
165  * @return {int}
166  */
167  int get_id() const;
168 private:
169  bool debugOn_;
170  char* addr_;
171  hsproto proto_;
172  bool retry_enable_;
173  int id_max_;
174  hstable* tbl_curr_;
175  string buf_;
176 
177  // 服务器连接流
178  socket_stream stream_;
179  std::map<string, hstable*> tables_;
180 
181  char cond_def_[2];
182  int error_;
183  const char* serror_;
184 
185  // 打开数据库连接
186  bool open_tbl(const char* dbn, const char* tbl,
187  const char* idx, const char* flds, const char* key);
188 
189  // 当读写数据库连接流出错时需要调用此函数来关闭连接流及释放
190  // 表对象
191  void close_stream();
192 
193  // 清理内部打开的数据库表的对象
194  void clear_tables();
195 
196  // 向数据库发送查询命令并取得结果数据
197  bool query(const char* oper, const char* values[], int num,
198  const char* limit_offset, char mop,
199  const char* to_values[], int to_num);
200  bool chat();
201 };
202 
203 } // namespace acl
204 
205 #endif // ACL_CLIENT_ONLY
#define ACL_CPP_PRINTF(format_idx, arg_idx)
Definition: atomic.hpp:75
#define ACL_CPP_API