/**********************************************************************
*
* FileName: CSqlite.cpp
* Description: 封装SQLite 的使用类, 当前使用的SQLite 版本是3.4.0
* Function: 运行SQLite 的继承类
* CreateTime: 2007.7.5
* Author: yinyong
* History:
*
**********************************************************************/
#include "CSqlite.h"
static const int BUSYTIMEOUTMS = 60000; //默认超时毫秒数
static const int SLEEPTIME = 100000; //默认休息暂停时间
static const int LIMITNUM = 200; //当SQLite忙时,执行SQL语句的最大尝试次数
static const char * STRSYNCHRONOUS_ON = "PRAGMA SYNCHRONOUS = ON";
static const char * STRSYNCHRONOUS_OFF = "PRAGMA SYNCHRONOUS = OFF";
//static const char * STRPAGESIZE = "PRAGMA PAGE_SIZE = 8192";
static const char * STRCACHESIZE = "PRAGMA CACHE_SIZE = 8000";
//static const char * STRDEFAULTCACHESIZE = "PRAGMA DEFAULT_CACHE_SIZE = 8000";
const char * STRBEGINTRANS = "BEGIN TRANSACTION";
const char * STRCOMMITTRANS = "COMMIT TRANSACTION";
const char * STRROLLBACK = "ROLLBACK TRANSACTION";
/*********** CSQLite 类***********************************/
/* 构造与析构函数 */
/**********************************************************/
CSQLite::CSQLite( void )
: m_pDb(NULL)
, m_pStmt(NULL)
, m_nState(-1)
, m_nTimeoutMs(BUSYTIMEOUTMS)
, m_nCurFieldNum(0)
, m_nLimitNum( LIMITNUM )
, m_bIsOpen( false )
{
}
/**********************************************************/
CSQLite::~CSQLite( void )
{
if (NULL != m_pStmt)
{
sqlite3_finalize(m_pStmt);
m_pStmt = NULL;
}
Close();
}
/**********************************************************
* Function: Open DB
* Input: inDbName 数据库的名称
(也就是保存数据库文件的绝对路径或者当前路径)
inSynFlag 是否打开同步标志
* Output:
* Return: true Success, false Failed
**********************************************************/
bool CSQLite::Open( const char * inDbName , bool inSynFlag )
{
//数据库名检查
if ( NULL == inDbName )
{
m_strErrInfo = "数据库文件名为空";
return false;
}
//打开数据库
m_strFileName = inDbName;
m_nState = sqlite3_open(inDbName, &m_pDb);
if ( SQLITE_OK != m_nState )
{
m_strErrInfo = sqlite3_errmsg(m_pDb);
return false;
}
//设置超时
SetBusyTimeout( m_nTimeoutMs );
//打开同步开关标志
const char * pTmp = NULL;
if ( inSynFlag )
{
pTmp = STRSYNCHRONOUS_ON;
}
else
{
pTmp = STRSYNCHRONOUS_OFF;
}
ExecDML ( pTmp );
if ( SQLITE_OK != m_nState )
{
m_strErrInfo = sqlite3_errmsg(m_pDb);
m_strErrInfo.append(" . So database had been closed .");
Close();
return false;
}
//设置最大缓存
ExecDML ( STRCACHESIZE );
if ( SQLITE_OK != m_nState )
{
m_strErrInfo = sqlite3_errmsg(m_pDb);
m_strErrInfo.append(" . So database had been closed .");
Close();
return false;
}
m_bIsOpen = true;
return true;
}
/**********************************************************
* Function: 重新打开SQLite
* Input: inSynFlag 是否打开同步标志
* Output:
* Return: true Success, false Failed
**********************************************************/
bool CSQLite::Reopen( bool inSynFlag )
{
Close();
return Open( m_strFileName.c_str(), inSynFlag );
}
/**********************************************************
* Function: Close DB
* Input:
* Output:
* Return:
**********************************************************/
void CSQLite::Close( void )
{
if ( NULL != m_pDb)
{
m_nState = sqlite3_close( m_pDb );
m_pDb = NULL;
}
m_bIsOpen = false;
}
/**********************************************************
* Function: Set busy timeout
* Input: inMS , 超时的毫秒数
* Output:
* Return: ErrorCode
**********************************************************/
int CSQLite::SetBusyTimeout( unsigned int inMS )
{
m_nTimeoutMs = inMS;
m_nState = sqlite3_busy_timeout( m_pDb, m_nTimeoutMs );
if ( SQLITE_OK != m_nState )
{
m_strErrInfo = sqlite3_errmsg(m_pDb);
}
return m_nState;
}
/* -2- **** Execute SQL information ****/
//Execute SQL DML sentence
/**********************************************************
* Function: 执行DML SQL语句
* Input: inSql SQL语句
* Output:
* Return: ErrorCode
**********************************************************/
int CSQLite::ExecDML( const char * inSql )
{
if (NULL == inSql)
{
m_strErrInfo = "The inputed SQL sentence is empty .";
return DEF_INPUTISNULL;
}
for( unsigned int m = 0; m < m_nLimitNum; m++ )
{
m_nState = sqlite3_exec( m_pDb, inSql, NULL, NULL, NULL );
if ( SQLITE_OK == m_nState )
{
break;
}
else if ( SQLITE_BUSY == m_nState )
{
if ( m_nLimitNum == m+1 )
{
m_strErrInfo = sqlite3_errmsg( m_pDb );
break;
}
sqlite3_busy_handler( m_pDb, NULL,NULL );
Sleep( SLEEPTIME );
continue;
}
else
{
m_strErrInfo = sqlite3_errmsg( m_pDb );
break;
}
}
return m_nState;
}
/**********************************************************
* Function: Execute transaction
* Input: inTransaction 输入的事务
* Output:
* Return: ErrorCode
**********************************************************/
int CSQLite::ExecDML(const vector<string> &inTransaction)
{
unsigned int nStrNum = (unsigned int)inTransaction.size();
if ( 0 == nStrNum )
{
return SQLITE_OK;
}
//以下是事务执行,事务必须成功或者回滚
for( unsigned int m = 0; m < m_nLimitNum; m++ )
{
m_nState = sqlite3_exec( m_pDb, STRBEGINTRANS, NULL, NULL, NULL );
if ( SQLITE_OK == m_nState )
{
break;
}
else if ( SQLITE_BUSY == m_nState )
{
if ( m_nLimitNum == m+1 )
{
m_strErrInfo = sqlite3_errmsg( m_pDb );
return m_nState;
}
//等待指定时间间隔继续执行
sqlite3_busy_handler( m_pDb, NULL,NULL );
Sleep( SLEEPTIME );
}
else
{
m_strErrInfo = sqlite3_errmsg(m_pDb);
return m_nState;
}
}
//执行相关SQL语句
for ( unsigned int i = 0; i < nStrNum; i++ )
{
for( unsigned int m = 0; m < m_nLimitNum; m++ )
{
m_nState = sqlite3_exec( m_pDb, inTransaction[i].c_str(), NULL, NULL, NULL );
if ( SQLITE_OK == m_nState )
{
break;
}
else if( SQLITE_BUSY == m_nState )
{
if ( m_nLimitNum == m+1 )
{
m_strErrInfo = sqlite3_errmsg( m_pDb );
sqlite3_exec( m_pDb, STRROLLBACK, NULL, NULL, NULL );
return m_nState;
}
//等待指定时间间隔继续执行
sqlite3_busy_handler( m_pDb, NULL,NULL );
Sleep( SLEEPTIME );
}
else
{
m_strErrInfo = sqlite3_errmsg( m_pDb );
sqlite3_exec( m_pDb, STRROLLBACK, NULL, NULL, NULL );
return m_nState;
}
}
}
//提交事务
for( unsigned int m = 0; m < m_nLimitNum; m++ )
{
m_nState = sqlite3_exec( m_pDb, STRCOMMITTRANS, NULL, NULL, NULL );
if ( SQLITE_OK == m_nState )
{
break;
}
else if( SQLITE_BUSY == m_nState )
- 1
- 2
- 3
前往页