acl  3.5.3.0
redis_result.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "../stdlib/noncopyable.hpp"
4 #include <vector>
5 
6 #if !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
7 
8 namespace acl
9 {
10 
11 typedef enum
12 {
21 
22 class string;
23 class dbuf_pool;
24 class redis_client;
25 
26 /**
27  * 对 redis-server 返回结果对象类,对 redis-server 返回的数据进行分析后创建
28  * redis_result 类对象。
29  * the redis result for redis-server's reply
30  */
32 {
33 public:
34  redis_result(dbuf_pool* dbuf);
35 
36  /**
37  * 重载了 new/delete 操作符,在 new 新对象时,使内存的分配在
38  * 内存池进行分配
39  * override new/delete operator, when the new object was created,
40  * memory was alloc in dbuf_pool, which is a memroy pool allocator
41  */
42  void *operator new(size_t size, dbuf_pool* pool);
43  void operator delete(void* ptr, dbuf_pool* pool);
44 
45  /**
46  * 获得当前结果结点的数据类型
47  * get the data type of the reply from redis-server
48  * @return {redis_result_t}
49  * defined above REDIS_RESULT_
50  */
52  {
53  return result_type_;
54  }
55 
56  /**
57  * 获得当前结果结点存储的对象的个数
58  * get the number of objects from redis-server
59  * @return {size_t} 返回值与存储类型的对应关系如下:
60  * the relation between returned value and result type show below:
61  * REDIS_RESULT_ERROR: 1
62  * REDIS_RESULT_STATUS: 1
63  * REDIS_RESULT_INTEGER: 1
64  * REDIS_RESULT_STRING: > 0 时表示该字符串数据被切分成非连接内存块的个数
65  * REDIS_RESULT_ARRAY: children_->size()
66  */
67  size_t get_size(void) const;
68 
69  /**
70  * 当返回值为 REDIS_RESULT_INTEGER 类型时,本方法返回对应的 32 位整数值
71  * get the 32 bits integer for REDIS_RESULT_INTEGER result
72  * @param success {bool*} 本指针非 NULL 时记录操作过程是否成功
73  * when not NULL, storing the status of success
74  * @return {int}
75  */
76  int get_integer(bool* success = NULL) const;
77 
78  /**
79  * 当返回值为 REDIS_RESULT_INTEGER 类型时,本方法返回对应的 64 位整数值
80  * get the 64 bits integer for REDIS_RESULT_INTEGER result
81  * @param success {bool*} 本指针非 NULL 时记录操作过程是否成功
82  * when not NULL, storing the status of success
83  * @return {long long int}
84  */
85  long long int get_integer64(bool* success = NULL) const;
86 
87  /**
88  * 当返回值为 REDIS_RESULT_STRING 类型时,本方法返回对应的 double 类型值
89  * get the double value for REDIS_RESULT_STRING result
90  * @param success {bool*} 本指针非 NULL 时记录操作过程是否成功
91  * when not NULL, storing the status of success
92  * @return {double}
93  */
94  double get_double(bool* success = NULL) const;
95 
96  /**
97  * 当返回值为 REDIS_RESULT_STATUS 类型时,本方法返回状态信息
98  * get operation status for REDIS_RESULT_STATUS result
99  * @return {const char*} 返回 "" 表示出错
100  * error if empty string returned
101  */
102  const char* get_status() const;
103 
104  /**
105  * 当出错时返回值为 REDIS_RESULT_ERROR 类型,本方法返回出错信息
106  * when some error happened, this can get the error information
107  * @return {const char*} 返回空串 "" 表示没有出错信息
108  * there was no error information if empty string returned
109  */
110  const char* get_error(void) const;
111 
112  /**
113  * 返回对应下标的数据(当数据类型非 REDIS_RESULT_ARRAY 时)
114  * get the string data of associated subscript(just for the type
115  * of no REDIS_RESULT_ARRAY)
116  * @param i {size_t} 数组下标
117  * the array's subscript
118  * @param len {size_t*} 当为非 NULL 指针时存储所返回数据的长度
119  * when not NULL, the parameter will store the length of the result
120  * @return {const char*} 返回 NULL 表示下标越界
121  * NULL if nothing exists or the subscript is out of bounds
122  */
123  const char* get(size_t i, size_t* len = NULL) const;
124 
125  /**
126  * 返回所有的数据数组(当数据类型非 REDIS_RESULT_ARRAY 时)地址
127  * return all data's array if the type isn't REDIS_RESULT_ARRAY
128  * @return {const char**}
129  */
130  const char** gets_argv(void) const
131  {
132  return (const char**) argv_;
133  }
134 
135  /**
136  * 返回所有的数据长度数组(当数据类型非 REDIS_RESULT_ARRAY 时)地址
137  * return all length's array if the type isn't REDIS_RESULT_ARRAY
138  * @return {const size_t*}
139  */
140  const size_t* get_lens(void) const
141  {
142  return lens_;
143  }
144 
145  /**
146  * 返回所有数据的总长度(当数据类型非 REDIS_RESULT_ARRAY 时)
147  * return the total length of all data for no REDIS_RESULT_ARRAY
148  * @return {size_t}
149  */
150  size_t get_length(void) const;
151 
152  /**
153  * 当数据类型为 REDIS_RESULT_STRING 类型时,该函数将按内存块存放的数据
154  * 存储至连接内存中,但需要注意防止内存溢出
155  * compose a continus data for the slicing chunk data internal
156  * @param buf {string&} 存储结果数据,内部会先调用 buf.clear()
157  * store the result
158  * @return {int} 数据的总长度,返回值 0 表示内部数组为空
159  * return the total length of data, 0 if data array has no elements
160  */
161  int argv_to_string(string& buf) const;
162  int argv_to_string(char* buf, size_t size) const;
163 
164  /**
165  * 当数据类型为 REDIS_RESULT_ARRAY 类型时,该函数返回所有的数组对象
166  * return the objects array when result type is REDIS_RESULT_ARRAY
167  * @param size {size_t*} 当返回数组非空时,则该地址存放数组长度
168  * store the array's length if size isn't NULL
169  * @return {const const redis_result*}
170  */
171  const redis_result** get_children(size_t* size) const;
172 
173  /**
174  * 当数据类型为 REDIS_RESULT_ARRAY 类型时,该函数返回对应下标的结果对象
175  * get one object of the given subscript from objects array
176  * @param i {size_t} 下标值
177  * the given subscript
178  * @return {const redis_result*} 当下标值越界或结果不存在时,则返回 NULL
179  * NULL if subscript is out of bounds or object not exist
180  */
181  const redis_result* get_child(size_t i) const;
182 
183  /**
184  * 返回构造函数传入的内存池对象
185  * get the memory pool object set in constructor
186  * @return {dbuf_pool*}
187  */
189  {
190  return dbuf_;
191  }
192 
193  /**
194  * 将整个对象转换成字符串
195  * @param out {string&} 存储结果(以追加方式添加)
196  * @return {const string&}
197  */
198  const string& to_string(string& out) const;
199 
200 private:
201  ~redis_result(void);
202 
203  friend class redis_client;
204  void clear(void);
205 
206  redis_result& set_type(redis_result_t type);
207  redis_result& set_size(size_t size);
208  redis_result& put(const char* buf, size_t len);
209  redis_result& put(const redis_result* rr, size_t idx);
210 
211 private:
212  redis_result_t result_type_;
213  dbuf_pool* dbuf_;
214 
215  size_t size_;
216  size_t idx_;
217  const char** argv_;
218  size_t* lens_;
219 
220  //std::vector<const redis_result*>* children_;
221  const redis_result** children_;
222  size_t children_size_;
223  size_t children_idx_;
224 };
225 
226 } // namespace acl
227 
228 #endif // !defined(ACL_CLIENT_ONLY) && !defined(ACL_REDIS_DISABLE)
const char ** gets_argv(void) const
dbuf_pool * get_dbuf(void)
redis_result_t
redis_result_t get_type(void) const
const size_t * get_lens(void) const
#define ACL_CPP_API