#ifndef __TANGO_CACHE_CLIENT_H__ #define __TANGO_CACHE_CLIENT_H__ #include #include #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_MEM_COPY=0, //拷贝这块内存 PUT_MEM_FREE, //不拷贝内存,发送完毕由本缓存模块释放该内存 }; enum EVBUFFER_COPY_WAY { EVBUFFER_MOVE=0,//evbuffer_add_buffer EVBUFFER_COPY, //evbuffer_add_buffer_reference }; 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 put_time_strategy { time_t relative_ttl; //PUT: 缓存最大生存时间;0表示使用配置文件的默认值 time_t absulote_lastmod;//PUT: }; struct get_time_strategy { time_t max_age; //GET: time_t min_fresh;//GET: }; struct tango_cache_meta { const char* url; const char* std_hdr[HDR_CONTENT_NUM]; //完整头部,如包含"Content-Type:",不要包含换行 const char* other_hdr; //最大长度不能超过1535字节,GET时会原样返回 union{ struct put_time_strategy put;//TODO struct get_time_strategy get; }; }; 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_data(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 *objectkey, size_t keysize); int tango_cache_upload_once_evbuf(struct tango_cache_instance *instance, struct future* future, enum EVBUFFER_COPY_WAY way, struct evbuffer *evbuf, struct tango_cache_meta *meta, char *objectkey, size_t keysize); //流式上传 //若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_data(struct tango_cache_ctx *ctx, const char *data, size_t size); int tango_cache_update_frag_evbuf(struct tango_cache_ctx *ctx, enum EVBUFFER_COPY_WAY way, struct evbuffer *evbuf); 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