📄 session_buf.h
字号:
#ifndef _BUF_UNSIGNED_KEY_SESSION_H_
#define _BUF_UNSIGNED_KEY_SESSION_H_
/**
* session 结构:
* ---------------------------------------------------
* Head: index num/data num/data size/...
* ---------------------------------------------------
* Hash区: |K1|K2|K3...|K(index num-1)
* ---------------------------------------------------
* List链表区
* ---------------------------------------------------
* SessionData区
*
* ---------------------------------------------------
*
* 2005-03-22
* @author casper@tencent.com
* @version 0.1
*/
#include "session_data.h"
//////////////////////////////////////////////////////////////////////////
class CSessionBuf
{
public:
CSessionBuf();
~CSessionBuf();
/**
* 计算buf长度
* @param indexnum - 索引数量
* @param datanum - 数据块数量
* @param datasize - 数据块大小
*/
static unsigned CalBufLen(size_t indexnum,size_t datanum,size_t datasize)
{return Head_Length + indexnum*sizeof(Buf_Hash) + sizeof(Buf_List)*datanum + CSessionData::CalBufLen(datanum, datasize);}
void Create(char* pBuf, size_t iBufSize
, size_t indexnum,size_t datanum,size_t datasize,unsigned timeout) throw(runtime_error);
void Attach(char* pBuf, size_t iBufSize
, size_t indexnum,size_t datanum,size_t datasize,unsigned timeout) throw(runtime_error);
/**
* 取data
* @return true-取到 false-未取到或超时
*/
bool Get(unsigned key,char * data,size_t datasize,time_t tnow);
/**
* 删除data,如果无数据,直接返回
*/
void Delete(unsigned key);
/**
* 删除data,如果无数据,添加
*/
void Update(unsigned key,char * data,size_t datasize,time_t tnow) throw(session_buf_full);
/**
* 设置超时时间间隔
*/
void SetTimeOut(unsigned timeout) {_buf_head->timeout = timeout;}
void DumpBuf(const char * pBuf,size_t iBufLen);
protected:
int FindNode(int offset,unsigned key);
void RemoveNode(unsigned hashindx,int offset);
void Insert(unsigned key,char * data,size_t datasize,time_t tnow) throw(session_buf_full);
private:
#pragma pack(1)
struct Buf_Head{
size_t buf_len;
size_t index_num;
size_t data_num;
size_t data_size;
unsigned timeout;
};
struct Buf_Hash{
int offset;
};
struct Buf_List{
unsigned key;
int previous; //-1表示无
int next;
time_t access;
};
#pragma pack()
private:
static const unsigned Head_Length = 64;
Buf_Head * _buf_head;
Buf_Hash * _buf_hash;
Buf_List * _list_arr;
CSessionData _session_data;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -