📄 selfdb.cpp.svn-base
字号:
static BOOL bFirstCall = TRUE;
if( bFirstCall )
{
bFirstCall = FALSE;
// remove old
CSPString sRoot = GetRootPath();
CClkFile::RemoveFileIfOutoftime( sRoot+self_sh_minute, pMinute->m_time );
CClkFile::RemoveFileIfOutoftime( sRoot+self_sz_minute, pMinute->m_time );
}
CSPString sFileName;
CClkFile file;
DWORD dwStoreCount = 0;
CMinute aMinute;
for( int i=0; i<nCount; i++ )
{
CStockInfo info;
CSPString sFileNameNew;
if( !info.SetStockCode( pMinute[i].m_dwMarket, pMinute[i].m_szCode )
|| !GetFileName( sFileNameNew, CStock::dataMinute, &info ) )
continue;
if( 0 != sFileNameNew.Compare( sFileName ) )
{
sFileName = sFileNameNew;
SP_VERIFY( CClkFile::BuildEmptyFile( sFileName, CStock::dataMinute, pMinute->m_dwMarket, 5000, 250, FALSE ) );
SP_VERIFY( file.Open( sFileName ) );
}
if( aMinute.GetSize() > 0
&& (aMinute[0].m_dwMarket != pMinute[i].m_dwMarket || 0 != strncmp(aMinute[0].m_szCode,pMinute[i].m_szCode,sizeof(pMinute[i].m_szCode))) )
{
dwStoreCount ++;
// store
file.StoreDataRecord( aMinute[0].m_dwMarket, aMinute[0].m_szCode,
aMinute.GetData(), sizeof(MINUTE), aMinute.GetSize(), TRUE );
aMinute.RemoveAll();
}
aMinute.Add( pMinute[i] );
}
if( aMinute.GetSize() > 0 )
{
dwStoreCount ++;
// store
file.StoreDataRecord( aMinute[0].m_dwMarket, aMinute[0].m_szCode,
aMinute.GetData(), sizeof(MINUTE), aMinute.GetSize(), TRUE );
aMinute.RemoveAll();
}
return dwStoreCount;
}
int CSelfDB::StoreOutline( OUTLINE * pOutline, int nCount )
{
SP_ASSERT( m_bIsOK && pOutline && nCount > 0 );
if( !m_bIsOK || !pOutline || nCount <= 0 ) return 0;
CSPString sFileName;
SP_VERIFY( GetFileName(sFileName,CStock::dataOutline,NULL) );
CSPFile file;
if( file.Open( sFileName, CSPFile::modeCreate | CSPFile::modeWrite ) )
{
file.Write( pOutline, sizeof(OUTLINE)*nCount );
file.Close();
return nCount;
}
return 0;
}
BOOL CSelfDB::GetAccurateRoot( const char * rootpath, char *accurateroot, int maxlen )
{
if( 0 == rootpath || strlen(rootpath)==0 )
return FALSE;
// get rootpath
CSPString strRoot = rootpath;
int nLen = strRoot.GetLength();
if( strRoot[nLen-1] != '\\' && strRoot[nLen-1] != '/' )
strRoot += CHAR_DIRSEP;
nLen = strRoot.GetLength();
if( 0 != access( strRoot + ml_dat, 0 ) )
return FALSE;
if( 0 != access( strRoot + ml_data, 0 ) )
return FALSE;
if( 0 != access( strRoot + ml_sh, 0 ) )
return FALSE;
if( 0 != access( strRoot + ml_sh_base, 0 ) )
return FALSE;
if( 0 != access( strRoot + ml_sh_month, 0 ) )
return FALSE;
if( 0 != access( strRoot + ml_sh_week, 0 ) )
return FALSE;
if( 0 != access( strRoot + ml_sh_day, 0 ) )
return FALSE;
if( 0 != access( strRoot + ml_sh_min, 0 ) )
return FALSE;
if( 0 != access( strRoot + self_sh_xdr, 0 ) )
return FALSE;
if( 0 != access( strRoot + self_news, 0 ) )
return FALSE;
strncpy( accurateroot, strRoot, maxlen-1);
accurateroot[maxlen-1] = '\0';
return TRUE;
}
int CSelfDB::InstallCodetbl( const char * filename, const char *orgname )
{
if( NULL == filename || strlen(filename) == 0
|| NULL == orgname || strlen(orgname) == 0 )
return 0;
CSPString sFileName = GetRootPath();
CSPString sOrgName = "dat\\";
sOrgName += orgname;
if( 0 == sOrgName.CompareNoCase(ml_sh_info)
|| 0 == sOrgName.CompareNoCase(ml_sz_info)
|| 0 == sOrgName.CompareNoCase(ml_sh_now)
|| 0 == sOrgName.CompareNoCase(ml_sz_now)
|| 0 == sOrgName.CompareNoCase(ml_sh_pyjc)
|| 0 == sOrgName.CompareNoCase(ml_sz_pyjc)
|| 0 == sOrgName.CompareNoCase(ml_sh_trace)
|| 0 == sOrgName.CompareNoCase(ml_sz_trace)
|| 0 == sOrgName.CompareNoCase(ml_sh_minute)
|| 0 == sOrgName.CompareNoCase(ml_sz_minute) )
sFileName += ml_dat;
else
sFileName += ml_data;
sFileName += orgname;
return CSPFile::CopyFile( filename, sFileName, FALSE );
}
int CSelfDB::InstallCodetblBlock( const char * filename, const char *orgname )
{
if( NULL == filename || strlen(filename) == 0
|| NULL == orgname || strlen(orgname) == 0 )
return 0;
int nRet = 0;
CDomainContainer newdomains;
if( newdomains.Load( filename ) )
{
nRet = AfxGetDomainContainer().AddDomainReplace( newdomains );
AfxGetDomainContainer().Store( AfxGetProfile().GetDomainFile() );
}
return nRet;
}
int CSelfDB::InstallCodetblFxjBlock( const char * filename, const char *orgname )
{
if( NULL == filename || strlen(filename) == 0
|| NULL == orgname || strlen(orgname) == 0 )
return 0;
CSPString sName = orgname;
int nIndex = sName.Find( '.' );
if( -1 != nIndex )
sName = sName.Left(nIndex);
CDomain domain;
domain.m_strName = sName;
int nRet = domain.AddFxjDomain( filename );
if( nRet > 0 )
{
AfxGetDomainContainer().AddDomainReplace( domain );
}
return nRet;
}
int CSelfDB::InstallDRData( CDRData & drdata )
{
if( drdata.GetSize() <= 0 )
return 0;
CSPString sFileName;
CStockInfo stockinfo;
DWORD dwMarket = drdata.ElementAt(0).m_dwMarket;
CSPString sCode = drdata.ElementAt(0).m_szCode;
stockinfo.SetStockCode( dwMarket, sCode );
if( !GetFileName( sFileName, CStock::dataDR, &stockinfo ) )
return 0;
int nCount = 0;
CSPFile fileTo;
if( fileTo.Open( sFileName, CSPFile::modeCreate | CSPFile::modeNoTruncate | CSPFile::modeReadWrite ) )
{
for( int i=0; i<drdata.GetSize(); i++ )
{
CLK_DRDATA dbdrnew;
convert_DRDATA_to_CLK_DRDATA( &(drdata.ElementAt(i)), &dbdrnew );
fileTo.SeekToBegin( );
CLK_DRDATA dbdr;
memset( &dbdr, 0, sizeof(dbdr) );
BOOL bHas = FALSE;
BOOL bInsert = FALSE;
while( sizeof(dbdr) == fileTo.Read( &dbdr, sizeof(dbdr) ) )
{
if( dbdr.date == dbdrnew.date )
{
bHas = TRUE;
fileTo.Seek( fileTo.GetPosition()-sizeof(dbdr), CSPFile::begin );
break;
}
if( dbdr.date > dbdrnew.date )
{
bInsert = TRUE;
break;
}
}
if( bHas || !bInsert )
fileTo.Write( &dbdrnew, sizeof(dbdrnew) );
else if( bInsert )
{
int nCur = fileTo.GetPosition();
int nLen = fileTo.GetLength();
BYTE * pbuffer = new BYTE[nLen-nCur+1];
if( pbuffer )
{
if( nLen - nCur > 0 ) fileTo.Read( pbuffer, nLen-nCur );
fileTo.Seek( nCur-sizeof(dbdr), CSPFile::begin );
fileTo.Write( &dbdrnew, sizeof(dbdrnew) );
fileTo.Write( &dbdr, sizeof(dbdr) );
if( nLen - nCur > 0 ) fileTo.Write( pbuffer, nLen-nCur );
delete [] pbuffer;
}
}
nCount ++;
fileTo.Flush();
}
fileTo.Close();
}
return nCount;
}
int CSelfDB::InstallDRDataClk( const char * filename, const char *orgname )
{
if( NULL == filename || strlen(filename) == 0
|| NULL == orgname || strlen(orgname) == 0 )
return 0;
CSPString sFileName;
CSPString sCode = orgname;
int nIndex = sCode.Find( '.' );
if( -1 != nIndex )
sCode = sCode.Left(nIndex);
CStockInfo info;
info.SetStockCode( CStock::marketUnknown, sCode );
DWORD dwMarket = info.GetMarket();
CDRData drdata;
CSPFile file;
if( file.Open( filename, CSPFile::modeRead ) )
{
CLK_DRDATA dbdr;
while( sizeof(dbdr) == file.Read(&dbdr,sizeof(dbdr)) )
{
DRDATA dr;
convert_CLK_DRDATA_to_DRDATA( dwMarket, sCode, &dbdr, &dr );
drdata.Add( dr );
}
file.Close();
}
return InstallDRData( drdata );
}
int CSelfDB::InstallDRDataFxj( const char * fxjfilename )
{
if( NULL == fxjfilename || strlen(fxjfilename) == 0 )
return 0;
CSPString sFileName = GetRootPath();
sFileName += self_chna_xdr;
return CSPFile::CopyFile( fxjfilename, sFileName, FALSE );
}
int CSelfDB::InstallBasetable( const char * filename, const char * orgname )
{
if( NULL == filename || strlen(filename) == 0
|| NULL == orgname || strlen(orgname) == 0 )
return 0;
CSPString sFileName = GetRootPath();
sFileName += ml_data;
sFileName += orgname;
return CSPFile::CopyFile( filename, sFileName, FALSE );
}
int CSelfDB::InstallBasetableTdx( const char * filename )
{
if( NULL == filename || strlen(filename) == 0 )
return 0;
int nCount = 0;
CSPString sRoot = GetRootPath();
CSPString sFileNameSHSZ = sRoot + self_chna_basetbl;
CSPFile fileSHSZ, fileTdx;
if( fileSHSZ.Open( sFileNameSHSZ, CSPFile::modeWrite | CSPFile::modeCreate )
&& fileTdx.Open( filename, CSPFile::modeRead ) )
{
fileTdx.Seek( TDX_FHEADER_SIZE, CSPFile::begin );
TDX_BASEDATA tdxblock;
while( sizeof(tdxblock) == fileTdx.Read( &tdxblock, sizeof(tdxblock) ) )
{
BASEDATA block;
if( convert_TDX_BASEDATA_to_BASEDATA( &tdxblock, &block ) )
{
fileSHSZ.Write( &block, sizeof(block) );
nCount ++;
}
}
}
return nCount;
}
int CSelfDB::InstallBasetableFxj( const char * filename )
{
if( NULL == filename || strlen(filename) == 0 )
return 0;
DWORD dwDate = CSPTime::GetCurrentTime().ToStockTimeDay();
{
CSPString sTemp = filename;
int index1 = sTemp.ReverseFind( '/' );
int index2 = sTemp.ReverseFind( '\\' );
int index = max(index1,index2);
if( index > 0 )
sTemp = sTemp.Mid(index+1);
DWORD dwTemp = atol(sTemp);
CSPTime sptime;
if( sptime.FromStockTimeDay( dwTemp ) )
dwDate = dwTemp;
}
int nCount = 0;
CSPString sRoot = GetRootPath();
CSPString sFileNameSHSZ = sRoot + self_chna_basetbl;
CSPFile fileSHSZ, fileFxj;
if( fileSHSZ.Open( sFileNameSHSZ, CSPFile::modeWrite | CSPFile::modeCreate )
&& fileFxj.Open( filename, CSPFile::modeRead ) )
{
fileFxj.Seek( FXJ_FHEADER_SIZE, CSPFile::begin );
FXJ_BASEDATA fxjblock;
while( sizeof(fxjblock) == fileFxj.Read( &fxjblock, sizeof(fxjblock) ) )
{
BASEDATA block;
if( convert_FXJ_BASEDATA_to_BASEDATA( &fxjblock, &block, dwDate ) )
{
fileSHSZ.Write( &block, sizeof(block) );
nCount ++;
}
}
}
return nCount;
}
int CSelfDB::InstallNewsText( const char * filename, const char *orgname )
{
if( NULL == filename || strlen(filename) == 0
|| NULL == orgname || strlen(orgname) == 0 )
return 0;
CSPString sFileName = GetRootPath();
sFileName += self_news;
sFileName += orgname;
return CSPFile::CopyFile( filename, sFileName, FALSE );
}
int CSelfDB::InstallNewsText( const char * buffer, int nLen, const char *orgname )
{
if( NULL == buffer || nLen <= 0
|| NULL == orgname || strlen(orgname) == 0 )
return 0;
CSPString sFileName = GetRootPath();
sFileName += self_news;
sFileName += orgname;
CSPFile file;
if( file.Open(sFileName,CSPFile::modeWrite|CSPFile::modeCreate) )
{
file.Write( buffer, nLen );
file.Close();
return 1;
}
return 0;
}
BOOL CSelfDB::GetFileName( CSPString &sFileName, int nDataType,
CStockInfo * pInfo, int nKType )
{
if( CStock::dataOutline == nDataType )
{
sFileName = GetRootPath();
sFileName += self_outline;
return TRUE;
}
if( NULL == pInfo || !pInfo->IsValidStock() )
return FALSE;
// 如果钱龙文件存在,就返回钱龙文件名(dataDR除外)
CSPString sFileNameQL;
if( CStock::dataDR != nDataType
&& CQianlong::GetFileName( sFileNameQL, nDataType, pInfo, nKType )
&& 0 == access(sFileNameQL,0) )
{
sFileName = sFileNameQL;
return TRUE;
}
// 确定市场类型
if( CStock::marketUnknown == pInfo->GetMarket() )
pInfo->ResolveTypeAndMarket( );
// 如果在 ml_sh 目录下找到文件,就返回找到的文件名
// 否则,若钱龙文件名长度大于0,就返回钱龙文件名,等于0就返回 ml_sh 下的文件名
if( CStock::dataBasetext == nDataType )
{
sFileName = GetRootPath();
sFileName += ml_sh_base;
sFileName += CSPString(pInfo->GetStockCode()) + ml_ext_base;
if( 0 != access(sFileName,0) && sFileNameQL.GetLength() > 0 )
sFileName = sFileNameQL;
return TRUE;
}
else if( CStock::dataK == nDataType )
{
sFileName = GetRootPath();
sFileName += ml_sh;
switch( nKType )
{
case CKData::ktypeMonth:
sFileName += CSPString(ml_month) + pInfo->GetStockCode() + ml_ext_month;
break;
case CKData::ktypeWeek:
sFileName += CSPString(ml_week) + pInfo->GetStockCode() + ml_ext_week;
break;
case CKData::ktypeDay:
sFileName += CSPString(ml_day) + pInfo->GetStockCode() + ml_ext_day;
break;
case CKData::ktypeMin60:
return FALSE;
case CKData::ktypeMin30:
return FALSE;
case CKData::ktypeMin15:
return FALSE;
case CKData::ktypeMin5:
sFileName += CSPString(ml_min5) + pInfo->GetStockCode() + ml_ext_min5;
break;
default:
return FALSE;
}
if( 0 != access(sFileName,0) && sFileNameQL.GetLength() > 0 )
sFileName = sFileNameQL;
return TRUE;
}
else if( CStock::dataDR == nDataType )
{
sFileName = GetRootPath();
if( pInfo->IsShenZhen() )
sFileName += self_sz_xdr;
else
sFileName += self_sh_xdr;
sFileName += CSPString(pInfo->GetStockCode()) + self_ext_xdr;
if( 0 == access(sFileName,0) )
return TRUE;
CSPString sTemp = GetRootPath();
sTemp += self_sh_xdr;
sTemp += CSPString(pInfo->GetStockCode()) + self_ext_xdr;
if( 0 == access(sTemp,0) )
sFileName = sTemp;
return TRUE;
}
else if( CStock::dataReport == nDataType )
{
sFileName = GetRootPath();
if( pInfo->IsShenZhen() )
sFileName += self_sz_report;
else
sFileName += self_sh_report;
return TRUE;
}
else if( CStock::dataMinute == nDataType )
{
sFileName = GetRootPath();
if( pInfo->IsShenZhen() )
sFileName += self_sz_minute;
else
sFileName += self_sh_minute;
return TRUE;
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -