⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virtualinfofile.cpp

📁 mcgs的数据导出源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -