/************************************************* Copyright (C), 1988-1999, Nari Tech. Co., Ltd. File name: sqlite_access_interface.h Author: LH Version: 1.0 Date: 2012.6.4 Description: 访问sqlite库封装接口 Function List: Datetime Action Author Modify ------------------------------------------------------------------- 2012.6.4 Creation LH *************************************************/ #ifndef SQLITE_ACCESS_H_ #define SQLITE_ACCESS_H_ #include "sqlite3.h" #include #include #include #include using namespace std; #define DB_SUCCESS 0 #define DB_FAIL -1 #define DB_NO_DATA 100 #define DB_AUTO_LOGOFF 0 #define DB_MANUAL_LOGOFF 1 #define DB_STATUS_CONNECT 0 #define DB_STATUS_DISCONNECT 1 #define GET_ALL_RESULT -1 #define LOGIN_DEFAULT_MODE 0 #define LOGIN_THREADED_MODE 1 //统一C数据类型 #define DB_DATATYPE_STRING 1 #define DB_DATATYPE_UCHAR 2 #define DB_DATATYPE_SHORT 3 #define DB_DATATYPE_INT 4 #define DB_DATATYPE_DATETIME 5 #define DB_DATATYPE_FLOAT 6 #define DB_DATATYPE_DOUBLE 7 #define DB_DATATYPE_KEYID 8 #define DB_DATATYPE_BINARY 9 #define DB_DATATYPE_TEXT 10 #define DB_DATATYPE_IMAGE 11 #define DB_DATATYPE_APPKEYID 12 #define DB_DATATYPE_APPID 13 #define DB_DATATYPE_LONG 15 #define MAX_COL_NUMBER 1024 #define MAX_LOB_NUMBER 1024 #define MAX_COLNAME_LENGTH 255 #define MAX_PROCNAME_LENGTH 255 #define MAX_SQL_LENGTH 10240 #define QUERY_RECORD_BUF 102400 // 记录集预分配内存100K #ifdef _ALPHA #define READ_BUFSIZE 204800 // #endif #ifdef _IBM #define READ_BUFSIZE 204800 // #endif #ifdef _SUN #define READ_BUFSIZE 102400 // #endif #ifdef _HPUX #define READ_BUFSIZE 204800 // #endif #ifdef _LINUX #define READ_BUFSIZE 204800 // #endif struct TResultHead { int field_num; int field_size; int data_num; int data_size; int record_length; int reach_max; }; struct TFieldInfo { short field_type; short field_length; }; struct TFieldAttr { char colName[64]; unsigned int colNameLen; unsigned short field_type; unsigned int field_len; unsigned char field_precision; signed char field_scale; TFieldAttr() { memset(this,0,sizeof(TFieldAttr)); } }; //LOB使用的ResultHead struct TLOBResultHead { int field_num; int field_size; int data_num; int data_size; vector record_length_vec; //如果data_num==0则record_length_vec不可用 int reach_max; }; //LOB使用的FieldInfo struct TLOBFieldInfo { short field_type; vector field_length_vec; //field_length_vec.size等于TLOBResultHead中的data_num //如果data_num == 0, 则field_length_vec.size = 1 }; //错误信息结构 struct TErrorMsg { int err_no; //DBAccess错误号 string dbaccess_err; //DBAccess错误信息 string db_err; //数据库错误信息 }; // Define the KeyID_Type's Description struct TKeyidType { int record_id; short column_id; }; struct TAppKeyidType { long key_id; int app_id; }; // Define the AppID_Type's Description struct TAppidType { int app_id; int record_id; }; // LOB内容结构 struct TLOBContent { unsigned char *lob_content; int lob_content_size; }; typedef map UserSpecTypeMap; class SqliteAccess { public: //构造函数auto_logoff == true 或无参数时,不需要显示调用Logoff,会在析构函数中调用 //反之,程序需要显示调用Logoff注销数据库登录,否则连接没有释放 SqliteAccess(bool auto_logoff = true); ~SqliteAccess(); private: void stripWhiteSpace(string &str); int PrintError(string &err_string); int PrepareOneSentence(sqlite3_stmt* &stmt, const char *query_string, vector &err_vec); int FreeOneStatement(sqlite3_stmt* &stmt, vector &err_vec); int ExecuteOneSelectSentence(sqlite3_stmt* &stmt, bool &is_no_record, vector &err_vec); int ExecuteOneModifySentence(sqlite3_stmt* &stmt, vector &err_vec); void GetSelectColNum(sqlite3_stmt* &stmt, int &num_cols); int GetSingleColInfo(sqlite3_stmt *stmt, int col_num, TFieldAttr &field_attr, string &column_decltype, string &field_precision, string &field_scale, string &field_len, vector &err_vec); TKeyidType* ConvertKeyidToStruct(char *keyid); TAppKeyidType* ConvertAppKeyidToStruct(char *keyid); TAppidType* ConvertAppidToStruct(char *keyid); int ConvertSQLDateToTimet(char* date_ptr,time_t *osdate); public: /*--------------------------------------------------------------------------------- - 功能描述: 数据库注册 - 输 入: server: 服务名 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int Login(char *server, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 数据库注销 - 输 入: 无 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int Logoff(vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 取SQL查询返回结果集(不包含LOB类型数据) - 输 入: query_string: SQL查询命令 max_result: 结果集最大行数,GET_ALL_RESULT表示取所有行 user_type_map: 用户指定返回数据类型,MAP类型 - 输 出: result_link: 结果集指针 result_indicator 是否为空指针 err_vec: 错误返回结构Vector result_link_length 结果集内存块长度 result_indicator_length 结果集内存块长度 - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryResult(char *query_string, int max_result, UserSpecTypeMap user_type_map, char *&result_link, signed short *&result_indicator, vector &err_vec, int &result_link_length, int &result_indicator_length ); /*--------------------------------------------------------------------------------- - 功能描述: 取结果集的HEAD,FIELD,DATA指针 - 输 入: result_link: 结果集指针 - 输 出: result_head_ptr: HEAD指针 field_info_ptr: FIELD指针 data_ptr: DATA指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryHead( char *result_link, TResultHead *&result_head_ptr, TFieldInfo *&field_info_ptr, char *&data_ptr, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 执行SQL命令,并提交 - 输 入: cmd_string: SQL命令 - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int ExecuteCommandWithCommit(char *cmd_string, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 执行包含LOB数据的INSERT命令,并提交 - 输 入: insert_string: INSERT(LOB)命令 select_string: 附加的SELECT FOR UPDATE(只需要写LOB域)命令 lob_vec: LOB域的Vector - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 - 说 明: 1、insert_string参数举例 【ORACLE】"insert into my_test_lob(id,clob_content,blob_content) values(1,empty_clob(),empty_blob())" 【SYBASE】"insert into my_test_lob(id,clob_content,blob_content) values(1,'','')" 如果需要在select语句中更新LOB域,注意不要在Insert语句中将LOB域置为空(NULL) 对于ORACLE使用empty_clob()、empty_blob()插入EMPTY 对于SYBASE使用''插入EMPTY 2、select_string参数举例 【ORACLE】"select clob_content,blob_content from my_test_lob where id = 1 for update" 【SYBASE】"select clob_content,blob_content from my_test_lob where id = 1" 注意:若where子句不对应insert语句中的主键,则更新结果不可预见 对于ORACLE “for update”关键词是必须的 3、lob_vec包含LOB实际数据,lob_vec.size()必须与select_string中LOB域的个数一致 ----------------------------------------------------------------------------------*/ int ExecuteInsertCommandWithLOB(const char *insert_string, const char *select_string, const vector &lob_vec, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 取SQL查询返回结果集(包含LOB类型数据) - 输 入: query_string: SQL查询命令 max_result: 结果集最大行数,GET_ALL_RESULT表示取所有行 user_type_map: 用户指定返回数据类型,MAP类型 注意LOB域无法指定数据类型 - 输 出: result_link: 结果集指针 result_indicator 是否为空指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 - 说 明: 1、由于SYBASE数据库要求检索的LOB域都必须放在BIND域(普通域)的后面 因此统一要求query_string中的所有LOB域都在普通域之后 ----------------------------------------------------------------------------------*/ int GetQueryResultWithLOB( const char *query_string, int max_result, UserSpecTypeMap user_type_map, char *&result_link, signed short *&result_indicator, TLOBResultHead *&result_head_ptr, TLOBFieldInfo *&field_info_ptr, vector &err_vec, int &result_link_length, int &result_indicator_length ); /*--------------------------------------------------------------------------------- - 功能描述: 取结果集的HEAD,FIELD,DATA指针(包含LOB类型数据) - 输 入: result_link: 结果集指针 - 输 出: result_head_ptr: HEAD指针,对应TLOBResultHead结构 field_info_ptr: FIELD指针,对应TLOBFieldInfo结构 data_ptr: DATA指针 err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 ----------------------------------------------------------------------------------*/ int GetQueryHeadWithLOB( char *result_link, TLOBResultHead *&result_head_ptr, TLOBFieldInfo *&field_info_ptr, char *&data_ptr, vector &err_vec); /*--------------------------------------------------------------------------------- - 功能描述: 执行包含LOB数据的UPDATE命令,并提交 - 输 入: update_string: UPDATE(LOB)命令 select_string: 附加的SELECT FOR UPDATE(只需要写LOB域)命令 lob_vec: LOB域的Vector - 输 出: err_vec: 错误返回结构Vector - 返 回: DB_SUCCESS: 成功 DB_FAIL: 失败 - 说 明: 1、update_string参数举例 【ORACLE】"update my_test_lob set blob_content = empty_blob() where id = 1" 【SYBASE】"update my_test_lob set blob_content = '' where id = 1" 如果需要在select语句中更新LOB域,注意不要在Update语句中将LOB域置为空(NULL) 对于ORACLE使用empty_clob()、empty_blob()插入EMPTY 对于SYBASE使用''插入EMPTY 2、select_string参数举例 【ORACLE】"select clob_content,blob_content from my_test_lob where id = 1 for update" 【SYBASE】"select clob_content,blob_content from my_test_lob where id = 1" 注意:若where子句不对应update语句中的主键,则更新结果不可预见 2、lob_vec包含LOB实际数据,lob_vec.size()必须与select_string中LOB域的个数一致 ----------------------------------------------------------------------------------*/ int ExecuteUpdateCommandWithLOB( const char *update_string, const char *select_string, const vector &lob_vec, vector &err_vec ); private: sqlite3 *m_db_handle; private: int m_Status; int m_LoginMode; int m_LogoffFlag; }; #endif /* SQLITE_ACCESS_INTERFACE_H_ */