acl/lib_acl_cpp/include/acl_cpp/db/db_sqlite.hpp
2017-03-25 23:05:44 +08:00

160 lines
3.9 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.

#pragma once
#include "acl_cpp/acl_cpp_define.hpp"
#include "acl_cpp/stdlib/string.hpp"
#include "acl_cpp/db/db_handle.hpp"
typedef struct sqlite3 sqlite3;
namespace acl {
class charset_conv;
class ACL_CPP_API db_sqlite : public db_handle
{
public:
/**
* 构造函数
* @param charset {const char*} 本地字符集(gbk, utf-8, ...)
*/
db_sqlite(const char* dbfile, const char* charset = "utf-8");
~db_sqlite(void);
/**
* 返回当前的 sqlite 的版本信息
*/
const char* version(void) const;
/**
* 当数据库打开后通过此函数对数据库的操作引擎进行配置,
* 进行配置的内容需要严格遵循 sqlite 本身的配置选项要求
* @param pragma {const char*} 配置选项内容,格式为:
* PRAGMA xxx=xxx
* 如PRAGMA synchronous = NORMAL
* @return {bool} 配置数据库是否成功
*/
bool set_conf(const char* pragma);
/**
* 当数据库打开调用此函数获得数据引擎的配置选项
* @param pragma {const char*} 配置选项内容,格式为:
* PRAGMA xxx
* 如PRAGMA synchronous
* @param out {string&} 如果返回值非空则存储结果
* @return {const char*} 为空则说明该配置不存在或数据库未打开
*/
const char* get_conf(const char* pragma, string& out);
/**
* 在数据库打开的情况下输入数据库引擎的配置选项
* @param pragma {const char*} 指定的配置选项,如果该参数为空,
* 则输出所有的配置选项格式为PRAGMA xxxPRAGMA synchronous
*/
void show_conf(const char* pragma = NULL);
/**
* 自数据库打开后所有的影响的记录行数
* @return {int} 影响的行数,-1 表示出错
*/
int affect_total_count() const;
/**
* 直接获得 sqlite 的句柄,如果返回 NULL 则表示 sqlite 还没有打开
* 或出错时内部自动关闭了 sqlite
* @return {sqlite3*}
*/
sqlite3* get_conn() const
{
return db_;
}
/********************************************************************/
/* 以下为基类 db_handle 的虚接口 */
/********************************************************************/
/**
* 返回数据库的类型描述
* @return {const char*}
*/
const char* dbtype() const;
/**
* 获得上次数据库操作的出错错误号
* @return {int}
*/
int get_errno() const;
/**
* 获得上次数据库操作的出错错描述
* @return {const char*}
*/
const char* get_error() const;
/**
* 基类 db_handle 的纯虚接口
* @param charset {const char*} 打开数据库连接时采用的字符集,当该
* 参数非空时将会覆盖构造函数中传入的字符集
* @return {bool} 打开是否成功
*/
bool dbopen(const char* charset = NULL);
/**
* 基类 db_handle 的纯虚接口,数据库是否已经打开了
* @return {bool} 返回 true 表明数据库已经打开了
*/
bool is_opened() const;
/**
* 基类 db_handle 的纯虚接口
* @return {bool} 关闭是否成功
*/
bool close(void);
/**
* 基类 db_handle 的纯虚接口,子类必须实现此接口用于判断数据表是否存在
* @return {bool} 是否存在
*/
bool tbl_exists(const char* tbl_name);
/**
* 基类 db_handle 的纯虚接口
* @param sql {const char*} 标准的 SELECT SQL 语句,并且一定得要
* 注意该 SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @param result {db_rows*} 如果非空,则将查询结果填充进该结果对象中,
* 否则,会引用 db_handle 内部的一个临时存储对象
* @return {bool} 执行是否成功
*/
bool sql_select(const char* sql, db_rows* result = NULL);
/**
* 基类 db_handle 的纯虚接口
* @param sql {const char*} 标准的 INSERT/UPDATE/DELETE SQL 语句,
* 并且一定得要注意该 SQL 语句必须经过转义处理,以防止 SQL 注入攻击
* @return {bool} 执行是否成功
*/
bool sql_update(const char* sql);
/**
* 基类 db_handle 的纯虚接口:上次 sql 操作影响的记录行数
* @return {int} 影响的行数,-1 表示出错
*/
int affect_count() const;
private:
// sqlite 引擎
sqlite3* db_;
// 数据存储文件
string dbfile_;
// 字符集转码器
charset_conv* conv_;
// 本地字符集
string charset_;
// 真正执行SQL查询的函数
bool exec_sql(const char* sql, db_rows* result = NULL);
};
} // namespace acl