acl  3.5.3.0
session.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <map>
4 #include "../stdlib/dbuf_pool.hpp"
5 #include "../stdlib/string.hpp"
6 
7 #ifndef ACL_CLIENT_ONLY
8 
9 namespace acl {
10 
11 // 用来存储属性值的缓冲区对象定义,这主要是为了兼容属性值
12 // 可以为二进制的情形而增加的结构类型
13 typedef enum
14 {
18 } todo_t;
19 
21 {
22 public:
23  session_string(size_t n = 64) : string(n), todo_(TODO_NUL) {}
25  : string(ss)
26  {
27  todo_ = ss.todo_;
28  }
29  session_string(const string& s) : string(s), todo_(TODO_NUL) {}
30  session_string(const char* s) : string(s), todo_(TODO_NUL) {}
33 };
34 
35 /**
36  * session 类,该类使用 memcached 存储 session 数据
37  */
39 {
40 public:
41  /**
42  * 当构造函数的参数 sid 非空时,则该 session 对象使用该
43  * sid;否则内部会自动生成一个 sid,用户应该通过 get_sid()
44  * 获得这个自动生成的 sid 以便于每次查询该 sid 对应的数据
45  * @param ttl {time_t} 指定 session 的生存周期(秒)
46  * @param sid {const char*} 非空时,则 session 的 sid 使
47  * 该值,否则内部会产生一个随机的 session sid,该随机的
48  * sid 可以通过调用 get_sid() 获得;当然在使用过程中,用户
49  * 也可以通过 set_sid() 修改本对象的 session sid;
50  * 此外,如果该 sid 为空,则如果用户查查找某个 sid 对应的
51  * 数据,则用户必须先调用 set_sid()
52  */
53  session(time_t ttl = 0, const char* sid = NULL);
54  virtual ~session(void);
55 
56  /**
57  * 重置内部状态,清理掉一些临时数据
58  */
59  void reset(void);
60 
61  /**
62  * 获得本 session 对象的唯一 ID 标识
63  * @return {const char*} 非空
64  */
65  virtual const char* get_sid(void) const
66  {
67  return sid_.c_str();
68  }
69 
70  /**
71  * 设置本 session 对象的唯一 ID 标识
72  * @param sid {const char*} 非空
73  * 注:调用本函数后,会自动清除之前的中间缓存数据
74  */
75  void set_sid(const char* sid);
76 
77  /**
78  * 当调用 session 类的 set/set_ttl 时,如果最后一个参数 delay 为 true,
79  * 则必须通过调用本函数将数据真正进行更新
80  * @return {bool} 数据更新是否成功
81  */
82  virtual bool flush();
83 
84  /**
85  * 向 session 中添加新的字符串属性,同时设置该
86  * session 的过期时间间隔(秒)
87  * @param name {const char*} session 名,非空
88  * @param value {const char*} session 值,非空
89  * @return {bool} 返回 false 表示出错
90  */
91  virtual bool set(const char* name, const char* value);
92 
93  /**
94  * 向 session 中添加新的属性对象并设置该 session 的过期时间间隔(秒),
95  * @param name {const char*} session 属性名,非空
96  * @param value {const char*} session 属性值,非空
97  * @param len {size_t} value 值长度
98  * @return {bool} 返回 false 表示出错
99  */
100  virtual bool set(const char* name, const void* value, size_t len);
101 
102  /**
103  * 延迟向 session 中添加新的属性对象并设置该 session 的过期时间间隔(秒),
104  * 当用户调用了 session::flush 后再进行数据更新, 这样可以提高传输效率
105  * @param name {const char*} session 属性名,非空
106  * @param value {const char*} session 属性值,非空
107  * @param len {size_t} value 值长度
108  * @return {bool} 返回 false 表示出错
109  */
110  virtual bool set_delay(const char* name, const void* value, size_t len);
111 
112  /**
113  * 从 session 中取得字符串类型属性值
114  * @param name {const char*} session 属性名,非空
115  * @return {const char*} session 属性值,返回的指针地址永远非空,用户
116  * 可以通过判断返回的是否是空串(即: "\0")来判断出错或不存在
117  * 注:该函数返回非空数据后,用户应该立刻保留此返回值,因为下次
118  * 的其它函数调用可能会清除该临时返回数据
119  */
120  const char* get(const char* name);
121 
122  /**
123  * 从 session 中取得二进制数据类型的属性值
124  * @param name {const char*} session 属性名,非空
125  * @return {const session_string*} session 属性值,返回空时
126  * 表示出错或不存在
127  * 注:该函数返回非空数据后,用户应该立刻保留此返回值,因为下次
128  * 的其它函数调用可能会清除该临时返回数据
129  */
130  virtual const session_string* get_buf(const char* name);
131 
132  /**
133  * 从 session 中删除指定属性值,当所有的变量都删除
134  * 时会将整个对象从 memcached 中删除
135  * @param name {const char*} session 属性名,非空
136  * @return {bool} true 表示成功(含不存在情况),false 表示删除失败
137  * 注:当采用延迟方式删除某个属性时,则延迟发送更新指令到后端的
138  * 缓存服务器,当用户调用了 session::flush 后再进行数据更新,这
139  * 样可以提高传输效率;否则,则立刻更新数据
140  */
141  virtual bool del_delay(const char* name);
142  virtual bool del(const char* name);
143 
144  /**
145  * 重新设置 session 在缓存服务器上的缓存时间
146  * @param ttl {time_t} 生存周期(秒)
147  * @param delay {bool} 当为 true 时,则延迟发送更新指令到后端的
148  * 缓存服务器,当用户调用了 session::flush 后再进行数据更新,这
149  * 样可以提高传输效率;当为 false 时,则立刻更新数据
150  * @return {bool} 设置是否成功
151  */
152  bool set_ttl(time_t ttl, bool delay);
153 
154  /**
155  * 获得本 session 对象中记录的 session 生存周期;该值有可能
156  * 与真正存储在缓存服务器的时间不一致,因为有可能其它的实例
157  * 重新设置了 session 在缓存服务器上的生存周期
158  * @return {time_t}
159  */
160  time_t get_ttl(void) const
161  {
162  return ttl_;
163  }
164 
165  /**
166  * 使 session 从服务端的缓存中删除即使 session 失效
167  * @return {bool} 是否使 session 失效
168  */
169  virtual bool remove(void) = 0;
170 
171  /**
172  * 从后端缓存中获得对应 sid 的属性对象集合
173  * @param attrs {std::map<string, session_string>&}
174  * @return {bool}
175  */
176  virtual bool get_attrs(std::map<string, session_string>& attrs) = 0;
177 
178  /**
179  * 从后端缓存中获得对应 sid 的指定属性集合
180  * @param names {const std::vector<string>&} 属性名集合
181  * @param values {std::vector<session_string>&} 存储对应的属性值结果集
182  * @return {bool} 操作是否成功
183  */
184  virtual bool get_attrs(const std::vector<string>& names,
185  std::vector<session_string>& values);
186 
187  /**
188  * 向后端缓存写入对应 sid 的属性对象集合
189  * @param attrs {std::map<string, session_string>&}
190  * @return {bool}
191  */
192  virtual bool set_attrs(const std::map<string, session_string>& attrs) = 0;
193 
194 protected:
195  // 设置对应 sid 数据的过期时间
196  virtual bool set_timeout(time_t ttl) = 0;
197 
198 protected:
199  // 将 session 数据序列化
200  static void serialize(const std::map<string, session_string>& attrs,
201  string& out);
202 
203  // 将 session 数据反序列化
204  static void deserialize(string& buf,
205  std::map<string, session_string>& attrs);
206 
207  // 清空 session 属性集合
208  static void attrs_clear(std::map<string, session_string>& attrs);
209 
210 protected:
212  time_t ttl_;
213 
214  // 该变量主要用在 set_ttl 函数中,如果推测该 sid_ 只是新产生的
215  // 且还没有在后端 cache 服务端存储,则 set_ttl 不会立即更新后端
216  // 的 cache 服务器
218  bool dirty_;
219  std::map<string, session_string> attrs_;
220  std::map<string, session_string> attrs_cache_;
221 };
222 
223 } // namespace acl
224 
225 #endif // ACL_CLIENT_ONLY
time_t get_ttl(void) const
Definition: session.hpp:160
session_string(const char *s)
Definition: session.hpp:30
todo_t
Definition: session.hpp:13
HTTP_API void const char * name
Definition: lib_http.h:620
void serialize(T &o, string &buf)
Definition: serialize.hpp:33
std::map< string, session_string > attrs_cache_
Definition: session.hpp:220
bool deserialize(json &j, T &o, string *err=NULL)
Definition: serialize.hpp:11
std::map< string, session_string > attrs_
Definition: session.hpp:219
time_t ttl_
Definition: session.hpp:212
session_string(const session_string &ss)
Definition: session.hpp:24
virtual const char * get_sid(void) const
Definition: session.hpp:65
session_string(size_t n=64)
Definition: session.hpp:23
session_string sid_
Definition: session.hpp:211
#define ACL_CPP_API
session_string(const string &s)
Definition: session.hpp:29
bool sid_saved_
Definition: session.hpp:217