⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 session_buf.h

📁 朋友的作品
💻 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 + -