
/*
 * Copyright (C) 2010-2015 Alibaba Group Holding Limited
 */


#ifndef _NGX_HTTP_TFS_TAIR_HELPER_H_INCLUDED_
#define _NGX_HTTP_TFS_TAIR_HELPER_H_INCLUDED_


#include <ngx_tfs_common.h>
#ifdef NGX_HTTP_TFS_USE_TAIR
#include <ngx_http_etair_type.h>
#endif


typedef struct {
    uint32_t                          server_addr_hash;
    ngx_int_t                         area;

#ifdef NGX_HTTP_TFS_USE_TAIR
    ngx_http_etair_server_conf_t     *server;
#endif
} ngx_http_tfs_tair_instance_t;


typedef struct {
    ngx_str_t  server[NGX_HTTP_TFS_TAIR_SERVER_ADDR_PART_COUNT];
    ngx_int_t  area;
} ngx_http_tfs_tair_server_addr_info_t;


#ifndef NGX_HTTP_TFS_USE_TAIR

#define NGX_HTTP_TAIR_BYTEARRAY       9
#define NGX_HTTP_TAIR_INT             1
#define NGX_HTTP_ETAIR_SUCCESS        0


typedef struct {

    size_t                            len;
    u_char                           *data;

    ngx_uint_t                        type;
} ngx_http_tair_data_t;

typedef struct {
    ngx_http_tair_data_t              key;
    ngx_http_tair_data_t             *value;

    ngx_int_t                         version;
    ngx_int_t                         exptime;

    ngx_int_t                         rc;
} ngx_http_tair_key_value_t;

typedef void (*ngx_http_tair_handler_pt)(ngx_int_t rc, void *data);
typedef void (*ngx_http_tair_get_handler_pt)(ngx_http_tair_key_value_t *kv,
    ngx_int_t rc, void *data);
typedef void (*ngx_http_tair_mget_handler_pt)(ngx_array_t *kvs, ngx_int_t rc,
    void *data);

#endif

ngx_int_t ngx_http_tfs_tair_get_helper(ngx_http_tfs_tair_instance_t *instance,
    ngx_pool_t *pool, ngx_log_t *log,
    ngx_http_tair_data_t *key, ngx_http_tair_get_handler_pt callback,
    void *data);

ngx_int_t ngx_http_tfs_tair_mget_helper(ngx_http_tfs_tair_instance_t *instance,
    ngx_pool_t *pool, ngx_log_t *log,
    ngx_array_t *kvs, ngx_http_tair_mget_handler_pt callback, void *data);

ngx_int_t
ngx_http_tfs_tair_put_helper(ngx_http_tfs_tair_instance_t *instance,
    ngx_pool_t *pool, ngx_log_t *log,
    ngx_http_tair_data_t *key, ngx_http_tair_data_t *value,
    ngx_int_t expire, ngx_int_t version,
    ngx_http_tair_handler_pt callback, void *data);

ngx_int_t
ngx_http_tfs_tair_delete_helper(ngx_http_tfs_tair_instance_t *instance,
    ngx_pool_t *pool, ngx_log_t *log,
    ngx_array_t *keys, ngx_http_tair_handler_pt callback, void *data);

ngx_int_t
ngx_http_tfs_parse_tair_server_addr_info(
    ngx_http_tfs_tair_server_addr_info_t *info,
    u_char *addr, uint32_t len, void* pool, uint8_t shared_memory);



#endif  /* _NGX_HTTP_TFS_TAIR_HELPER_H_INCLUDED_ */
