576 lines
12 KiB
C++
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;
|
|
}
|
|
|
|
|
|
|