105 lines
3.3 KiB
C
105 lines
3.3 KiB
C
#ifndef __TANGO_CACHE_CLIENT_H__
|
||
#define __TANGO_CACHE_CLIENT_H__
|
||
|
||
#include <event2/event.h>
|
||
#include <event.h>
|
||
|
||
#include "tfe_future.h"
|
||
|
||
enum CACHE_ERR_CODE
|
||
{
|
||
CACHE_OK=0,
|
||
CACHE_CACHE_MISS, //缓存未命中
|
||
CACHE_TIMEOUT, //缓存超时
|
||
CACHE_OUTOF_MEMORY,//当前内存占用超过限制,查看MAX_USED_MEMORY_SIZE_MB是否过小或者当前上传速率跟不上调用者的速率
|
||
CACHE_ERR_CURL,
|
||
CACHE_ERR_UNKNOWN
|
||
};
|
||
|
||
enum PUT_MEMORY_COPY_WAY
|
||
{
|
||
PUT_ONCE_COPY=0, //拷贝这块内存
|
||
PUT_ONCE_FREE, //不拷贝内存,发送完毕由本缓存模块释放该内存
|
||
};
|
||
|
||
struct cache_statistics
|
||
{
|
||
long long get_recv_num; //发起GET的次数
|
||
long long get_succ_num; //GET成功的次数
|
||
long long get_fail_num; //GET失败的次数
|
||
long long put_recv_num; //发起UPLOAD的次数
|
||
long long put_succ_num; //UPLOAD成功的次数
|
||
long long put_fail_num; //UPLOAD失败的次数
|
||
long long memory_used; //当前UPLOAD BODY所占内存大小
|
||
long long session_num; //当前正在进行GET/PUT的HTTP会话数
|
||
};
|
||
|
||
enum CACHE_RESULT_TYPE
|
||
{
|
||
RESULT_TYPE_HEADER=0,
|
||
RESULT_TYPE_BODY,
|
||
};
|
||
|
||
//promise_success的结果result
|
||
struct tango_cache_result
|
||
{
|
||
void *data_frag; //如果type为RESULT_TYPE_HEADER,内容会包含一个换行
|
||
size_t size;
|
||
enum CACHE_RESULT_TYPE type;
|
||
};
|
||
|
||
enum CACHE_HTTP_HDR_TYPE
|
||
{
|
||
HDR_CONTENT_TYPE=0,
|
||
HDR_CONTENT_ENCODING,
|
||
HDR_CONTENT_DISPOSITION,
|
||
HDR_CONTENT_MD5,
|
||
|
||
HDR_CONTENT_NUM,
|
||
};
|
||
|
||
struct tango_cache_meta
|
||
{
|
||
const char* url;
|
||
const char* std_hdr[HDR_CONTENT_NUM]; //完整头部,如包含"Content-Type:",不要包含换行
|
||
const char* other_hdr; //最大长度不能超过1535字节,GET时会原样返回
|
||
//GET: 要求
|
||
//PUT: 缓存最大生存时间;0表示使用配置文件的默认值
|
||
time_t relative_ttl;
|
||
time_t max_age;
|
||
};
|
||
|
||
struct tango_cache_instance;
|
||
struct tango_cache_ctx;
|
||
|
||
enum CACHE_ERR_CODE tango_cache_get_last_error(const struct tango_cache_ctx *ctx);
|
||
enum CACHE_ERR_CODE tango_cache_ctx_error(const struct tango_cache_instance *instance);
|
||
void tango_cache_get_statistics(const struct tango_cache_instance *instance, struct cache_statistics *out);
|
||
|
||
/*以下所有API线程不安全*/
|
||
//每个监听线程创建一个instance
|
||
struct tango_cache_instance *tango_cache_instance_new(struct event_base* evbase,const char* profile_path, const char* section, void *runtimelog);
|
||
|
||
//成功时回调promise_success, result为NULL时表示结束;
|
||
//失败时回调promise_failed(仅一次),使用get_last_error获取错误码;
|
||
//future不可以为NULL
|
||
int tango_cache_fetch(struct tango_cache_instance *instance, struct future* future, struct tango_cache_meta *meta);
|
||
|
||
/*UPLOAD接口的API*/
|
||
//完整一次上传;若filename不为空,则输出对象的KEY,当CACHE_OBJECT_KEY_HASH_SWITCH=1开启对文件名哈希时有用
|
||
//返回0表示成功,<0表示失败;下同
|
||
int tango_cache_upload_once(struct tango_cache_instance *instance, struct future* future, enum PUT_MEMORY_COPY_WAY way, const char *data, size_t size, struct tango_cache_meta *meta, char *filename, size_t namelen);
|
||
|
||
//流式上传
|
||
//若tango_cache_update_start返回NULL,调用tango_cache_ctx_error查看错误码是否是CACHE_OUTOF_MEMORY(正常情况下是)
|
||
//若future不为NULL,则在上传结束时会调用通知回调函数,否则不调用
|
||
struct tango_cache_ctx *tango_cache_update_start(struct tango_cache_instance *instance, struct future* future, struct tango_cache_meta *meta);
|
||
int tango_cache_update_frag(struct tango_cache_ctx *ctx, const char *data, size_t size);
|
||
void tango_cache_update_end(struct tango_cache_ctx *ctx);
|
||
|
||
//获取对象key值;当CACHE_OBJECT_KEY_HASH_SWITCH=1开启对文件名哈希时有用
|
||
const char *tango_cache_get_object_key(struct tango_cache_ctx *ctx);
|
||
|
||
#endif
|
||
|