1777 lines
39 KiB
C++
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); // 提交事务
|
|
}
|
|
} |