📄 virtualinfofile.cpp
字号:
// VirtualInfoFile.cpp: implementation of the CVirtualInfoFile class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "VirtualInfoFile.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//lzlzlz
long CVirtualInfoFile::m_iTotalReadRecords = 0;
long CVirtualInfoFile::m_iRequiredRecords = MCGS_MAXRECORDS; //lzlzlz 2003.6.13
float CVirtualInfoFile::m_fStep = 0;
WORD CVirtualInfoFile::m_wInvRead = MCGS_READDATA_O2N | MCGS_READDATA_ASC;
CVirtualInfoFile::EXSTATUS CVirtualInfoFile::m_exStatus = CVirtualInfoFile::MCGS_FORHISPIC;
COleDateTime CVirtualInfoFile::m_tIniEndTime = COleDateTime(9999,1,1,0,0,0);
//lzlzlz 2003.6.24
CVirtualDBQuery* CVirtualInfoFile::m_pDBQuery = NULL;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CVirtualInfoFile::CVirtualInfoFile( CString strFileName )
{
m_strFileName = strFileName;
m_pCurSaveFile = NULL;
m_pCurReadFile = NULL;
m_iTotalReadRecords = 0;
m_iRequiredRecords = MCGS_MAXRECORDS;//lzlzlz 2003.6.13
m_fStep = 0;
m_wInvRead = MCGS_READDATA_O2N | MCGS_READDATA_ASC;
m_exStatus = CVirtualInfoFile::MCGS_FORHISPIC;
CVirtualInfoFile::m_tIniEndTime = COleDateTime(9999,1,1,0,0,0);
m_lDataStorageFreeSpace = 0;
}
CVirtualInfoFile::~CVirtualInfoFile()
{
if ( m_pCurSaveFile != NULL )
{
mfStoreCurSaveFileInfo ();
delete m_pCurSaveFile;
m_pCurSaveFile = NULL;
}
//lzlzlz
//释放读取文件缓存列表
if (m_pCurReadFile != NULL)
{
delete m_pCurReadFile;
m_pCurReadFile = NULL;
}
//zzm 2003-10-31,没有必要在这里刷新东西
//到磁盘上去。
//SvrFreshInfoToDisk();
//SvrFreshToDisk ();
}
void CVirtualInfoFile::mfClear()
{
if ( m_pCurSaveFile != NULL )
{
mfStoreCurSaveFileInfo ();
delete m_pCurSaveFile;
m_pCurSaveFile = NULL;
}
//lzlzlz
//释放读取文件缓存列表
/* POSITION pos = m_ListReadFile.GetHeadPosition();
while(pos != NULL)
{
POSITION posOld = pos;
RFILEBUFFER fBuf = m_ListReadFile.GetNext(pos);
m_ListReadFile.RemoveAt(posOld);
delete fBuf.m_pFile;
}
*/
m_iTotalReadRecords = 0;
m_iRequiredRecords = MCGS_MAXRECORDS;//lzlzlz 2003.6.13
m_fStep = 0;
m_wInvRead = MCGS_READDATA_O2N | MCGS_READDATA_ASC;
m_exStatus = CVirtualInfoFile::MCGS_FORHISPIC;
CVirtualInfoFile::m_tIniEndTime = COleDateTime(9999,1,1,0,0,0);
}
FILE_ERROR CVirtualInfoFile::SvrNetDBReadData( CString& strName, COleDateTime& tBegin, BYTEARRAY& buff)
{
long lngStart = -1;
for ( int i = 0; i < ARRAYSIZE(m_arraySaveInfo); i++ )
{
if ( m_arraySaveInfo[i].SvrGetEndTime() > tBegin )
{
lngStart = i;
break;
}
}
if ( lngStart == -1 )
return S_FILE_OK;
long lngRecNum = 0;
BYTEARRAY buffData;
while( lngStart < ARRAYSIZE( m_arraySaveInfo) && lngRecNum < 30 )
{
int iReadPos = mfGetCurReadFileInfo ();
int iSavePos = this->mfStoreCurSaveFileInfo ();
if (iSavePos == lngStart)
{
m_pCurSaveFile ->SvrNetDBReadData( tBegin, lngRecNum, buffData );
}
else if (iReadPos == lngStart)
{
ASSERT(m_pCurReadFile != NULL);
m_pCurReadFile->SvrNetDBReadData( tBegin, lngRecNum, buffData );
}
else
{
delete this->m_pCurReadFile ;
m_pCurReadFile = NULL;
TRACE(_T("创建存盘文件读取指针%d\n"),lngStart);
m_pCurReadFile = m_arraySaveInfo[lngStart].SvrCreateSaveFile(this);
m_pCurReadFile->SvrNetDBReadData( tBegin, lngRecNum, buffData );
}
lngStart++;
}
long lngSize = 0;
CString str;
/* COwnerArchive ar( COwnerArchive::storing );
ar.Write( &lngSize, sizeof(long) );
str = _T("BEGIN");
ar << str;
ar << lngRecNum;
COwnerArchive arField( COwnerArchive::storing );
BYTEARRAY buffField;
str = _T("HEAD");
arField << str;
int iType = 0;
int iID = 0;
iID = CENDATA->SvrGetDatID(strName, iType);
INTARRAY IDs;
CENDATA->SvrGetGroupID(iID, IDs);
arField << (long)(ARRAYSIZE(IDs)+2);
arField << (long)VDATETIME;
arField << (long)VINTEGER;
for (int j = 0; j<ARRAYSIZE(IDs); j++)
{
int type;
CENDATA->SvrGetDataType(IDs[j], type);
arField << (long)type;
}
str = _T("HEAD");
arField << str;
buffField.SetSize( arField.SvrGetBufferSize() );
arField.SvrSeekToBegin();
arField.SvrChangeMode( COwnerArchive::load );
arField.SvrRead( buffField );
ar.SvrWrite( ARRAYDATA(buffField), ARRAYSIZE(buffField) );
ar.SvrWrite( ARRAYDATA(buffData), ARRAYSIZE(buffData) );
str = _T("END");
ar << str;
ARRAYRESIZE( buff, ar.SvrGetBufferSize() );
ar.SvrSeekToBegin();
ar.SvrChangeMode( COwnerArchive::load );
ar.SvrRead( buff );
lngSize = buff.GetSize();
memcpy( buff.GetData(), &lngSize, sizeof(long) );
*/
return S_FILE_OK;
}
FILE_ERROR CVirtualInfoFile::SvrQueryLastSaveTime( COleDateTime& time )
{
if ( m_pCurSaveFile != NULL )
m_pCurSaveFile->SvrQueryLastSaveTime( time );
return S_FILE_OK;
}
bool McgsIfTimeCross( COleDateTime& time1, COleDateTime& time2, COleDateTime& time3, COleDateTime& time4 );
long CVirtualInfoFile::mfGetDBDataCore( int i, int iPos, CString strGroupName,
STRINGARRAY& arrayFieldNames,
COleDateTime& tBegin,
COleDateTime& tEnd,
CArray<CList<COleVariant,COleVariant>*,CList<COleVariant,COleVariant>*>& listValueBuffer
)
{
long lngNum = 0;
CString str;
str=tBegin.Format(_T("%Y-%m-%d %H:%M:%S"));
::AfxMessageBox(str);
str=tEnd.Format(_T("%Y-%m-%d %H:%M:%S"));
::AfxMessageBox(str);
str=m_arraySaveInfo[i].SvrGetStartTime().Format(_T("%Y-%m-%d %H:%M:%S"));
::AfxMessageBox(str);
str=m_arraySaveInfo[i].SvrGetStartTime().Format(_T("%Y-%m-%d %H:%M:%S"));
::AfxMessageBox(str);
if ( McgsIfTimeCross( tBegin, tEnd, m_arraySaveInfo[i].SvrGetStartTime(),
m_arraySaveInfo[i].SvrGetEndTime() ) )
{
if (m_pCurSaveFile != NULL && i == iPos)
{
// 检查一下是否可以立即使用
lngNum = m_pCurSaveFile->SvrGetSaveFile( strGroupName, arrayFieldNames, tBegin, tEnd, listValueBuffer );
}
else
{
BOOL bReaded = FALSE;
if(bReaded == FALSE)
{
//第一次读取或者该文件在缓存之外
if (m_pCurReadFile != NULL)
delete m_pCurReadFile;
m_pCurReadFile = m_arraySaveInfo[i].SvrCreateSaveFile(this,TRUE);
if(NULL == m_pCurReadFile)
{
//这个数据文件读取发生异常
ASSERT(FALSE);
m_arraySaveInfo[i].m_bValid = FALSE;
TRY
{
DeleteFile(m_arraySaveInfo[i].m_strFileName);
}
CATCH(CFileException,e)
{
e->Delete();
}
END_CATCH
return 0;
}
RFILEBUFFER buf;
buf.m_pFile = m_pCurReadFile;
buf.m_iPos = i;
lngNum = m_pCurReadFile->SvrGetSaveFile( strGroupName, arrayFieldNames, tBegin, tEnd, listValueBuffer );
}
}
}//end of if 满足时间条件
return lngNum;
}
//lzlzlz 2003.6.16 {
void CVirtualInfoFile::mfDelDataByFile(COleDateTime tBegin, COleDateTime tEnd)
{
BOOL bSuc = FALSE;
int iCount = ARRAYSIZE(m_arraySaveInfo);
for ( int i = iCount - 1; i >= 0; i-- )
{
CVirtualSaveStruct saveInfo = m_arraySaveInfo[i];
COleDateTime tB = saveInfo.SvrGetStartTime();
COleDateTime tE = saveInfo.SvrGetEndTime();
if(tB >= tBegin && tE <= tEnd)
{
//可以删除
if(DeleteFile(saveInfo.m_strFileName) == TRUE)
{
m_arraySaveInfo.RemoveAt(i);
bSuc = TRUE;
}
}
}
}
//以文件为单位自动删除数据
FILE_ERROR CVirtualInfoFile::mfAutoDelDataByFile(float fPercent)
{
int iCount = ARRAYSIZE(m_arraySaveInfo);
//采用一个近似的方法获得该对象所有文件尺寸的总和
//即:认为所有文件的尺寸相同。这样,可以通过文件个数的比例来处理
int iProper = (int)(iCount * fPercent);
FILE_ERROR bSuc = S_FILE_OK;
if(iProper == 0)
{
bSuc = S_FILE_DELETE_FAIL;
return bSuc;
}
BOOL bFail = TRUE;
for(int i = iProper - 1; i >= 0; i--)
{
CVirtualSaveStruct saveInfo = m_arraySaveInfo[i];
if(DeleteFile(saveInfo.m_strFileName) == TRUE)
{
m_arraySaveInfo.RemoveAt(i);
bFail = FALSE;
}
else
{
CString str;
str.Format(_T("%s删除失败\n"),saveInfo.m_strFileName);
//AfxMessageBox(str);
TRACE(str);
//删除失败,或者是文件坏了,或者是文件不存在。都不需要
//继续保留索引信息了。
m_arraySaveInfo.RemoveAt(i);
bSuc = S_FILE_DELETE_FAIL;
}
}
return bSuc;
}
//lzlzlz 2003.6.16 }
//lzlzlz
FILE_ERROR CVirtualInfoFile::SvrGetDBDataEx(CString strGroupName,
STRINGARRAY& arrayFieldNames,
COleDateTime& tBegin,
COleDateTime& tEnd,
CArray<CList<COleVariant,COleVariant>*,CList<COleVariant,COleVariant>*>& listValueBuffer
)
{
//lzlzlz 2003.6.16
if((CVirtualInfoFile::m_wInvRead & MCGS_DELDATA) == MCGS_DELDATA)
{
mfDelDataByFile(tBegin,tEnd);
return S_FILE_OK;
}
//lzlzlz
// m_GrpObjInfo.GetInfo(strGroupName);
m_iTotalReadRecords = 0;
int iPos = mfStoreCurSaveFileInfo();
long lngReturnRecordCount = 0;
int iCount = ARRAYSIZE(m_arraySaveInfo);
if((m_wInvRead & MCGS_READDATA_N2O) != MCGS_READDATA_N2O)
{
for ( int i = 0; i < iCount; i++ )
{
lngReturnRecordCount += mfGetDBDataCore(i, iPos, strGroupName, arrayFieldNames, tBegin, tEnd, listValueBuffer);
//lzlzlz 2003.6.20
if(CVirtualInfoFile::SvrIsStopGettingData() == true)
{
//已经满足要求
break;
}
}
}
else //逆序读取
{
for ( int i = iCount - 1; i >= 0; i-- )
{
lngReturnRecordCount += mfGetDBDataCore(i, iPos, strGroupName, arrayFieldNames, tBegin, tEnd, listValueBuffer);
//lzlzlz 2003.6.20
if(CVirtualInfoFile::SvrIsStopGettingData() == true)
{
//已经满足要求
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -