Files
envi-code/SourceCode/Code2026/sqliteserver/UIIImpSQLiteServer.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

1777 lines
39 KiB
C++

#include "StdAfx.h"
#include "UIIImpSQLiteServer.h"
#include "sqlite3.h"
#include "zlib.h"
extern HINSTANCE _hdllInstance;
CUIIImpSQLiteServer::CUIIImpSQLiteServer(void)
{
m_pSQLiteDb = NULL;
}
CUIIImpSQLiteServer::~CUIIImpSQLiteServer(void)
{
if (m_pSQLiteDb != NULL)
{
sqlite3_close((sqlite3 *)m_pSQLiteDb);
}
}
// 将ansi字符串转换成UNICODE
static LPWSTR MultiByteToUnicode(char* szText)
{
int nLength,nLen;
wchar_t *pBuffer;
nLen = (int)strlen(szText);
nLength = MultiByteToWideChar(CP_ACP, 0, szText, nLen, NULL, 0);
pBuffer = new wchar_t[nLength+1];
MultiByteToWideChar(CP_ACP, 0, szText, nLen, (LPWSTR)pBuffer, nLength);
pBuffer[nLength] = 0;
return pBuffer;
}
// 将UNICODE字符串转换成UTF8
static LPSTR UnicodeToUTF8(LPWSTR szText)
{
char *pBuffer;
int nLength;
int nLen;
nLen = (int)wcslen(szText);
// 获取转换后的字符串长度
nLength = WideCharToMultiByte(CP_UTF8, 0, szText, nLen, NULL, 0, 0, 0);
int rc = GetLastError();
pBuffer = new char[nLength + 1];
// 进行字符转换
WideCharToMultiByte(CP_UTF8, 0, szText, nLen, pBuffer, nLength, 0, 0);
pBuffer[nLength] = 0;
return pBuffer;
}
BOOL CUIIImpSQLiteServer::InitADOServer(LPCTSTR pszDbFileName)
{
if (m_pSQLiteDb != NULL)
{
sqlite3_close((sqlite3 *)m_pSQLiteDb);
m_pSQLiteDb = NULL;
}
_bstr_t bst(pszDbFileName);
char* pszcDbFileName = (char*)bst;
WCHAR * pWideFile = MultiByteToUnicode(pszcDbFileName);
char * pUTF8File = UnicodeToUTF8(pWideFile);
int nRes = sqlite3_open(pUTF8File,(sqlite3 **)&m_pSQLiteDb);
if (nRes != SQLITE_OK)
{
//error can not open database!!!
if (pWideFile != NULL) delete pWideFile;
if (pUTF8File != NULL) delete pUTF8File;
return FALSE;
}
if (pWideFile != NULL) delete pWideFile;
if (pUTF8File != NULL) delete pUTF8File;
return TRUE;
}
BOOL CUIIImpSQLiteServer::InitSQLServer(LPCTSTR pszConnection)
{
return FALSE;
}
BOOL CUIIImpSQLiteServer::CreateDBTable(LPCTSTR pszTableName,Ttable& arFields)
{
if (m_pSQLiteDb != NULL)
{
if (IsDbTableExist(pszTableName))
{
return FALSE;
}
CString strSQL,sTemp;
int i;
int nSize = (int)arFields.GetSize();
CUIITableField fieldInfo;
CString keyStr = _T(""),sFormat;
strSQL.Format(_T("CREATE TABLE %s ("),pszTableName);
for( i = 0; i< nSize; i++ )
{
fieldInfo = arFields.GetAt(i);
if( fieldInfo.m_sFieldType == _T("nvarchar") ||
fieldInfo.m_sFieldType == _T("varchar"))
{
sFormat = _T("[%s] %s (%d) ");
if(!fieldInfo.m_bPrimaryKey)
{
if( fieldInfo.m_bIsAllowNull)
{
sFormat += _T("NULL,");
}
else
{
sFormat += _T("NOT NULL,");
}
}
else
{
sFormat += _T("PRIMARY KEY,");
}
sTemp.Format(sFormat, fieldInfo.m_sFieldName,fieldInfo.m_sFieldType, fieldInfo.m_nSize);
}
else if(fieldInfo.m_sFieldType.CompareNoCase(_T("int")) == 0 ||
fieldInfo.m_sFieldType.CompareNoCase(_T("smallint")) == 0)
{
sFormat = _T("[%s] int ");
if(!fieldInfo.m_bPrimaryKey)
{
if( fieldInfo.m_bIsAllowNull)
{
sFormat += _T("NULL,");
}
else
{
sFormat += _T("NOT NULL,");
}
}
else
{
sFormat += _T("PRIMARY KEY,");
}
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
else if( fieldInfo.m_sFieldType == _T("float") )
{
sFormat = _T("[%s] float ");
if(!fieldInfo.m_bPrimaryKey)
{
if( fieldInfo.m_bIsAllowNull)
{
sFormat += _T("NULL,");
}
else
{
sFormat += _T("NOT NULL,");
}
}
else
{
sFormat += _T("PRIMARY KEY,");
}
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
else if(fieldInfo.m_sFieldType == _T("image"))
{
sFormat = _T("[%s] image NULL,");
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
else if(fieldInfo.m_sFieldType == _T("datetime"))
{
sFormat = _T("[%s] datetime DEFAULT GETDATE(),");
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
else if(fieldInfo.m_sFieldType == _T("text") ||
fieldInfo.m_sFieldType == _T("ntext"))
{
sFormat = _T("[%s] %s NULL,");
sTemp.Format(sFormat, fieldInfo.m_sFieldName,fieldInfo.m_sFieldType);
}
else if(fieldInfo.m_sFieldType == _T("real"))
{
sFormat = _T("[%s] real ");
if(!fieldInfo.m_bPrimaryKey)
{
if( fieldInfo.m_bIsAllowNull)
{
sFormat += _T("NULL,");
}
else
{
sFormat += _T("NOT NULL,");
}
}
else
{
sFormat += _T("PRIMARY KEY,");
}
sTemp.Format(sFormat, fieldInfo.m_sFieldName);
}
if(sTemp.GetLength() > 0)
{
strSQL += sTemp;
}
sTemp = _T("");
}
int nlen = strSQL.GetLength();
if(nlen > 0)
{
strSQL.SetAt(nlen - 1, _T(')'));
}
else
{
return FALSE;
}
try
{
ExecuteSQL(strSQL);
}
catch(...)
{
return FALSE;
}
return TRUE;
}
return FALSE;
}
BOOL CUIIImpSQLiteServer::IsDbTableExist(LPCTSTR pszTableName)
{
CString sSQL;
sSQL.Format(_T("select count(*) from sqlite_master where type='table' and name='%s'"),pszTableName);
_bstr_t bst(sSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL && nRow == 0)//说明没有
{
if (pazResult != NULL)
sqlite3_free_table(pazResult);
return FALSE;
}
if (pazResult != NULL)
sqlite3_free_table(pazResult);
return TRUE;
}
static int ParaseString(LPCTSTR pszText,CStringArray& arFields,TCHAR ch = _T(','))
{
CString sTemp,sText;
sText = pszText;
for (int i = 0;i < sText.GetLength();i++)
{
if (sText.GetAt(i) == ch )
{
arFields.Add(sTemp);
sTemp = _T("");
}
else
{
sTemp += sText.GetAt(i);
if (i == sText.GetLength() - 1)
{
arFields.Add(sTemp);
}
}
}
return (int)arFields.GetSize();
}
BOOL CUIIImpSQLiteServer::GetTableStru(LPCTSTR pszTableName,Ttable& arFields,BOOL bTypeAsSQLite)
{
CString sSQL;
sSQL.Format(_T("select * from sqlite_master where type = 'table' and name='%s'"),pszTableName);
_bstr_t bst(sSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL && nRow == 0)//说明没有
{
if (pazResult != NULL)
sqlite3_free_table(pazResult);
return FALSE;
}
//CREATE TABLE tblFloor (ID INTEGER PRIMARY KEY ASC,No_ INTEGER,Name TEXT,StdFlrID INTEGER REFERENCES tblStdFlr(ID) ON UPDATE CASCADE ON DELETE CASCADE ,LevelB REAL,Height REAL)
//1行,n列
CString sValue,sName,sType;
int j = 0,nPos1 = 0,nPos2 = 0;
CUIITableField field;
//for (int j = 0;j < nRow;j++)
{
for (int i = 0;i < nCol;i++)
{
/* offset to access column C of row R of **result */
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
if (nRow > 0 )
{
int nOffset = ((j + 1) * nCol) + i;
sValue = pazResult[nOffset];
sValue.MakeLower();
if (sValue.Find(_T("create table")) != -1)
{
int nPos1 = sValue.Find(_T('(') );
if (nPos1 != -1)
{
//()
sSQL = sValue.Mid(nPos1);
sSQL.TrimLeft(_T('('));
sSQL.TrimRight(_T(')'));
CStringArray arSegs;
ParaseString(sSQL,arSegs,_T(','));
for (int n = 0;n < arSegs.GetSize();n++)
{
sValue = arSegs.GetAt(n);
sValue.TrimRight();
sValue.TrimLeft();
//ID INTEGER PRIMARY KEY ASC
nPos1 = sValue.Find(_T(' '));
nPos2 = sValue.Find(_T(' '),nPos1 + 2);
if (nPos1 != -1)
{
sName = sValue.Mid(0,nPos1);
if (nPos2 == -1)
{
sType = sValue.Mid(nPos1 + 1);
}
else
{
sType = sValue.Mid(nPos1 + 1,nPos2 - nPos1 - 1);
}
field.m_bPrimaryKey = FALSE;
if ( sValue.Find(_T("primary")) != -1)
{
field.m_bPrimaryKey = TRUE;
}
sName.TrimLeft(_T('['));
sName.TrimRight(_T(']'));
field.m_sFieldName = sName;
field.m_nSize = 256;
field.m_sFieldType = sType;
field.m_bIsAllowNull = TRUE;
sType.MakeLower();
if (sType.CompareNoCase(_T("text")) == 0 ||
sType.CompareNoCase(_T("varchar")) == 0)
{
field.m_sFieldType = _T("varchar");
if (bTypeAsSQLite)
{
field.m_sFieldType = _T("TEXT");
}
}
else if (sType.CompareNoCase(_T("nvarchar")) == 0)
{
field.m_sFieldType = _T("nvarchar");
}
else if(sType.CompareNoCase(_T("integer")) == 0 ||
sType.CompareNoCase(_T("BOOLEAN")) == 0 ||
sType.CompareNoCase(_T("int")) == 0 )
{
field.m_sFieldType = _T("int");
if (bTypeAsSQLite)
{
field.m_sFieldType = _T("INTEGER");
}
}
else if(sType.CompareNoCase(_T("real")) == 0 ||
sType.CompareNoCase(_T("double")) == 0 ||
sType.CompareNoCase(_T("float")) == 0)
{
field.m_sFieldType = _T("double");
if (bTypeAsSQLite)
{
field.m_sFieldType = _T("REAL");
}
}
else if(sType.CompareNoCase(_T("blob")) == 0)
{
field.m_sFieldType = _T("image");
if (bTypeAsSQLite)
{
field.m_sFieldType = _T("blob");
}
}
else if(sType.CompareNoCase(_T("ntext")) == 0)
{
field.m_sFieldType = _T("varchar");
}
else if(sType.CompareNoCase(_T("binary")) == 0)
{
//field.m_sFieldType = _T("binary");
field.m_sFieldType = _T("image");
if (bTypeAsSQLite)
{
field.m_sFieldType = _T("blob");
}
}
else if(sType.CompareNoCase(_T("char")) == 0)
{
field.m_sFieldType = _T("char");
}
else//其他默认为字符串类型
{
field.m_sFieldType = _T("varchar");
if (bTypeAsSQLite)
{
field.m_sFieldType = _T("TEXT");
}
}
arFields.Add(field);
}
}
}
break;
}
}
}
}
if (pazResult != NULL)
sqlite3_free_table(pazResult);
return arFields.GetSize() == 0 ? FALSE : TRUE;
}
BOOL CUIIImpSQLiteServer::GetTableStru(LPCTSTR pszTableName,CStringList& listField)
{
CString sSQL;//大小写敏感???
sSQL.Format(_T("select * from sqlite_master where type = 'table' and name='%s'"),pszTableName);
_bstr_t bst(sSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL && nRow == 0)//说明没有
{
if (pazResult != NULL)
sqlite3_free_table(pazResult);
return FALSE;
}
//CREATE TABLE tblFloor (ID INTEGER PRIMARY KEY ASC,No_ INTEGER,Name TEXT,StdFlrID INTEGER REFERENCES tblStdFlr(ID) ON UPDATE CASCADE ON DELETE CASCADE ,LevelB REAL,Height REAL)
//1行,n列
CString sValue,sName,sType;
int j = 0,nPos1 = 0,nPos2 = 0;
CUIITableField field;
//for (int j = 0;j < nRow;j++)
{
for (int i = 0;i < nCol;i++)
{
/* offset to access column C of row R of **result */
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
if (nRow > 0 )
{
int nOffset = ((j + 1) * nCol) + i;
sValue = pazResult[nOffset];
sValue.MakeLower();
if (sValue.Find(_T("create table")) != -1)
{
int nPos1 = sValue.Find(_T('(') );
if (nPos1 != -1)
{
//()
sSQL = sValue.Mid(nPos1);
sSQL.TrimLeft(_T('('));
sSQL.TrimRight(_T(')'));
CStringArray arSegs;
ParaseString(sSQL,arSegs,_T(','));
for (int n = 0;n < arSegs.GetSize();n++)
{
sValue = arSegs.GetAt(n);
sValue.TrimRight();
sValue.TrimLeft();
//ID INTEGER PRIMARY KEY ASC
nPos1 = sValue.Find(_T(' '));
nPos2 = sValue.Find(_T(' '),nPos1 + 2);
if (nPos1 != -1)
{
sName = sValue.Mid(0,nPos1);
sName.TrimLeft(_T('['));
sName.TrimRight(_T(']'));
listField.AddTail(sName);
}
}
}
break;
}
}
}
}
if (pazResult != NULL)
sqlite3_free_table(pazResult);
return listField.GetCount() > 0 ? TRUE : FALSE;
}
BOOL CUIIImpSQLiteServer::DeleteTable(LPCTSTR pszTableName)
{
if (m_pSQLiteDb != NULL)
{
CString strSQL;
strSQL.Format(_T("DROP TABLE [%s]"),pszTableName);
ExecuteSQL(strSQL);
return TRUE;
}
return FALSE;
}
BOOL CUIIImpSQLiteServer::DeleteTable(CStringArray& arTableNames)
{
for (int i = 0;i < arTableNames.GetSize();i++)
{
DeleteTable(arTableNames.GetAt(i));
}
return TRUE;
}
BOOL CUIIImpSQLiteServer::DeleteTableFields(LPCTSTR pszTableName,CStringArray& arFields)
{
BOOL bSuccess = FALSE;
for (int i = 0;i < arFields.GetSize();i++)
{
bSuccess = DeleteTableFields(pszTableName,arFields.GetAt(i));
}
return bSuccess;
}
BOOL CUIIImpSQLiteServer::DeleteTableFields(LPCTSTR pszTableName,LPCTSTR pszFields)
{
return FALSE;
/* sqlite 不支持直接删除表中字段
if (pszTableName == NULL || pszFields == NULL )
return FALSE;
CString strSQL;
strSQL.Format(_T("ALTER TABLE [%s] DROP COLUMN [%s]"),pszTableName,pszFields);
ExecuteSQL(strSQL);
return FALSE;*/
}
BOOL CUIIImpSQLiteServer::AppendTableFields(LPCTSTR pszTableName,Ttable& arFields)
{
if (pszTableName == NULL) return FALSE;
int nSize = (int)arFields.GetSize();
int i,bSuccess = 0;
for(i = 0;i<nSize;i++)
{
bSuccess = AppendTableFields(pszTableName,arFields.GetAt(i));
}
return bSuccess;
}
BOOL CUIIImpSQLiteServer::AppendTableFields(LPCTSTR pszTableName, CUIITableField& arFields)
{
if (pszTableName == NULL) return FALSE;
CString strSQL,sFieldType;
sFieldType = arFields.m_sFieldType;
if( sFieldType.CompareNoCase(_T("varchar")) == 0 ||
sFieldType.CompareNoCase(_T("nvarchar")) == 0)
{
strSQL.Format(_T("ALTER TABLE [%s] ADD [%s] %s(%d)"),pszTableName,arFields.m_sFieldName,
arFields.m_sFieldType,arFields.m_nSize);
}
else
{
strSQL.Format(_T("ALTER TABLE [%s] ADD [%s] %s"),pszTableName,arFields.m_sFieldName,
arFields.m_sFieldType);
}
return ExecuteSQL(strSQL);
}
static int CallbackGetSelData1(void *data, int nColcount, char **pColVals, char **pColNames)
{
CString* pVal = (CString *)data;
if (nColcount > 0)
{
if (pVal->IsEmpty())
*pVal = pColVals[0];
}
return 0;
}
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CString& sValue)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char *psSQL = (char *)bst;
sValue.Empty();
CString *pValue = &sValue;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData1, (void *)pValue, NULL);
if (nRc != SQLITE_OK)
{
return FALSE;
}
return TRUE;
/*OLD
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL)
{
// offset to access column C of row R of **result
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
if (nRow > 0 )
{
int nOffset = ((0 + 1) * nCol) + 0;
sValue = pazResult[nOffset];
sqlite3_free_table(pazResult);
return TRUE;
}
}
return FALSE;*/
}
static int CallbackGetSelData2(void *data, int nColcount, char **pColVals, char **pColNames)
{
CStringArray *pArVal = (CStringArray *)data;
for (int i = 0;i < nColcount;i++)
{
pArVal->Add(pColVals[i]);
}
return 0;
}
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CStringArray& arStrValue)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char *psSQL = (char *)bst;
CStringArray *pArValue = &arStrValue;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData2, (void *)pArValue, NULL);
if (nRc != SQLITE_OK)
{
return FALSE;
}
return TRUE;
/*OLD
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL)
{
if (nRow > 0)
{
//offset to access column C of row R of **result
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue;
int nOffset = 0;
for (int i = 0;i < nRow;i++)
{
for (int j = 0;j < nCol;j++)
{
nOffset = ((i + 1) * nCol) + j;
sValue = pazResult[nOffset];
arStrValue.Add(sValue);
}
}
sqlite3_free_table(pazResult);
return (int)arStrValue.GetSize();
}
}
return FALSE;
*/
}
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CStringArray& arStrValue,int nFr, int nTo)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char *psSQL = (char *)bst;
CStringArray arVals;
CStringArray *pArValue = &arVals;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData2, (void *)pArValue, NULL);
if (nRc != SQLITE_OK)
{
return FALSE;
}
if (nFr < arVals.GetSize() && nFr > -1 && nTo < arVals.GetSize() && nTo > -1)
{
for (int i = nFr;i <= nTo;i++)
{
arStrValue.Add(arVals.GetAt(i));
}
}
return arStrValue.GetSize();
/*OLD
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL)
{
//offset to access column C of row R of **result
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue;
int nOffset = 0;
for (int i = nFr;i < nRow && i <= nTo;i++)
{
//if (i >= nFr && i <= nTo)
//{
for (int j = 0;j < nCol;j++)
{
nOffset = ((i + 1) * nCol) + j;
sValue = pazResult[nOffset];
arStrValue.Add(sValue);
}
//}
}
sqlite3_free_table(pazResult);
return (int)arStrValue.GetSize();
}
return FALSE;*/
}
static int CallbackGetSelData3(void *data, int nColcount, char **pColVals, char **pColNames)
{
std::vector<CString> *pArVal = (std::vector<CString> *)data;
for (int i = 0; i < nColcount; i++)
{
pArVal->push_back(pColVals[i]);
}
return 0;
}
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL, std::vector<CString>& arStrValue)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char *psSQL = (char *)bst;
std::vector<CString> *pArValue = &arStrValue;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData3, (void *)pArValue, NULL);
if (nRc != SQLITE_OK)
{
return FALSE;
}
return arStrValue.size();
/*OLD
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0, nCol = 0;
sqlite3_get_table((sqlite3*)m_pSQLiteDb, psSQL, &pazResult, &nRow, &nCol, 0);
if (pazResult != NULL)
{
if (nRow > 0)
{
//offset to access column C of row R of **result//
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue;
int nOffset = 0;
for (int i = 0; i < nRow; i++)
{
for (int j = 0; j < nCol; j++)
{
nOffset = ((i + 1) * nCol) + j;
sValue = pazResult[nOffset];
arStrValue.push_back(sValue);
}
}
sqlite3_free_table(pazResult);
return (int)arStrValue.size();
}
}
return FALSE;
*/
}
BOOL CUIIImpSQLiteServer::IsSelEmpty(LPCTSTR pszStrSQL)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL && nRow > 0) //第0行为列名
{
sqlite3_free_table(pazResult);
return FALSE;
}
if (pazResult != NULL)
sqlite3_free_table(pazResult);
return TRUE;
}
typedef struct listStrValbMakeLower
{
CStringList *plistStrValue;
BOOL bMakeLower;
}LISTSTRVALBMAKELOWER;
static int CallbackGetSelData4(void *data, int nColcount, char **pColVals, char **pColNames)
{
listStrValbMakeLower* pLstMk = (listStrValbMakeLower *)data;
CString sVal;
for (int i = 0; i < nColcount; i++)
{
sVal = pColVals[i];
if (pLstMk->bMakeLower)
sVal.MakeLower();
pLstMk->plistStrValue->AddTail(sVal);
}
return 0;
}
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CStringList& listStrValue,BOOL bMakeLower)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char *psSQL = (char *)bst;
listStrValbMakeLower lstMk;
lstMk.plistStrValue = &listStrValue;
lstMk.bMakeLower = bMakeLower;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData4, (void *)&lstMk, NULL);
if (nRc != SQLITE_OK)
{
return FALSE;
}
return listStrValue.GetCount();
/*OLD
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL)
{
//offset to access column C of row R of **result/
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue;
int nOffset = 0;
for (int i = 0;i < nRow;i++)
{
for (int j = 0;j < nCol;j++)
{
nOffset = ((i + 1) * nCol) + j;
sValue = pazResult[nOffset];
if (bMakeLower) sValue.MakeLower();
listStrValue.AddTail(sValue);
}
}
sqlite3_free_table(pazResult);
return (int)listStrValue.GetCount();
}
return FALSE;
*/
}
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CStringList& listStrValue, int nFr, int nTo, BOOL bMakeLower)
{
CStringArray arStrValue;
GetSelData(pszStrSQL, arStrValue, nFr, nTo);
if (nFr > -1 && nTo > -1 && nTo < arStrValue.GetSize())
{
CString sVal;
for (int i = nFr; i <= nTo; i++)
{
sVal = arStrValue.GetAt(i);
listStrValue.AddTail(bMakeLower ? sVal.MakeLower() : sVal);
}
}
return listStrValue.GetCount();
/*OLD
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL)
{
// offset to access column C of row R of **result
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue;
int nOffset = 0;
for (int i = nFr;i < nRow && i <= nTo;i++)
{
//if (i >= nFr && i <= nTo)
//{
for (int j = 0;j < nCol;j++)
{
nOffset = ((i + 1) * nCol) + j;
sValue = pazResult[nOffset];
if (bMakeLower) sValue.MakeLower();
listStrValue.AddTail(sValue);
}
//}
}
sqlite3_free_table(pazResult);
return (int)listStrValue.GetCount();
}
return FALSE;
*/
}
typedef struct GetSelDataParaTbl
{
CUIIValueTable* pvalueTable;
BOOL bUpdateLable;
}GETSELDATAPARATBL;
static int CallbackGetSelData(void* data,int nColcount,char** pColVals,char** pColNames)
{
CStringArray arValues,arColNames;
GetSelDataParaTbl* pGetSelData = (GetSelDataParaTbl*)data;
if (pGetSelData->bUpdateLable)
{
for(int i = 0;i < nColcount;i++)
{
arColNames.Add(pColNames[i]);
}
pGetSelData->pvalueTable->SetLableRecord(arColNames);
pGetSelData->bUpdateLable = FALSE;//只更新一次
}
arValues.RemoveAll();
for(int i = 0;i < nColcount;i++)
{
arValues.Add(pColVals[i]);
}
pGetSelData->pvalueTable->AddValueRecord(arValues);
return 0;
}
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CUIIValueTable& valueTable,BOOL bUpdateLable)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* psSQL = (char*)bst;
GetSelDataParaTbl par;
par.pvalueTable = &valueTable;
par.bUpdateLable = bUpdateLable;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb,psSQL,CallbackGetSelData,(void*)&par,NULL);
if (nRc != SQLITE_OK)
{
return FALSE;
}
return valueTable.GetTableLogicSize();
}
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszStrSQL,CUIIValueTable& valueTable, int nFr, int nTo, BOOL bUpdateLable)
{
GetSelData(pszStrSQL, valueTable, bUpdateLable);
for (int i = nTo+1;i < valueTable.GetTableLogicSize();i++)
{
valueTable.RemoveRecordByIndex(i);
}
for (int i = 0;i < nFr;i++)
{
valueTable.RemoveRecordByIndex(0);
}
return valueTable.GetTableLogicSize();
/*OLD
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL)
{
// offset to access column C of row R of **result//
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue;
CStringArray arValues;
int nOffset = 0;
for (int i = 0;i < nRow;i++)
{
//LABLE
if (bUpdateLable && i == 0)
{
for (int j = 0;j < nCol;j++)
{
sValue = pazResult[j];
arValues.Add(sValue);
}
valueTable.SetLableRecord(arValues);
}
//VALUES
arValues.RemoveAll();
if (i >= nFr && i <= nTo)
{
for (int j = 0;j < nCol;j++)
{
nOffset = ((i + 1) * nCol) + j;
sValue = pazResult[nOffset];
arValues.Add(sValue);
}
valueTable.AddValueRecord(arValues);
}
}
sqlite3_free_table(pazResult);
return valueTable.GetTableLogicSize();
}
return FALSE;
*/
}
//选取两列,一个为Key,一个为Value建map
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszSKey_ValueSQL,CMapStringToString& mapKey_Value)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSKey_ValueSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL && nCol >= 2)
{
//offset to access column C of row R of **result
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue,sKey;
CStringArray arValues;
int nOffset = 0;
for (int i = 0;i < nRow;i++)
{
sKey = pazResult[((i + 1) * nCol) + 0];
sValue = pazResult[((i + 1) * nCol) + 1];
mapKey_Value.SetAt(sKey,sValue);
}
sqlite3_free_table(pazResult);
return (int)mapKey_Value.GetCount();
}
return FALSE;
}
int CUIIImpSQLiteServer::GetSelData(LPCTSTR pszSKey_ValueSQL, std::map<CString, CString>& mapKey_Value)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSKey_ValueSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0, nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb, psSQL, &pazResult, &nRow, &nCol, 0);
if (pazResult != NULL && nCol >= 2)
{
// offset to access column C of row R of **result//
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue, sKey;
CStringArray arValues;
int nOffset = 0;
for (int i = 0; i < nRow; i++)
{
sKey = pazResult[((i + 1) * nCol) + 0];
sValue = pazResult[((i + 1) * nCol) + 1];
mapKey_Value.insert(std::make_pair(sKey, sValue));
}
sqlite3_free_table(pazResult);
return (int)mapKey_Value.size();
}
return FALSE;
}
static int CallbackGetSelData5(void *data, int nColcount, char **pColVals, char **pColNames)
{
CStringArray arValues, arColNames;
CMapStringToString *pMapKey_Value = (CMapStringToString *)data;
CString sKey, sVal;
for (int i = 0; i < nColcount; i++)
{
sKey = pColNames[i];
sVal = pColVals[i];
pMapKey_Value->SetAt(sKey, sVal);
}
return 0;
}
//选取一行,获得Field到对应数据的映射
int CUIIImpSQLiteServer::GetSelDataEx(LPCTSTR pszSelectSQL,CMapStringToString& mapFieldToValue)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSelectSQL);
char *psSQL = (char *)bst;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData5, (void *)&mapFieldToValue, NULL);
if (nRc != SQLITE_OK)
{
return FALSE;
}
return mapFieldToValue.GetCount();
/*OLD
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSelectSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL && nRow > 0 && nCol > 0)
{
// offset to access column C of row R of **result
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue,sKey;
// 第0行为字段数据
// 第1行开始,为表内数据
int nOffset = 0;
for (int j = 0;j < nCol;j++)
{
nOffset = (0 * nCol) + j;
sKey = pazResult[nOffset];
nOffset = (1 * nCol) + j;
sValue = pazResult[nOffset];
mapFieldToValue.SetAt(sKey, sValue);
}
sqlite3_free_table(pazResult);
return (int)mapFieldToValue.GetCount();
}
return FALSE;
*/
}
static int CallbackGetSelData6(void *data, int nColcount, char **pColVals, char **pColNames)
{
CStringArray arValues, arColNames;
std::map<CString, CString> *pMapKey_Value = (std::map<CString, CString> *)data;
CString sKey, sVal;
for (int i = 0; i < nColcount; i++)
{
sKey = pColNames[i];
sVal = pColVals[i];
pMapKey_Value->insert(std::make_pair(sKey, sVal));
}
return 0;
}
//选取一行,获得Field到对应数据的映射
int CUIIImpSQLiteServer::GetSelDataEx(LPCTSTR pszSelectSQL, std::map<CString, CString>& mapFieldToValue)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSelectSQL);
char *psSQL = (char *)bst;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData6, (void *)&mapFieldToValue, NULL);
if (nRc != SQLITE_OK)
{
return FALSE;
}
return mapFieldToValue.size();
/*OLD
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSelectSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0, nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb, psSQL, &pazResult, &nRow, &nCol, 0);
if (pazResult != NULL && nRow > 0 && nCol > 0)
{
// offset to access column C of row R of **result//
//int offset = ((R + 1) * numCol) + C;
//char *value = result[offset];
CString sValue, sKey;
// 第0行为字段数据
// 第1行开始,为表内数据
int nOffset = 0;
for (int j = 0; j < nCol; j++)
{
nOffset = (0 * nCol) + j;
sKey = pazResult[nOffset];
nOffset = (1 * nCol) + j;
sValue = pazResult[nOffset];
mapFieldToValue.insert(std::make_pair(sKey, sValue));
}
sqlite3_free_table(pazResult);
return (int)mapFieldToValue.size();
}
return FALSE;
*/
}
static int CallbackGetSelData7(void *data, int nColcount, char **pColVals, char **pColNames)
{
std::vector<std::vector<CString>> *pOut = (std::vector<std::vector<CString>> *)data;
std::vector<CString> ss;
CString sKey, sVal;
for (int i = 0; i < nColcount; i++)
{
sKey = pColNames[i];
sVal = pColVals[i];
ss.push_back(sVal);
}
pOut->push_back(ss);
return 0;
}
int CUIIImpSQLiteServer::GetSelDataEx(LPCTSTR pszSelectSQL, std::vector<std::vector<CString>>& datas)
{
if (m_pSQLiteDb == NULL) return FALSE;
datas.clear();
_bstr_t bst(pszSelectSQL);
char* psSQL = (char*)bst;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData7, (void *)&datas, NULL);
if (nRc != SQLITE_OK) return FALSE;
return (int)datas.size();
}
static int CallbackGetSelData8(void *data, int nColcount, char **pColVals, char **pColNames)
{
std::vector<std::map<CString, CString>> *pOut = (std::vector<std::map<CString, CString>> *)data;
std::map<CString, CString> ss;
CString sKey, sVal;
for (int i = 0; i < nColcount; i++)
{
sKey = pColNames[i];
sVal = pColVals[i];
ss.insert(std::make_pair(sKey, sVal));
}
pOut->push_back(ss);
return 0;
}
int CUIIImpSQLiteServer::GetSelDataEx(LPCTSTR pszSelectSQL, std::vector<std::map<CString, CString>> &datas)
{
if (m_pSQLiteDb == NULL) return FALSE;
datas.clear();
_bstr_t bst(pszSelectSQL);
char *psSQL = (char *)bst;
int nRc = sqlite3_exec((sqlite3 *)m_pSQLiteDb, psSQL, CallbackGetSelData8, (void *)&datas, NULL);
if (nRc != SQLITE_OK) return FALSE;
return (int)datas.size();
}
//blob 操作
//insert into table (id,name,picture) values (0,'namestr',?)
//table 对应 id,name 的数据
int CUIIImpSQLiteServer::InsertBlob(LPCTSTR pszSQL,void* pData,int nSize)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSQL);
char* psSQL = (char*)bst;
sqlite3_stmt* pstat = NULL;
const char* pzTail = NULL;
int nResult = sqlite3_prepare((sqlite3 *)m_pSQLiteDb,psSQL,-1,&pstat,&pzTail);
if (!nResult && pstat)
{
//和 SQL 的第 1 个?绑定( 如果有多个 ? ,需要分开绑定
int nResult1 = sqlite3_bind_blob(pstat,1,pData,nSize,NULL);
//将数据输入数据库
int nResult2 = sqlite3_step(pstat);
int nResult3 = sqlite3_reset( pstat );
sqlite3_clear_bindings( pstat );
return nResult1 == 0 ? 1 : 0;
}
return 0;
}
int CUIIImpSQLiteServer::InsertBlob(LPCTSTR pszSQL,LPCTSTR pszFile)
{
_bstr_t bst(pszFile);
char* psFile = (char*)bst;
FILE* pFile = NULL;
#if ARX==16
pFile = fopen(psFile,"rb");
#else
fopen_s(&pFile,psFile,"rb");
#endif
byte* pData = NULL;
long l_file_size = 0;
if (pFile)
{
fseek(pFile,0,SEEK_END);
l_file_size = ftell(pFile);
fseek(pFile,0,SEEK_SET);
pData = new byte[l_file_size];
fread(pData,1,l_file_size,pFile);
fclose(pFile);
int nResult = 0;
#ifdef ZIP_DATA
//压缩
uLong ldestLen = compressBound(l_file_size);
byte* pDest = new byte[ldestLen + sizeof(l_file_size)];
compress(pDest,&ldestLen,pData,l_file_size);
byte* pOffSize = pDest + ldestLen;
memcpy(pOffSize,&l_file_size,sizeof(l_file_size));
nResult = InsertBlob(pszSQL,pDest,(int)(ldestLen + sizeof(l_file_size) ) );
delete [] pDest;
#else
nResult = InsertBlob(pszSQL,pData,(int)(l_file_size ) );
#endif
delete [] pData;
return nResult;
}
return 0;
}
//update table set id=,name='namestr',picture=? where ...
int CUIIImpSQLiteServer::UpdateBlob(LPCTSTR pszSQL,void* pData,int nSize)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSQL);
char* psSQL = (char*)bst;
sqlite3_stmt* pstat = NULL;
const char* pzTail = NULL;
int nResult = sqlite3_prepare((sqlite3 *)m_pSQLiteDb,psSQL,-1,&pstat,&pzTail);
if (!nResult && pstat)
{
//和 SQL 的第 1 个?绑定( 如果有多个 ? ,需要分开绑定
nResult = sqlite3_bind_blob(pstat,1,pData,nSize,NULL);
//将数据输入数据库
nResult = sqlite3_step(pstat);
sqlite3_reset(pstat);
sqlite3_clear_bindings( pstat );
return 1;
}
return 0;
}
int CUIIImpSQLiteServer::UpdateBlob(LPCTSTR pszSQL,LPCTSTR pszFile)
{
_bstr_t bst(pszFile);
char* psFile = (char*)bst;
FILE* pFile = NULL;
#if ARX==16
pFile = fopen(psFile,"rb");
#else
fopen_s(&pFile,psFile,"rb");
#endif
byte* pData = NULL;
long l_file_size = 0;
if (pFile)
{
fseek(pFile,0,SEEK_END);
l_file_size = ftell(pFile);
fseek(pFile,0,SEEK_SET);
pData = new byte[l_file_size];
fread(pData,1,l_file_size,pFile);
fclose(pFile);
int nResult = 0;
#ifdef ZIP_DATA
//压缩
uLong ldestLen = compressBound(l_file_size);
byte* pDest = new byte[ldestLen + sizeof(l_file_size) ];
compress(pDest,&ldestLen,pData,l_file_size);
byte* pOffSize = pDest + ldestLen;
memcpy(pOffSize,&l_file_size,sizeof(l_file_size));
nResult = UpdateBlob(pszSQL,pDest,(int)(ldestLen + sizeof(l_file_size) ) );
delete [] pDest;
#else
nResult = UpdateBlob(pszSQL,pData,(int)( l_file_size ) );
#endif
delete [] pData;
return nResult;
}
return 0;
}
//select picture from table where id=...
int CUIIImpSQLiteServer::GetSelBlob(LPCTSTR pszSQL,void*& pData,int& nSize)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSQL);
char* psSQL = (char*)bst;
sqlite3_stmt* pstat = NULL;
const char* pzTail = NULL;
int nResult = sqlite3_prepare((sqlite3 *)m_pSQLiteDb,psSQL,-1,&pstat,&pzTail);
int nCol = sqlite3_column_count(pstat);
int colType = 0;
nResult = sqlite3_step(pstat);
if (nResult == SQLITE_ROW)
{
for(int k = 0;k < nCol;k++)
{
colType = sqlite3_column_type(pstat,k);
if (colType == 4)
{
const void* pData1 = sqlite3_column_blob(pstat, k);
nSize = sqlite3_column_bytes(pstat,k);
pData = new byte[nSize];
memcpy(pData,pData1,nSize);
BOOL bRes = FALSE;
#ifdef ZIP_DATA
int l_file_size = nSize;
uLongf udestLen = nSize;
byte* pBuffer = pData;
byte* pOff = (byte*)pBuffer;
pOff += ( lDataSize - sizeof(long) );
l_file_size = *((long*)pOff);
//解压缩
byte* pDest = new byte[l_file_size + 512];//放大512
udestLen = l_file_size + 512;
if ( Z_OK == uncompress(pDest,&udestLen,(byte*)pBuffer,lDataSize - sizeof(long) ) )
{
delete [] pData;
pData = new byte[udestLen];
nSize = udestLen;
memcpy(pData,pDest,udestLen);
delete [] pDest;
}
#endif
sqlite3_finalize( pstat );
return nSize > 0 ? 1 : 0;
}
}
}
sqlite3_finalize( pstat );
return 0;
}
int CUIIImpSQLiteServer::GetSelBlob(LPCTSTR pszSQL,LPCTSTR pszFilePath)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszSQL);
char* psSQL = (char*)bst;
void* pData = NULL;
int nSize = 0;
if ( GetSelBlob(pszSQL,pData,nSize) )
{
_bstr_t bst2(pszFilePath);
char* psFile = (char*)bst2;
FILE *file = NULL;
#if ARX==16
file = fopen(psFile,"wb");
#else
errno_t er = fopen_s(&file,psFile,"wb");
#endif
if (file)
{
fwrite(pData, 1, nSize, file);
fclose(file);
delete [] (byte*)pData;
return 1;
}
}
return 0;
}
void CUIIImpSQLiteServer::GetDbTableNameArray(CStringArray& arTables)
{
CString sSQL;
sSQL = _T("select name from sqlite_master where type='table'");
_bstr_t bst(sSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL && nRow == 0)//说明没有
{
return;
}
CString sName;
int nOffset = 0;
for (int i = 0;i < nRow;i++)
{
nOffset = i + 1;
sName = pazResult[nOffset];
if (sName.CompareNoCase(_T("sqlite_sequence")) != 0)//内部表不加入
arTables.Add(sName);
}
if (pazResult != NULL)
sqlite3_free_table(pazResult);
}
void CUIIImpSQLiteServer::GetDBTableNameList(CStringList& listTables)
{
CString sSQL;
sSQL = _T("select name from sqlite_master where type='table'");
_bstr_t bst(sSQL);
char* psSQL = (char*)bst;
char** pazResult = NULL;
int nRow = 0,nCol = 0;
sqlite3_get_table((sqlite3 *)m_pSQLiteDb,psSQL,&pazResult,&nRow,&nCol,0);
if (pazResult != NULL && nRow == 0)//说明没有
{
return;
}
CString sName;
int nOffset = 0;
for (int i = 0;i < nRow;i++)
{
nOffset = i + 1;
sName = pazResult[nOffset];
listTables.AddTail(sName);
}
if (pazResult != NULL)
sqlite3_free_table(pazResult);
}
BOOL CUIIImpSQLiteServer::ExecuteSQL(LPCTSTR pszStrSQL)
{
if (m_pSQLiteDb == NULL)
return FALSE;
_bstr_t bst(pszStrSQL);
char* pszSql = (char*)bst;
int nRes = sqlite3_exec((sqlite3 *)m_pSQLiteDb,pszSql,NULL,NULL,NULL);
if (nRes != SQLITE_OK)
{
if (nRes == SQLITE_LOCKED || nRes == SQLITE_BUSY)
{
}
return FALSE;
}
return TRUE;
}
BOOL CUIIImpSQLiteServer::IsDatabaseOpen()
{
return (m_pSQLiteDb != NULL) ? TRUE : FALSE;
}
void CUIIImpSQLiteServer::BeginTrans()
{
if (m_pSQLiteDb != NULL)
{
sqlite3_exec((sqlite3 *)m_pSQLiteDb, "begin;", 0, 0, 0); // 开启事务
}
}
void CUIIImpSQLiteServer::RollbackTrans()
{
if (m_pSQLiteDb != NULL)
{
sqlite3_exec((sqlite3 *)m_pSQLiteDb, "rollback;", 0, 0, 0);// 回滚事务
}
}
void CUIIImpSQLiteServer::CommitTrans()
{
if (m_pSQLiteDb != NULL)
{
sqlite3_exec((sqlite3 *)m_pSQLiteDb, "commit;", 0, 0, 0); // 提交事务
}
}