#ifndef DB_H
#define DB_H
/* 返回值 */
#define DB_RET_OK          0
#define DB_RET_ERR         1
#define DB_RET_PARAM_NULL  2
#define DB_RET_PARAM_ERR   3

/* 数据库操作类型 */
#define DB_OP_INSERT       1
#define DB_OP_DEL          2
#define DB_OP_UPDATE       3

/* 数据库支持的参数类型 */
#define DB_DATA_INT_TYPE     1
#define DB_DATA_STRING_TYPE  2
#define DB_DATA_FLOAT_TYPE   3
#endif

/* 模块ID */
enum
{
	DB_MODULE_ID_INVALID = 0,
	DB_MODULE_ID_MAX,
};

/* 数据库TABLE属性 */
#define DB_ROWS 20                 /* 支持的最大列数 */
#define DB_COLUMN 1                /* 单次查询获取的条目数 */      
#define DB_ROWS_MAX_LEN  50        /* 列支持的最大长度。单位:字节 */

/*********************************************************************************
  * Description:  
  *       连接数据库操作
  * Input:  
  *       module_id - 模块ID,每个模块需要向数据库模块设置模块ID,用于打印、统计使用
  * Output:
  *       无
  * Return:
  *       数据库句柄
  *       NULL - 连接数据库失败
  *       非NULL - 连接数据库成功
  * Others:
  *       无
**********************************************************************************/
void * connect_database (int module_id);

/*********************************************************************************
  * Description:  
  *       释放数据库连接
  * Input:  
  *       module_id - 模块ID,每个模块需要向数据库模块设置模块ID,用于打印、统计使用
  *       db_handle - 数据库句柄
  * Output:
  *       无
  * Return:
  *       DB_RET_PARAM_NULL - 入参指针为NULL
  *       DB_RET_ERR - 释放失败
  *       DB_RET_OK - 释放成功
  * Others:
  *       无
**********************************************************************************/
int disconnect_database (int module_id, void * db_handle);

/*********************************************************************************
  * Description:  
  *       创建数据库表
  * Input:  
  *       module_id - 模块ID,每个模块需要向数据库模块设置模块ID,用于打印、统计使用
  *       db_handle - 数据库句柄
  *       table_name - 创建的表名
  *       sql_str - 创建表的SQL语句
  * Output:
  *       无
  * Return:
  *       DB_RET_PARAM_NULL - 入参指针为NULL
  *       DB_RET_PARAM_NULL - 入参指针为NULL
  *       DB_RET_ERR - 释放失败
  *       DB_RET_OK - 释放成功
  * Others:
  *       无
**********************************************************************************/
int create_database_table(int module_id,  void * db_handle,  char * table_name,  char * sql_str);

/*********************************************************************************
  * Description:  
  *       对据库表执行插入、删除、更新操作
  * Input:  
  *       module_id - 模块ID,每个模块需要向数据库模块设置模块ID,用于打印、统计使用
  *       db_handle - 数据库句柄
  *       op_type - 操作类型 DB_OP_INSERT:插入数据 DB_OP_DEL:删除数据 DB_OP_UPDATE:更新数据
  *       table_name - 创建的表名
  *       sql_str - 创建表的SQL语句
  *       param_num - 扩展参数组合数量,填写0表示没有,需要防止SQL注入问题,需要使用扩展参数组合
  * Output:
  *       无
  * Return:
  *       DB_RET_PARAM_NULL - 入参指针为NULL
  *       DB_RET_ERR - 操作失败
  *       DB_RET_OK - 操作成功
  * Others:
  *       无
**********************************************************************************/
int update_database(int module_id,  void * db_handle,  int op_type,  char * table_name,  char * sql_str, int param_num, ...);

/*********************************************************************************
  * Description:  
  *       根据指定信息查找数据库
  * Input:  
  *       module_id - 模块ID,每个模块需要向数据库模块设置模块ID,用于打印、统计使用
  *       db_handle - 数据库句柄
  *       table_name - 创建的表名
  *       sql_str - 创建表的SQL语句
  *       begin_num - 从第几条查询结果开始返回
  *       need_num - 应用需要返回的结果条数
  *       param_num - 扩展参数组合数量,填写0表示没有,需要防止SQL注入问题,需要使用扩展参数组合
  * Output:
  *       return_num - 实际返回的结果条数
  * Return:
  *       NULL - 操作失败      
  *       非NULL - 返回CJSON格式的查询结果
  * Others:
  *       无
**********************************************************************************/
void * select_datebase_by_number(int module_id,  void * db_handle, char * table_name,  char * sql_str, int begin_num, int need_num, int *  return_num, int param_num, ...);
/*********************************************************************************
  * Description:  
  *       释放查询接口申请的内存
  * Input:  
  *       module_id - 模块ID,每个模块需要向数据库模块设置模块ID,用于打印、统计使用
  *       table_name - 创建的表名
  *       memory_ptr - 待释放内存指针
  * Output:
  *       无
  * Return:
  *       DB_RET_PARAM_NULL - 入参指针为NULL
  *       DB_RET_ERR - 操作失败
  *       DB_RET_OK - 操作成功
  * Others:
  *       无
**********************************************************************************/
int free_database_memory(int module_id,  char * table_name,  void * memory_ptr);
/*********************************************************************************
  * Description:  
  *       返回根据指定信息查找数据库的结果的条目数
  * Input:  
  *       module_id - 模块ID,每个模块需要向数据库模块设置模块ID,用于打印、统计使用
  *       db_handle - 数据库句柄
  *       table_name - 创建的表名
  *       sql_str - 创建表的SQL语句
  *       param_num - 扩展参数组合数量,填写0表示没有,需要防止SQL注入问题,需要使用扩展参数组合
  * Output:
  *       ret_num - 实际返回的结果条数
  * Return:
  *       DB_RET_PARAM_NULL - 入参指针为NULL
  *       DB_RET_ERR - 操作失败
  *       DB_RET_OK - 操作成功
  * Others:
  *       无
**********************************************************************************/
int  get_select_datebase_number(int module_id,  void * db_handle, char * table_name,  char * sql_str, int * ret_num, int param_num, ...);