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

576 lines
12 KiB
C++

#include "stdafx.h"
#include "BrowseForFolder.h"
#include "UIIPackageDbOper.h"
#include "UIIADORXServer.h"
#include "zlib.h"
#ifdef _WIN64
#import "msado60_Backcompat_x64.tlb" no_namespace rename("EOF", "EndOfFile") rename("EOS", "EndOfStream")
#else
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile") rename("EOS", "EndOfString")
#endif
CUIIPackageDbOper::CUIIPackageDbOper()
{
m_pDbsrv = NULL;
}
CUIIPackageDbOper::~CUIIPackageDbOper()
{
}
static void DisplayADOException(_com_error &e)
{
#ifdef _DEBUG
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
CString sError;
sError.Format(_T("Error:\n")
_T("\tCode = %08lx\n")
_T("\tCode meaning = %s\n")
_T("\tSource = %s\n")
_T("\tDescription = %s\n"),
e.Error(),
e.ErrorMessage(),
(LPCSTR) bstrSource,
(LPCSTR) bstrDescription);
AfxMessageBox(sError);
//写日志文件
#endif
}
BOOL CUIIPackageDbOper::PutPackageToDb(CString& sFile,CString& sTableName,CString& sPackageField,CUIIValueTable& table)
{
if(m_pDbsrv == NULL) return FALSE;
_RecordsetPtr pRstPubInfo = NULL;
_ConnectionPtr pConnection = NULL;
pConnection = m_pDbsrv->GetConnectionPtr();
HRESULT hr= pRstPubInfo.CreateInstance(__uuidof(Recordset));
if(FAILED(hr))
{
return FALSE;
}
pRstPubInfo->CursorType = adOpenKeyset;
pRstPubInfo->LockType = adLockOptimistic;
hr = pRstPubInfo->Open((LPCTSTR)sTableName,_variant_t((IDispatch*)pConnection,true),
adOpenKeyset,adLockOptimistic,adCmdTable);
if(FAILED(hr))
{
return FALSE;
}
pRstPubInfo->AddNew();
VARIANT varSrc;
BOOL bSuccess = MakeVariantFromFile(varSrc,sFile);
if(!bSuccess)
{
AfxMessageBox(_T("数据打包入库出现错误!"));
return FALSE;
}
sPackageField.TrimRight(_T(']'));
sPackageField.TrimLeft(_T('['));
_variant_t varChunk(varSrc);
hr = pRstPubInfo->Fields->GetItem((LPCTSTR)sPackageField)->AppendChunk(varChunk);
if(FAILED(hr))
{
return FALSE;
}
//Assign the other field record
int nSize = table.GetTableLogicSize();
int i = 0;
CString sName,sValue,sType;
CStringArray arValue;
for(i = 0;i<nSize;i++)
{
arValue.RemoveAll();
table.GetValueRecord(i,arValue);
if(arValue.GetSize() == 3)
{
sName = arValue.GetAt(0);
sValue= arValue.GetAt(1);
sType = arValue.GetAt(2);
_variant_t variant;
if(GetConvertValue(variant,sValue,sType))
{
sName.TrimLeft(_T('['));
sName.TrimRight(_T(']'));
FieldPtr pFieldPtr = pRstPubInfo->Fields->GetItem((LPCTSTR)sName);
if (pFieldPtr != NULL)
{
pFieldPtr->PutValue(variant);
}
}
}
}
//Update the table
//执行并返回选择集
try
{
//执行SQL语句
HRESULT rs = pRstPubInfo->Update();
}
catch(_com_error &er)
{
DisplayADOException(er);
pRstPubInfo->Close();
return FALSE;
}
pRstPubInfo->Close();
return TRUE;
}
BOOL CUIIPackageDbOper::PutPackageToDb(void* pData,int nSize,CString& sTableName,CString& sPackageField,CUIIValueTable& table)
{
if(m_pDbsrv == NULL) return FALSE;
_RecordsetPtr pRstPubInfo = NULL;
_ConnectionPtr pConnection = NULL;
pConnection = m_pDbsrv->GetConnectionPtr();
HRESULT hr= pRstPubInfo.CreateInstance(__uuidof(Recordset));
if(FAILED(hr))
{
return FALSE;
}
pRstPubInfo->CursorType = adOpenKeyset;
pRstPubInfo->LockType = adLockOptimistic;
hr = pRstPubInfo->Open((LPCTSTR)sTableName,_variant_t((IDispatch*)pConnection,true),
adOpenKeyset,adLockOptimistic,adCmdTable);
if(FAILED(hr))
{
return FALSE;
}
pRstPubInfo->AddNew();
VARIANT varSrc;
BOOL bSuccess = MakeVariantFromFile(varSrc,pData,nSize);
if(!bSuccess)
{
AfxMessageBox(_T("数据打包入库出现错误!"));
return FALSE;
}
sPackageField.TrimRight(_T(']'));
sPackageField.TrimLeft(_T('['));
_variant_t varChunk(varSrc);
hr = pRstPubInfo->Fields->GetItem((LPCTSTR)sPackageField)->AppendChunk(varChunk);
if(FAILED(hr))
{
return FALSE;
}
//Assign the other field record
int nSize1 = table.GetTableLogicSize();
int i = 0;
CString sName,sValue,sType;
CStringArray arValue;
for(i = 0;i<nSize1;i++)
{
arValue.RemoveAll();
table.GetValueRecord(i,arValue);
if(arValue.GetSize() == 3)
{
sName = arValue.GetAt(0);
sValue= arValue.GetAt(1);
sType = arValue.GetAt(2);
_variant_t variant;
if(GetConvertValue(variant,sValue,sType))
{
sName.TrimLeft(_T('['));
sName.TrimRight(_T(']'));
FieldPtr pFieldPtr = pRstPubInfo->Fields->GetItem((LPCTSTR)sName);
if (pFieldPtr != NULL)
{
pFieldPtr->PutValue(variant);
}
}
}
}
//Update the table
//执行并返回选择集
try
{
//执行SQL语句
HRESULT rs = pRstPubInfo->Update();
}
catch(_com_error &er)
{
DisplayADOException(er);
pRstPubInfo->Close();
return FALSE;
}
pRstPubInfo->Close();
return TRUE;
}
BOOL CUIIPackageDbOper::UpdatePackage(CString& sUpdateResetSQL,CString& sPackageField,CString& sFile)
{
if(m_pDbsrv == NULL) return FALSE;
CFileException eFile;
CFile fileSave;
if (!fileSave.Open(sFile,CFile::modeReadWrite|CFile::shareDenyWrite|CFile::shareDenyRead|CFile::typeBinary,&eFile) )
{
return FALSE;
}
_variant_t varChunk;
long nLength = (int)fileSave.GetLength();
BYTE* pbuf;
pbuf = new BYTE[nLength];
if(pbuf == NULL) return FALSE;
fileSave.Read(pbuf,nLength);
fileSave.Close();
BYTE *pBufEx;
pBufEx = pbuf;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < nLength;i++)
{
SafeArrayPutElement(psa,&i, pBufEx++);
}
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
_ConnectionPtr pConnection = NULL;
pConnection = m_pDbsrv->GetConnectionPtr();
_CommandPtr pCom;
HRESULT hr= pCom.CreateInstance(__uuidof(Command));
if (FAILED(hr))
{
return FALSE;
}
pCom->ActiveConnection = pConnection;
pCom->CommandText = _bstr_t(sUpdateResetSQL);
pCom->CommandType = adCmdText;
pCom->Parameters->Append(pCom->CreateParameter(_T("@Param"),adVarBinary, adParamInput, -1, varBLOB));
try
{
//执行SQL语句
pCom->Execute(NULL,NULL,adCmdText);
}
catch(_com_error &er)
{
DisplayADOException(er);
return FALSE;
}
return TRUE;
}
BOOL CUIIPackageDbOper::UpdatePackage(CString& sSQL,CString& sPackageField,void* pData,int nSize)
{
if(m_pDbsrv == NULL) return FALSE;
_variant_t varChunk;
long nLength = nSize;
BYTE* pbuf = (BYTE*)pData;
BYTE *pBufEx;
pBufEx = pbuf;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < nLength;i++)
{
SafeArrayPutElement(psa,&i, pBufEx++);
}
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
_ConnectionPtr pConnection = NULL;
pConnection = m_pDbsrv->GetConnectionPtr();
_CommandPtr pCom;
HRESULT hr= pCom.CreateInstance(__uuidof(Command));
if (FAILED(hr))
{
return FALSE;
}
pCom->ActiveConnection = pConnection;
pCom->CommandText = _bstr_t(sSQL);
pCom->CommandType = adCmdText;
pCom->Parameters->Append(pCom->CreateParameter(_T("@Param"),adVarBinary, adParamInput, -1, varBLOB));
try
{
//执行SQL语句
pCom->Execute(NULL,NULL,adCmdText);
}
catch(_com_error &er)
{
DisplayADOException(er);
return FALSE;
}
return TRUE;
}
BOOL CUIIPackageDbOper::OutPackageToFile(CString& sFile,CString& sSQL,CString& sPackageField,BOOL bExport)
{
CString sPath;
BOOL bSuccess = FALSE;
if(bExport)
{
int nIndex = sFile.ReverseFind(_T('\\'));
if (nIndex == -1)
{
HWND hWnd = ::AfxGetMainWnd()->m_hWnd;
bSuccess = CBrowseForFolder::BrowseForFolder(hWnd,sPath,_T("请选择放置文件路径,然后确定."),0);
if(!bSuccess)
{
return FALSE;
}
sPath += _T("\\");
}
else
{
sPath = sFile.Mid(0,nIndex + 1);
sFile = sFile.Mid(nIndex + 1);
}
}
else
{
TCHAR szTempfile1[MAX_PATH];
GetTempPath(_MAX_PATH,szTempfile1);
sPath = szTempfile1;
}
sPath += sFile;
sFile = sPath;
if(m_pDbsrv == NULL) return NULL;
_ConnectionPtr pConnection = NULL;
pConnection = m_pDbsrv->GetConnectionPtr();
_RecordsetPtr pRec = pConnection->Execute((LPCTSTR)sSQL, NULL, adCmdText);
if(pRec == NULL || pRec->EndOfFile == -1)
{
return NULL;
}
long lChunkSize = 0;
_variant_t varChunk;
lChunkSize = (long)pRec->Fields->Item[(LPCTSTR)sPackageField]->ActualSize;
if(lChunkSize <= 0) return NULL;
varChunk = pRec->Fields->Item[(LPCTSTR)sPackageField]->GetChunk(lChunkSize);
bSuccess = MakeFileFromVariant(sPath,varChunk,lChunkSize);
//
return bSuccess;
}
BOOL CUIIPackageDbOper::MakeFileFromVariant(CString& sFile,VARIANT& vtArray,long lDataSize)
{
char* pBuffer = NULL;
COleSafeArray safeArray;
safeArray.Attach(vtArray);
safeArray.AccessData((void**)&pBuffer);
BOOL bRes = FALSE;
int l_file_size = lDataSize;
uLongf udestLen = l_file_size;
byte* pDest = (byte*)pBuffer;
#ifdef ZIP_DATA
byte* pOff = (byte*)pBuffer;
pOff += ( lDataSize - sizeof(long) );
l_file_size = *((long*)pOff);
//解压缩
pDest = new byte[l_file_size + 512];//放大512
udestLen = l_file_size + 512;
if ( Z_OK == uncompress(pDest,&udestLen,(byte*)pBuffer,lDataSize - sizeof(long) ) )
{
CFile file;
if(file.Open(sFile,CFile::modeCreate | CFile::modeWrite))
{
int nRepeat = udestLen / 4096;
int i = 0;
char* pBufferT = (char*)pDest;
for(i = 0;i<nRepeat;i++)
{
file.Write(pBufferT,4096);
pBufferT += 4096;
}
int nRemnant = udestLen - nRepeat * 4096;
if(nRemnant > 0)
{
file.Write(pBufferT,nRemnant);
}
file.Close();
bRes = TRUE;
}
delete [] pDest;
}
#else
CFile file;
if(file.Open(sFile,CFile::modeCreate | CFile::modeWrite))
{
int nRepeat = udestLen / 4096;
int i = 0;
char* pBufferT = (char*)pDest;
for(i = 0;i<nRepeat;i++)
{
file.Write(pBufferT,4096);
pBufferT += 4096;
}
int nRemnant = udestLen - nRepeat * 4096;
if(nRemnant > 0)
{
file.Write(pBufferT,nRemnant);
}
file.Close();
bRes = TRUE;
}
#endif
safeArray.UnaccessData();
safeArray.Detach();
return bRes;
}
BOOL CUIIPackageDbOper::GetConvertValue(_variant_t & variant,CString& sValue,CString& sType)
{
if( sType == _T("varchar") ||
sType == _T("text"))
{
variant = (LPCTSTR)sValue;
}
else if(sType == _T("int"))
{
variant = _ttoi(sValue);
}
else if(sType == _T("float"))
{
variant = _tstof(sValue);
}
else if(sType == _T("datetime"))
{
variant = (LPCTSTR)sValue;
}
else
{
return FALSE;
}
return TRUE;
}
BOOL CUIIPackageDbOper::MakeVariantFromFile(VARIANT& vtArray,CString& sFile)
{
CFileFind fileFind;
BOOL bFind = fileFind.FindFile(sFile);
if(bFind)
{
CFile file;
file.Open(sFile,CFile::modeRead);
DWORD nLength = (DWORD)file.GetLength();
//限制附件
double dSizeK = (nLength*1.0) / 20000000.0;//20M
if(dSizeK - 1.0 > 0.001)
{
AfxMessageBox(_T("选择的附件文件过大!建议压缩后再作附件!"));
file.Close();
return FALSE;
}
COleSafeArray safeArray;
safeArray.CreateOneDim(VT_UI1,nLength,NULL);
CWaitCursor wait;
DWORD dwRead = 0;
BYTE buffer[4096];
long nIndex[1];
nIndex[0] = 0;
do
{
dwRead = file.Read(buffer,4096);
if(dwRead > 0)
{
for(DWORD i = 0;i < dwRead;i++)
{
safeArray.PutElement(nIndex,&buffer[i]);
nIndex[0] += 1;
}
}
}
while (dwRead > 0);
file.Close();
vtArray = safeArray.Detach();
}
return TRUE;
}
BOOL CUIIPackageDbOper::MakeVariantFromFile(VARIANT& vtArray,void* pData,int nSize)
{
COleSafeArray safeArray;
safeArray.CreateOneDim(VT_UI1,nSize,NULL);
CWaitCursor wait;
BYTE* pBuffer = (BYTE*)pData;
long nIndex[1];
nIndex[0] = 0;
for(int i = 0;i < nSize;i++)
{
safeArray.PutElement(nIndex,&pBuffer[i]);
nIndex[0] += 1;
}
vtArray = safeArray.Detach();
return TRUE;
}