acl/lib_acl_cpp/include/acl_cpp/session/session.hpp

226 lines
7.7 KiB
C++
Raw Normal View History

#pragma once
2017-06-02 14:47:24 +08:00
#include "../acl_cpp_define.hpp"
2014-11-19 00:25:21 +08:00
#include <map>
2017-06-02 14:47:24 +08:00
#include "../stdlib/dbuf_pool.hpp"
#include "../stdlib/string.hpp"
2014-11-19 00:25:21 +08:00
#ifndef ACL_CLIENT_ONLY
2014-11-19 00:25:21 +08:00
namespace acl {
// 用来存储属性值的缓冲区对象定义,这主要是为了兼容属性值
// 可以为二进制的情形而增加的结构类型
2014-11-19 00:25:21 +08:00
typedef enum
{
TODO_NUL,
TODO_SET,
TODO_DEL
} todo_t;
class ACL_CPP_API session_string : public string
2014-11-19 00:25:21 +08:00
{
public:
session_string(size_t n = 64) : string(n), todo_(TODO_NUL) {}
session_string(const session_string& ss)
: string(ss)
{
todo_ = ss.todo_;
}
session_string(const string& s) : string(s), todo_(TODO_NUL) {}
session_string(const char* s) : string(s), todo_(TODO_NUL) {}
~session_string() {}
todo_t todo_;
2014-11-19 00:25:21 +08:00
};
/**
* session 使 memcached session
2014-11-19 00:25:21 +08:00
*/
class ACL_CPP_API session : public dbuf_obj
2014-11-19 00:25:21 +08:00
{
public:
/**
* sid session 使
* sid sid get_sid()
* sid 便 sid
* @param ttl {time_t} session ()
* @param sid {const char*} session sid 使
* session sid
* sid get_sid() 使
* set_sid() session sid
* sid sid
* set_sid()
2014-11-19 00:25:21 +08:00
*/
session(time_t ttl = 0, const char* sid = NULL);
virtual ~session(void);
/**
*
2014-11-19 00:25:21 +08:00
*/
void reset(void);
/**
* session ID
* @return {const char*}
2014-11-19 00:25:21 +08:00
*/
virtual const char* get_sid(void) const
{
return sid_.c_str();
}
2014-11-19 00:25:21 +08:00
/**
* session ID
* @param sid {const char*}
*
2014-11-19 00:25:21 +08:00
*/
void set_sid(const char* sid);
/**
* session set/set_ttl delay true
*
* @return {bool}
2014-11-19 00:25:21 +08:00
*/
virtual bool flush();
2014-11-19 00:25:21 +08:00
/**
* session
* session ()
* @param name {const char*} session
* @param value {const char*} session
* @return {bool} false
2014-11-19 00:25:21 +08:00
*/
virtual bool set(const char* name, const char* value);
2014-11-19 00:25:21 +08:00
/**
* session session ()
* @param name {const char*} session
* @param value {const char*} session
* @param len {size_t} value
* @return {bool} false
2014-11-19 00:25:21 +08:00
*/
virtual bool set(const char* name, const void* value, size_t len);
/**
* session session ()
* session::flush
* @param name {const char*} session
* @param value {const char*} session
* @param len {size_t} value
* @return {bool} false
*/
virtual bool set_delay(const char* name, const void* value, size_t len);
2014-11-19 00:25:21 +08:00
/**
* session
* @param name {const char*} session
* @return {const char*} session
* (: "\0")
*
*
2014-11-19 00:25:21 +08:00
*/
const char* get(const char* name);
2014-11-19 00:25:21 +08:00
/**
* session
* @param name {const char*} session
* @return {const session_string*} session
*
*
*
2014-11-19 00:25:21 +08:00
*/
virtual const session_string* get_buf(const char* name);
2014-11-19 00:25:21 +08:00
/**
* session
* memcached
* @param name {const char*} session
* @return {bool} true ()false
*
* session::flush
*
2014-11-19 00:25:21 +08:00
*/
virtual bool del_delay(const char* name);
virtual bool del(const char* name);
2014-11-19 00:25:21 +08:00
/**
* session
* @param ttl {time_t} ()
* @param delay {bool} true
* session::flush
* false
* @return {bool}
2014-11-19 00:25:21 +08:00
*/
bool set_ttl(time_t ttl, bool delay);
2014-11-19 00:25:21 +08:00
/**
* session session
*
* session
2014-11-19 00:25:21 +08:00
* @return {time_t}
*/
time_t get_ttl(void) const
{
return ttl_;
}
2014-11-19 00:25:21 +08:00
/**
* 使 session 使 session
* @return {bool} 使 session
2014-11-19 00:25:21 +08:00
*/
virtual bool remove(void) = 0;
/**
* sid
* @param attrs {std::map<string, session_string>&}
* @return {bool}
*/
virtual bool get_attrs(std::map<string, session_string>& attrs) = 0;
/**
* sid
* @param names {const std::vector<string>&}
* @param values {std::vector<session_string>&}
* @return {bool}
*/
virtual bool get_attrs(const std::vector<string>& names,
std::vector<session_string>& values);
/**
* sid
* @param attrs {std::map<string, session_string>&}
* @return {bool}
*/
virtual bool set_attrs(const std::map<string, session_string>& attrs) = 0;
2014-11-19 00:25:21 +08:00
protected:
// 设置对应 sid 数据的过期时间
virtual bool set_timeout(time_t ttl) = 0;
2014-11-19 00:25:21 +08:00
protected:
// 将 session 数据序列化
static void serialize(const std::map<string, session_string>& attrs,
string& out);
2014-11-19 00:25:21 +08:00
// 将 session 数据反序列化
static void deserialize(string& buf,
std::map<string, session_string>& attrs);
2014-11-19 00:25:21 +08:00
// 清空 session 属性集合
static void attrs_clear(std::map<string, session_string>& attrs);
2014-11-19 00:25:21 +08:00
protected:
session_string sid_;
2014-11-19 00:25:21 +08:00
time_t ttl_;
// 该变量主要用在 set_ttl 函数中,如果推测该 sid_ 只是新产生的
// 且还没有在后端 cache 服务端存储,则 set_ttl 不会立即更新后端
// 的 cache 服务器
2014-11-19 00:25:21 +08:00
bool sid_saved_;
bool dirty_;
std::map<string, session_string> attrs_;
std::map<string, session_string> attrs_cache_;
2014-11-19 00:25:21 +08:00
};
} // namespace acl
#endif // ACL_CLIENT_ONLY