#ifndef	__CONN_CACHE_INCLUDE_H__
#define	__CONN_CACHE_INCLUDE_H__

#include "lib_acl.h"

#ifdef	__cplusplus
extern "C" {
#endif

typedef struct CONN_CACHE {
	ACL_AIO *aio;
	ACL_HTABLE *cache;
	int   conn_limit;
	int   nset;
	int   nget;
	int   nclose;
} CONN_CACHE;

typedef struct CONN CONN;

/**
 * 连接池初始化函数, 该函数仅在程序初始化时被调用一次
 * @param aio {ACL_AIO*} 异步流对象
 * @param conn_limit {int} 每一个连接池的数量限制
 * @return {CONN_CACHE*} 创建一个连接池的缓存对象
 */
CONN_CACHE *conn_cache_create(ACL_AIO *aio, int conn_limit);

/**
 * 向连接池中添加一个连接流
 * @param cache {CONN_CAHCE*} 长连接缓存对象
 * @param timeout {int} 该连接的超时时间
 * @param free_fn {void (*)(ACL_ASTREAM*, void*)} 关闭连接时的回调函数,
 *  如果该参数非空，则当该连接被关闭前会自动调用 free_fn
 * @param ctx {void*} free_fn 的参数之一
 */
void conn_cache_push_stream(CONN_CACHE *cache, ACL_ASTREAM *stream,
	int timeout, void (*free_fn)(ACL_ASTREAM*, void*), void *ctx);

/**
 * 从连接池取出对应某个键值的连接对象
 * @param cache {CONN_CAHCE*} 长连接缓存对象
 * @param key {const char*} 查询键值，如：192.168.0.1:80
 * @return {CONN*} 连接对象, 若为 NULL 则表示不存在
 */
CONN *conn_cache_get_conn(CONN_CACHE *cache, const char *key);

/**
 * 从连接池取出对应某个键值的连接流
 * @param cache {CONN_CAHCE*} 长连接缓存对象
 * @param key {const char*} 查询键值，如：192.168.0.1:80
 * @param ctx_pptr {void**} 如果结果非空，则存储用户的自定义变量
 * @return {ACL_ASTREAM*} 连接流
 */
ACL_ASTREAM *conn_cache_get_stream(CONN_CACHE *cache, const char *key, void **ctx_pptr);

/**
 * 从连接池中删除对应某个键值的连接
 * @param cache {CONN_CAHCE*} 长连接缓存对象
 * @param key {const char*} 查询键值，如：192.168.0.1:80
 */
void conn_cache_delete_key(CONN_CACHE *cache, const char *key);

/**
 * 从连接池中删除某个连接对象且关闭连接流
 * @param conn {CONN*} 连接对象
 */
void conn_cache_delete_conn(CONN *conn);

/**
 * 从连接池中删除某个连接流并删除对应的连接对象且关闭连接流
 * @param cache {CONN_CAHCE*} 长连接缓存对象
 * @param stream {ACL_ASTREAM*} 连接流
 */
void conn_cache_delete_stream(CONN_CACHE *cache, ACL_ASTREAM *stream);

#ifdef	__cplusplus
}
#endif

#endif
