This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-tfe/cache/include/tango_cache_client.h
zhangchengwei 0bfd49194e 创建
2018-10-08 19:33:01 +08:00

105 lines
3.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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