SelfDB.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:58k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. /*
  2. Cross Platform Core Code.
  3. Copyright(R) 2001-2002 Balang Software.
  4. All rights reserved.
  5. Using:
  6. class CClkFile;
  7. class CSelfDB;
  8. */
  9. #include "StdAfx.h"
  10. #include "../Include/Database.h"
  11. #include "../Include/SpString.h"
  12. #include "SpLock.h"
  13. #include <direct.h>
  14. #include "SelfDB.h"
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////////////
  21. // SelfDB strings
  22. extern char ml_dat[];
  23. extern char ml_dat[];
  24. extern char ml_sh_info[];
  25. extern char ml_sz_info[];
  26. extern char ml_sh_now[];
  27. extern char ml_sz_now[];
  28. extern char ml_sh_pyjc[];
  29. extern char ml_sz_pyjc[];
  30. extern char ml_sh_trace[];
  31. extern char ml_sz_trace[];
  32. extern char ml_sh_minute[];
  33. extern char ml_sz_minute[];
  34. extern char ml_data[];
  35. extern char ml_sh[];
  36. extern char ml_sz[];
  37. extern char ml_base[];
  38. extern char ml_month[];
  39. extern char ml_week[];
  40. extern char ml_day[];
  41. extern char ml_min5[];
  42. extern char ml_sh_base[];
  43. extern char ml_sz_base[];
  44. extern char ml_sh_month[];
  45. extern char ml_sz_month[];
  46. extern char ml_sh_week[];
  47. extern char ml_sz_week[];
  48. extern char ml_sh_day[];
  49. extern char ml_sz_day[];
  50. extern char ml_sh_min[];
  51. extern char ml_sz_min[];
  52. extern char ml_ext_base[];
  53. extern char ml_ext_month[];
  54. extern char ml_ext_week[];
  55. extern char ml_ext_day[];
  56. extern char ml_ext_min5[];
  57. char self_ext_xdr[] = ".dat";
  58. char self_sh_xdr[] = "data\shase\xdrdata\";
  59. char self_sz_xdr[] = "data\sznse\xdrdata\";
  60. char self_news[] = "data\news\";
  61. char self_chna_xdr[] = "data\CHNA.pwr"; // 除权文件,与分析家格式相同
  62. char self_chna_basetbl[]= "data\CHNA.bst"; // 财务资料表
  63. // 代码表文件
  64. char self_sh_code[] = "data\SHSE.cod"; // 上海代码表
  65. char self_sz_code[] = "data\SZSE.cod"; // 深圳代码表
  66. // 行情缓存文件
  67. char self_sh_report[] = "dat\SHSE.rpt"; // 上海行情保存文件
  68. char self_sz_report[] = "dat\SZSE.rpt"; // 深圳行情保存文件
  69. char self_sh_minute[] = "dat\SHSE.min"; // 上海分时保存文件
  70. char self_sz_minute[] = "dat\SZSE.min"; // 深圳分时保存文件
  71. char self_outline[] = "dat\clkoutln.out";
  72. /////////////////////////////////////////////////////////////////////////////////////
  73. // SelfDB convertor
  74. BOOL convert_CLK_DRDATA_to_DRDATA( DWORD dwMarket, const char *szCode, CLK_DRDATA * pdbdr, DRDATA * pdr )
  75. {
  76. SP_ASSERT( pdbdr && pdr );
  77. if( NULL == pdbdr || NULL == pdr )
  78. return FALSE;
  79. memset( pdr, 0, sizeof(DRDATA) );
  80. pdr->m_dwMarket = dwMarket;
  81. if( szCode )
  82. strncpy( pdr->m_szCode, szCode, min(sizeof(pdr->m_szCode)-1,strlen(szCode)) );
  83. pdr->m_date = pdbdr->date;
  84. CSPTime sptime;
  85. if( sptime.FromStockTimeDay(pdr->m_date) )
  86. pdr->m_time = sptime.GetTime();
  87. pdr->m_fProfit = (float)( pdbdr->bonus * 0.0001 );
  88. pdr->m_fGive = (float)( pdbdr->bonus_share * 0.001 );
  89. pdr->m_fPei = (float)( pdbdr->ration_share * 0.001 );
  90. pdr->m_fPeiPrice= (float)( pdbdr->ration_value * 0.001 );
  91. return TRUE;
  92. }
  93. BOOL convert_DRDATA_to_CLK_DRDATA( DRDATA * pdr, CLK_DRDATA * pdbdr )
  94. {
  95. SP_ASSERT( pdbdr && pdr );
  96. if( NULL == pdbdr || NULL == pdr )
  97. return FALSE;
  98. memset( pdbdr, 0, sizeof(CLK_DRDATA) );
  99. pdbdr->date = pdr->m_date;
  100. pdbdr->bonus = (DWORD)( pdr->m_fProfit * 10000 );
  101. pdbdr->bonus_share = (DWORD)( pdr->m_fGive * 1000 );
  102. pdbdr->ration_share = (DWORD)( pdr->m_fPei * 1000 );
  103. pdbdr->ration_value = (DWORD)( pdr->m_fPeiPrice * 1000 );
  104. return TRUE;
  105. }
  106. BOOL convert_FXJ_DRDATA_to_DRDATA( DWORD dwMarket, const char *szCode, FXJ_DRDATA * pfxjdr, DRDATA * pdr )
  107. {
  108. SP_ASSERT( pfxjdr && pdr );
  109. if( NULL == pfxjdr || NULL == pdr )
  110. return FALSE;
  111. memset( pdr, 0, sizeof(DRDATA) );
  112. pdr->m_dwMarket = dwMarket;
  113. if( szCode )
  114. strncpy( pdr->m_szCode, szCode, min(sizeof(pdr->m_szCode)-1,strlen(szCode)) );
  115. pdr->m_time = pfxjdr->m_time;
  116. CSPTime sptime( pdr->m_time );
  117. pdr->m_date = sptime.ToStockTimeDay();
  118. pdr->m_fProfit = pfxjdr->m_fProfit;
  119. pdr->m_fGive = pfxjdr->m_fGive;
  120. pdr->m_fPei = pfxjdr->m_fPei;
  121. pdr->m_fPeiPrice= pfxjdr->m_fPeiPrice;
  122. return TRUE;
  123. }
  124. double StringToDouble( const char *sz, int nLen )
  125. {
  126. char szTemp[32];
  127. if( NULL == sz || nLen >= sizeof(szTemp) )
  128. {
  129. SP_ASSERT( FALSE );
  130. return 0;
  131. }
  132. memset( szTemp, 0, sizeof(szTemp) );
  133. memcpy( szTemp, sz, nLen );
  134. int nPos = 0;
  135. while( isspace(szTemp[nPos]) && nPos < nLen )
  136. nPos ++;
  137. if( nPos == nLen )
  138. return 0;
  139. return atof( &szTemp[nPos] );
  140. }
  141. BOOL convert_TDX_BASEDATA_to_BASEDATA( TDX_BASEDATA * ptdxbd, BASEDATA *pbd )
  142. {
  143. SP_ASSERT( ptdxbd && pbd );
  144. if( NULL == ptdxbd || NULL == pbd )
  145. return FALSE;
  146. memset( pbd, 0, sizeof(BASEDATA) );
  147. pbd->m_dwMarket = CStock::marketCHNA;
  148. strncpy( pbd->m_szCode, ptdxbd->m_szCode, min(sizeof(pbd->m_szCode)-1,sizeof(ptdxbd->m_szCode)) );
  149. CStockInfo info;
  150. if( AfxGetStockContainer().GetStockInfo( pbd->m_szCode, &info ) )
  151. {
  152. int nSize = info.m_basedata.GetSize();
  153. if( nSize > 0 )
  154. memcpy( pbd, &(info.m_basedata.ElementAt(nSize-1)), sizeof(BASEDATA) );
  155. pbd->m_dwMarket = info.GetMarket();
  156. }
  157. // char m_szDomain[STKLIB_MAX_DOMAIN]; // 板块
  158. // char m_szProvince[STKLIB_MAX_PROVINCE]; // 省份
  159. if( '0' == ptdxbd->m_szMarket )
  160. pbd->m_dwMarket = CStock::marketSZSE;
  161. else if( '1' == ptdxbd->m_szMarket )
  162. pbd->m_dwMarket = CStock::marketSHSE;
  163. pbd->m_date = (DWORD)StringToDouble( ptdxbd->m_szDate_modified, sizeof(ptdxbd->m_szDate_modified) );
  164. pbd->m_reporttype = CStock::reportAnnals; // 报告类型:年报、中报、季报
  165. CSPTime sptime;
  166. if( sptime.FromStockTimeDay( pbd->m_date ) )
  167. {
  168. pbd->m_time = sptime.GetTime();
  169. int nMonth = sptime.GetMonth();
  170. if( nMonth >= 4 && nMonth <= 6 )
  171. pbd->m_reporttype = CStock::reportQuarter;
  172. else if( nMonth >= 7 && nMonth <= 9 )
  173. pbd->m_reporttype = CStock::reportMid;
  174. else if( nMonth >= 10 && nMonth <= 12 )
  175. pbd->m_reporttype = CStock::reportQuarter3;
  176. }
  177. // float m_fErate_dollar; // 当期美元汇率
  178. // float m_fErate_hkdollar; // 当期港币汇率
  179. // ★偿债能力
  180. // float m_fRatio_liquidity; // 流动比率
  181. // float m_fRatio_quick; // 速动比率
  182. // float m_fVelocity_receivables; // 应收帐款周率
  183. // ★经营能力
  184. // float m_fVelocity_merchandise; // 存货周转率
  185. pbd->m_fMain_income = (float)StringToDouble( ptdxbd->m_szMain_income, sizeof(ptdxbd->m_szMain_income) ) * 1000;
  186. // float m_fCash_ps; // 每股净现金流量
  187. // ★资本结构
  188. pbd->m_datebegin = (DWORD)StringToDouble( ptdxbd->m_szDate_begin, sizeof(ptdxbd->m_szDate_begin) );
  189. pbd->m_fShare_count_total = (float)StringToDouble( ptdxbd->m_szShare_count_total, sizeof(ptdxbd->m_szShare_count_total) ) * 10000;
  190. pbd->m_fShare_count_a = (float)StringToDouble( ptdxbd->m_szShare_count_currency, sizeof(ptdxbd->m_szShare_count_currency) ) * 10000;
  191. pbd->m_fShare_count_b = (float)StringToDouble( ptdxbd->m_szShare_count_b, sizeof(ptdxbd->m_szShare_count_b) ) * 10000;
  192. pbd->m_fShare_count_h = (float)StringToDouble( ptdxbd->m_szShare_count_h, sizeof(ptdxbd->m_szShare_count_h) ) * 10000;
  193. pbd->m_fShare_count_national= (float)StringToDouble( ptdxbd->m_szShare_count_national, sizeof(ptdxbd->m_szShare_count_national) ) * 10000;
  194. pbd->m_fShare_count_corp = (float)StringToDouble( ptdxbd->m_szShare_count_corp, sizeof(ptdxbd->m_szShare_count_corp) ) * 10000;
  195. if( CStock::typeshB == info.GetType() || CStock::typeszB == info.GetType() ) // A B股 交换
  196. {
  197. float fTemp = pbd->m_fShare_count_a;
  198. pbd->m_fShare_count_a = pbd->m_fShare_count_b;
  199. pbd->m_fShare_count_b = fTemp;
  200. }
  201. if( pbd->m_fShare_count_total > 1e-4 )
  202. pbd->m_fProfit_psud = (float)StringToDouble( ptdxbd->m_szProfit_ud, sizeof(ptdxbd->m_szProfit_ud) ) * 1000 / pbd->m_fShare_count_total;
  203. pbd->m_fAsset = (float)StringToDouble( ptdxbd->m_szAsset, sizeof(ptdxbd->m_szAsset) ) * 1000;
  204. if( pbd->m_fAsset > 1e-4 )
  205. {
  206. pbd->m_fRatio_holderright= (float)( 100 * StringToDouble( ptdxbd->m_szNet_asset, sizeof(ptdxbd->m_szNet_asset) ) * 1000 / pbd->m_fAsset );
  207. pbd->m_fRatio_longdebt = (float)( 100 * StringToDouble( ptdxbd->m_szDebt_long, sizeof(ptdxbd->m_szDebt_long) ) * 1000 / pbd->m_fAsset );
  208. pbd->m_fRatio_debt = (float)( 100 * ( StringToDouble( ptdxbd->m_szDebt_long, sizeof(ptdxbd->m_szDebt_long) ) * 1000 / pbd->m_fAsset
  209. + StringToDouble( ptdxbd->m_szDebt_long, sizeof(ptdxbd->m_szDebt_long) ) * 1000 / pbd->m_fAsset ) );
  210. }
  211. // ★投资收益能力
  212. pbd->m_fNetasset_ps_regulate= (float)StringToDouble( ptdxbd->m_szNet_asset_ps_regulate, sizeof(ptdxbd->m_szNet_asset_ps_regulate) );
  213. if( pbd->m_fShare_count_total > 1e-4 )
  214. {
  215. pbd->m_fNetasset_ps = (float)StringToDouble( ptdxbd->m_szNet_asset, sizeof(ptdxbd->m_szNet_asset) ) * 1000 / pbd->m_fShare_count_total;
  216. pbd->m_fEps = (float)StringToDouble( ptdxbd->m_szNet_profit, sizeof(ptdxbd->m_szNet_profit) ) * 1000 / pbd->m_fShare_count_total;
  217. pbd->m_fEps_deduct = (float)( pbd->m_fEps - StringToDouble( ptdxbd->m_szOut_profit, sizeof(ptdxbd->m_szOut_profit) ) * 1000 / pbd->m_fShare_count_total );
  218. }
  219. pbd->m_fNet_profit = (float)StringToDouble( ptdxbd->m_szNet_profit, sizeof(ptdxbd->m_szNet_profit) ) * 1000;
  220. pbd->m_fMain_profit = (float)StringToDouble( ptdxbd->m_szMain_profit, sizeof(ptdxbd->m_szMain_profit) ) * 1000;
  221. pbd->m_fTotal_profit = (float)StringToDouble( ptdxbd->m_szTotal_profit, sizeof(ptdxbd->m_szTotal_profit) ) * 1000;
  222. // ★盈利能力
  223. if( pbd->m_fMain_income > 1e-4 )
  224. pbd->m_fProfit_margin = (float)( 100 * pbd->m_fMain_profit / pbd->m_fMain_income );
  225. if( pbd->m_fNetasset_ps > 1e-4 )
  226. pbd->m_fNetasset_yield = (float)( 100 * pbd->m_fEps / pbd->m_fNetasset_ps );
  227. return TRUE;
  228. }
  229. BOOL convert_FXJ_BASEDATA_to_BASEDATA( FXJ_BASEDATA * pfxjbd, BASEDATA *pbd, DWORD dwDate )
  230. {
  231. SP_ASSERT( pfxjbd && pbd );
  232. if( NULL == pfxjbd || NULL == pbd )
  233. return FALSE;
  234. memset( pbd, 0, sizeof(BASEDATA) );
  235. pbd->m_dwMarket = CStock::marketCHNA;
  236. strncpy( pbd->m_szCode, pfxjbd->m_szCode, min(sizeof(pbd->m_szCode)-1,sizeof(pfxjbd->m_szCode)) );
  237. CStockInfo info;
  238. if( AfxGetStockContainer().GetStockInfo( pbd->m_szCode, &info ) )
  239. {
  240. int nSize = info.m_basedata.GetSize();
  241. if( nSize > 0 )
  242. memcpy( pbd, &(info.m_basedata.ElementAt(nSize-1)), sizeof(BASEDATA) );
  243. pbd->m_dwMarket = info.GetMarket();
  244. }
  245. // char m_szDomain[STKLIB_MAX_DOMAIN]; // 板块
  246. // char m_szProvince[STKLIB_MAX_PROVINCE]; // 省份
  247. if( 'ZS' == pfxjbd->m_wMarket )
  248. pbd->m_dwMarket = CStock::marketSZSE;
  249. else if( 'HS' == pfxjbd->m_wMarket )
  250. pbd->m_dwMarket = CStock::marketSHSE;
  251. pbd->m_date = dwDate;
  252. pbd->m_reporttype = CStock::reportAnnals; // 报告类型:年报、中报、季报
  253. CSPTime sptime;
  254. if( sptime.FromStockTimeDay( pbd->m_date ) )
  255. {
  256. pbd->m_time = sptime.GetTime();
  257. int nMonth = sptime.GetMonth();
  258. if( nMonth >= 4 && nMonth <= 6 )
  259. pbd->m_reporttype = CStock::reportQuarter;
  260. else if( nMonth >= 7 && nMonth <= 9 )
  261. pbd->m_reporttype = CStock::reportMid;
  262. else if( nMonth >= 10 && nMonth <= 12 )
  263. pbd->m_reporttype = CStock::reportQuarter3;
  264. }
  265. // float m_fErate_dollar; // 当期美元汇率
  266. // float m_fErate_hkdollar; // 当期港币汇率
  267. // ★偿债能力
  268. // float m_fRatio_liquidity; // 流动比率
  269. // float m_fRatio_quick; // 速动比率
  270. // float m_fVelocity_receivables; // 应收帐款周率
  271. // ★经营能力
  272. // float m_fVelocity_merchandise; // 存货周转率
  273. pbd->m_fMain_income = pfxjbd->m_fData[21]*1000;
  274. // float m_fCash_ps; // 每股净现金流量
  275. // ★盈利能力
  276. if( pbd->m_fMain_income > 1e-4 )
  277. pbd->m_fProfit_margin = (float)( 100 * pfxjbd->m_fData[22]*1000 / pbd->m_fMain_income );
  278. pbd->m_fNetasset_yield = pfxjbd->m_fData[38];
  279. // ★资本结构
  280. // DWORD m_datebegin // 上市日期
  281. pbd->m_fShare_count_total = pfxjbd->m_fData[2]*10000;
  282. pbd->m_fShare_count_a = pfxjbd->m_fData[8]*10000;
  283. pbd->m_fShare_count_b = pfxjbd->m_fData[6]*10000;
  284. pbd->m_fShare_count_h = pfxjbd->m_fData[7]*10000;
  285. pbd->m_fShare_count_national= pfxjbd->m_fData[3]*10000;
  286. pbd->m_fShare_count_corp = pfxjbd->m_fData[5]*10000;
  287. // if( CStock::typeshB == info.GetType() || CStock::typeszB == info.GetType() ) // A B股 交换
  288. // {
  289. // float fTemp = pbd->m_fShare_count_a;
  290. // pbd->m_fShare_count_a = pbd->m_fShare_count_b;
  291. // pbd->m_fShare_count_b = fTemp;
  292. // }
  293. pbd->m_fProfit_psud = pfxjbd->m_fData[33];
  294. pbd->m_fAsset = pfxjbd->m_fData[11]*1000;
  295. pbd->m_fRatio_holderright = pfxjbd->m_fData[37];
  296. if( pbd->m_fAsset > 1e-4 )
  297. pbd->m_fRatio_longdebt = (float)( 100 * pfxjbd->m_fData[17] * 1000 / pbd->m_fAsset );
  298. pbd->m_fRatio_debt = 100 - pbd->m_fRatio_holderright;
  299. // ★投资收益能力
  300. pbd->m_fNetasset_ps = pfxjbd->m_fData[35];
  301. pbd->m_fNetasset_ps_regulate= pfxjbd->m_fData[36];
  302. pbd->m_fEps = pfxjbd->m_fData[34];
  303. if( pbd->m_fShare_count_total > 1e-4 )
  304. pbd->m_fEps_deduct = (float)( pbd->m_fEps - pfxjbd->m_fData[25] * 1000 / pbd->m_fShare_count_total );
  305. pbd->m_fNet_profit = pfxjbd->m_fData[31]*1000;
  306. pbd->m_fMain_profit = pfxjbd->m_fData[22]*1000;
  307. pbd->m_fTotal_profit = pfxjbd->m_fData[29]*1000;
  308. return TRUE;
  309. }
  310. /////////////////////////////////////////////////////////////////////////////////////
  311. // class CClkFile
  312. CClkFile::CClkFile( )
  313. {
  314. Close( );
  315. }
  316. CClkFile::~CClkFile( )
  317. {
  318. Close( );
  319. }
  320. BOOL CClkFile::Open( LPCTSTR lpszFileName )
  321. {
  322. Close( );
  323. if( !m_file.Open( lpszFileName, CSPFile::modeReadWrite ) )
  324. return FALSE;
  325. if( sizeof(m_header) != m_file.Read( &m_header, sizeof(m_header) ) )
  326. {
  327. SP_ASSERT( FALSE );
  328. return FALSE;
  329. }
  330. if( CLK_FHEADER_MAGIC != m_header.m_dwMagic )
  331. {
  332. SP_ASSERT( FALSE );
  333. return FALSE;
  334. }
  335. return TRUE;
  336. }
  337. void CClkFile::Close( )
  338. {
  339. if( m_file.m_hFile != (UINT)CSPFile::hFileNull )
  340. {
  341. m_header.m_time = time(NULL);
  342. m_file.Seek( 0, CSPFile::begin );
  343. m_file.Write( &m_header, sizeof(m_header) );
  344. m_file.Close();
  345. }
  346. memset( &m_header, 0, sizeof(m_header) );
  347. memset( &m_CurIndexRecord, 0, sizeof(m_CurIndexRecord) );
  348. m_dwPosCurIndex = -1;
  349. }
  350. // 创建空的数据文件
  351. BOOL CClkFile::BuildEmptyFile( LPCTSTR lpszFileName,
  352. DWORD dwDataType, // 数据分类说明,see CStock::DataType
  353. DWORD dwMarket, // 市场,see CStock::StockMarket,如果文件包含多个市场,则=0无效
  354. DWORD dwIndexRecordCount, // 索引区记录单元个数
  355. DWORD dwRecordPerBlock, // 每个Block的记录数
  356. BOOL bRebuildIfExists )
  357. {
  358. SP_ASSERT( NULL != lpszFileName && strlen(lpszFileName) > 0 );
  359. if( NULL == lpszFileName || strlen(lpszFileName) <= 0 )
  360. return FALSE;
  361. // 如果文件存在
  362. if( !bRebuildIfExists && 0 == access(lpszFileName,0) )
  363. return TRUE;
  364. CLK_FHEADER header;
  365. memset( &header, 0,sizeof(header) );
  366. header.m_dwMagic = CLK_FHEADER_MAGIC;
  367. header.m_dwVerMajor = CLK_FHEADER_VERMAJOR;
  368. header.m_dwVerMinor = CLK_FHEADER_VERMINOR;
  369. strcpy( header.m_szDescript, "CLKing Stock File Structure. See www.ninebulls.com for more information." );
  370. header.m_dwDataType = dwDataType;
  371. header.m_dwMarket = dwMarket;
  372. header.m_time = time(NULL);
  373. // 索引区信息
  374. header.m_dwPosFirstIndex = sizeof(header);
  375. header.m_dwIndexRecordSize = sizeof(CLK_INDEXRECORD);
  376. header.m_dwIndexRecordCount = dwIndexRecordCount;
  377. header.m_dwStockCount = 0;
  378. // 数据区信息
  379. switch( dwDataType )
  380. {
  381. case CStock::dataReport:
  382. header.m_dwDataRecordSize = sizeof(REPORT);
  383. break;
  384. case CStock::dataMinute:
  385. header.m_dwDataRecordSize = sizeof(MINUTE);
  386. break;
  387. case CStock::dataK:
  388. header.m_dwDataRecordSize = sizeof(KDATA);
  389. default:
  390. SP_ASSERT(FALSE);
  391. return FALSE;
  392. }
  393. header.m_dwRecordPerBlock = dwRecordPerBlock;
  394. header.m_dwBlockSize = sizeof(CLK_BLOCKHEADER) + header.m_dwDataRecordSize * header.m_dwRecordPerBlock;
  395. header.m_dwPosFirstBlock = sizeof(CLK_FHEADER) + header.m_dwIndexRecordSize * header.m_dwIndexRecordCount;
  396. header.m_dwPosFirstBlankBlock = -1;
  397. CSPFile file;
  398. if( !file.Open( lpszFileName, CSPFile::modeCreate | CSPFile::modeReadWrite ) )
  399. {
  400. SP_ASSERT( FALSE );
  401. return FALSE;
  402. }
  403. file.Write( &header, sizeof(header) );
  404. for( DWORD i=0; i<header.m_dwIndexRecordCount; i++ )
  405. {
  406. CLK_INDEXRECORD index;
  407. memset( &index, 0, sizeof(index) );
  408. index.m_dwMagic = CLK_INDEXRECORD_MAGIC;
  409. index.m_dwPosFirstBlock = -1;
  410. file.Write( &index, sizeof(index) );
  411. }
  412. file.Flush();
  413. return TRUE;
  414. }
  415. // 重新创建,如果日期不是tmNow
  416. BOOL CClkFile::RemoveFileIfOutoftime( LPCTSTR lpszFileName, time_t tmNow )
  417. {
  418. SP_ASSERT( NULL!=lpszFileName && strlen(lpszFileName) > 0 );
  419. if( NULL==lpszFileName || strlen(lpszFileName) <= 0 )
  420. return FALSE;
  421. CClkFile file;
  422. if( file.Open(lpszFileName) )
  423. {
  424. CSPTime ft( file.m_header.m_time );
  425. CSPTime tNow( tmNow );
  426. if( CLK_FHEADER_VERMAJOR == file.m_header.m_dwVerMajor 
  427. && CLK_FHEADER_VERMINOR == file.m_header.m_dwVerMinor ) // 版本相同
  428. {
  429. if( ft.GetYear() == tNow.GetYear() && ft.GetMonth() == tNow.GetMonth() && ft.GetDay() == tNow.GetDay() )
  430. return FALSE;
  431. int nDayOfWeek = tNow.GetDayOfWeek();
  432. if( 1 == nDayOfWeek || 7 == nDayOfWeek )
  433. return FALSE;
  434. BOOL bEmpty = FALSE; // file.EmptyAll( );
  435. file.Close();
  436. if( !bEmpty )
  437. return ::DeleteFile( lpszFileName );
  438. return TRUE;
  439. }
  440. else
  441. {
  442. file.Close();
  443. return ::DeleteFile( lpszFileName );
  444. }
  445. }
  446. return FALSE;
  447. }
  448. static CSPMutex g_mutexClkFile;
  449. BOOL CClkFile::EmptyAll( )
  450. {
  451. CSPMutex::Scoped locker(g_mutexClkFile);
  452. SP_ASSERT( CSPFile::hFileNull != m_file.m_hFile );
  453. if( CSPFile::hFileNull == m_file.m_hFile )
  454. return FALSE;
  455. // 顺序寻找
  456. DWORD dwCount = 0;
  457. for( DWORD i=0; i<m_header.m_dwIndexRecordCount; i++ )
  458. {
  459. DWORD dwPosIndex = m_header.m_dwPosFirstIndex + m_header.m_dwIndexRecordSize * i;
  460. if( m_file.GetPosition() != dwPosIndex )
  461. m_file.Seek( dwPosIndex, CSPFile::begin );
  462. CLK_INDEXRECORD index;
  463. if( sizeof(index) != m_file.Read(&index,sizeof(index)) )
  464. return FALSE;
  465. if( CLK_INDEXRECORD_MAGIC != index.m_dwMagic )
  466. return FALSE;
  467. if( strlen(index.m_szCode) <= 0 )
  468. continue;
  469. EmptyBlockChain( index.m_dwPosFirstBlock );
  470. index.m_dwDataRecordCountTotal = 0;
  471. m_file.Seek( dwPosIndex, CSPFile::begin );
  472. m_file.Write( &index, sizeof(index) );
  473. dwCount ++;
  474. }
  475. m_file.Flush();
  476. SP_ASSERT( dwCount == m_header.m_dwStockCount );
  477. return dwCount > 0; // == m_header.m_dwStockCount;
  478. }
  479. // 保存数据,并修改相应索引信息
  480. DWORD CClkFile::StoreDataRecord(DWORD dwMarket, const char * szCode,
  481. void * pData, DWORD dwDataElementSize, DWORD dwDataElementCount,
  482. BOOL bOverWrite ) // 返回成功保存记录数
  483. {
  484. CSPMutex::Scoped locker(g_mutexClkFile);
  485. SP_ASSERT( CSPFile::hFileNull != m_file.m_hFile );
  486. if( CSPFile::hFileNull == m_file.m_hFile )
  487. return 0;
  488. CLK_INDEXRECORD index;
  489. DWORD dwPosIndexFind = -1;
  490. if( !GetDataInfo( dwMarket, szCode, index, dwPosIndexFind, TRUE ) )
  491. return 0;
  492. if( bOverWrite )
  493. {
  494. EmptyBlockChain( index.m_dwPosFirstBlock );
  495. index.m_dwDataRecordCountTotal = 0;
  496. }
  497. if( -1 == index.m_dwPosFirstBlock || 0 == index.m_dwPosFirstBlock )
  498. index.m_dwPosFirstBlock = GetFirstBlankBlockPos( TRUE, TRUE );
  499. DWORD dwCount = WriteData( index.m_dwPosFirstBlock, pData, dwDataElementSize, dwDataElementCount, FALSE );
  500. index.m_dwDataRecordCountTotal += dwCount;
  501. SetDataInfo( dwPosIndexFind, index, FALSE );
  502. // m_file.Flush();
  503. return dwCount;
  504. }
  505. // 得到某一股票的数据记录数
  506. DWORD CClkFile::GetDataRecordCount( DWORD dwMarket, const char * szCode )
  507. {
  508. CSPMutex::Scoped locker(g_mutexClkFile);
  509. CLK_INDEXRECORD index;
  510. DWORD dwPosIndexFind = -1;
  511. if( GetDataInfo( dwMarket, szCode, index, dwPosIndexFind, FALSE ) )
  512. return index.m_dwDataRecordCountTotal;
  513. return 0;
  514. }
  515. // 读取某一股票的数据记录
  516. DWORD CClkFile::LoadDataRecord( DWORD dwMarket, const char * szCode,
  517. void * pData, DWORD dwDataElementSize, DWORD dwMaxDataElement )// 返回成功读取记录数
  518. {
  519. CSPMutex::Scoped locker(g_mutexClkFile);
  520. SP_ASSERT( CSPFile::hFileNull != m_file.m_hFile );
  521. if( CSPFile::hFileNull == m_file.m_hFile )
  522. return 0;
  523. CLK_INDEXRECORD index;
  524. DWORD dwPosIndexFind = -1;
  525. if( !GetDataInfo( dwMarket, szCode, index, dwPosIndexFind, FALSE ) )
  526. return 0;
  527. if( dwMaxDataElement < index.m_dwDataRecordCountTotal )
  528. return 0;
  529. return ReadData( index.m_dwPosFirstBlock, pData, dwDataElementSize, dwMaxDataElement );
  530. }
  531. DWORD CClkFile::Hash( LPCTSTR key, DWORD dwMax )
  532. {
  533. DWORD dwHash = 0;
  534. while (*key)
  535. dwHash = (dwHash<<5) + dwHash + *key++;
  536. return dwHash % dwMax;
  537. }
  538. // 得到某一股票的索引区信息,如果bAddIfNotExists并且不存在,则添加
  539. BOOL CClkFile::GetDataInfo( DWORD dwMarket, const char * szCode, CLK_INDEXRECORD & idxRet, DWORD & dwPosIndexFind, BOOL bAddIfNotExists )
  540. {
  541. SP_ASSERT( CSPFile::hFileNull != m_file.m_hFile );
  542. if( CSPFile::hFileNull == m_file.m_hFile )
  543. return FALSE;
  544. // 是否当前Cache
  545. if( m_CurIndexRecord.m_dwMarket == dwMarket
  546. && 0 == strcmp( m_CurIndexRecord.m_szCode, szCode ) )
  547. {
  548. idxRet = m_CurIndexRecord;
  549. dwPosIndexFind = m_dwPosCurIndex;
  550. return TRUE;
  551. }
  552. DWORD posBegin = Hash( szCode, m_header.m_dwIndexRecordCount );
  553. // Hash顺序寻找
  554. for( DWORD i=posBegin; i<m_header.m_dwIndexRecordCount; i++ )
  555. {
  556. DWORD dwPosIndex = m_header.m_dwPosFirstIndex + m_header.m_dwIndexRecordSize * i;
  557. if( m_file.GetPosition() != dwPosIndex )
  558. m_file.Seek( dwPosIndex, CSPFile::begin );
  559. CLK_INDEXRECORD index;
  560. if( sizeof(index) != m_file.Read(&index,sizeof(index))
  561. || CLK_INDEXRECORD_MAGIC != index.m_dwMagic )
  562. {
  563. SP_ASSERT( FALSE );
  564. return FALSE;
  565. }
  566. if( dwMarket == index.m_dwMarket
  567. && 0 == strcmp( szCode, index.m_szCode ) )
  568. {
  569. idxRet = index;
  570. dwPosIndexFind = dwPosIndex;
  571. m_CurIndexRecord = index;
  572. m_dwPosCurIndex = dwPosIndex;
  573. return TRUE;
  574. }
  575. if( 0 == strlen(index.m_szCode) )
  576. {
  577. if( bAddIfNotExists )
  578. {
  579. index.m_dwMarket = dwMarket;
  580. strncpy( index.m_szCode, szCode, min(sizeof(index.m_szCode)-1,strlen(szCode)) );
  581. index.m_dwDataRecordCountTotal = 0;
  582. index.m_dwPosFirstBlock = GetFirstBlankBlockPos( TRUE, TRUE );
  583. m_file.Seek( dwPosIndex, CSPFile::begin );
  584. m_file.Write( &index, sizeof(index) );
  585. // 文件头
  586. m_header.m_dwStockCount += 1;
  587. m_file.Seek( 0, CSPFile::begin );
  588. m_file.Write( &m_header, sizeof(m_header) );
  589. // m_file.Flush();
  590. // return
  591. idxRet = index;
  592. dwPosIndexFind = dwPosIndex;
  593. m_CurIndexRecord = index;
  594. m_dwPosCurIndex = dwPosIndex;
  595. return TRUE;
  596. }
  597. return FALSE;
  598. }
  599. // 循环
  600. if( m_header.m_dwIndexRecordCount-1 == i )
  601. i = -1;
  602. if( posBegin-1 == i )
  603. break;
  604. }
  605. return FALSE;
  606. }
  607. // 保存某一股票的索引区信息
  608. BOOL CClkFile::SetDataInfo( DWORD dwPosIndex, CLK_INDEXRECORD idx, BOOL bFlush )
  609. {
  610. SP_ASSERT( CSPFile::hFileNull != m_file.m_hFile );
  611. if( CSPFile::hFileNull == m_file.m_hFile )
  612. return FALSE;
  613. // 是否当前Cache
  614. if( m_CurIndexRecord.m_dwMarket == idx.m_dwMarket
  615. && 0 == strcmp( m_CurIndexRecord.m_szCode, idx.m_szCode ) )
  616. {
  617. m_CurIndexRecord = idx;
  618. }
  619. if( -1 != dwPosIndex )
  620. {
  621. m_file.Seek( dwPosIndex, CSPFile::begin );
  622. m_file.Write( &idx, sizeof(idx) );
  623. if( bFlush )
  624. m_file.Flush();
  625. return TRUE;
  626. }
  627. return FALSE;
  628. }
  629. // 得到某一空数据块
  630. DWORD CClkFile::GetFirstBlankBlockPos( BOOL bAddIfNotExists, BOOL bUseIt )
  631. {
  632. SP_ASSERT( CSPFile::hFileNull != m_file.m_hFile );
  633. if( CSPFile::hFileNull == m_file.m_hFile )
  634. return -1;
  635. DWORD dwPosBlock = m_header.m_dwPosFirstBlankBlock;
  636. if( -1 != dwPosBlock && 0 != dwPosBlock )
  637. {
  638. m_file.Seek( dwPosBlock, CSPFile::begin );
  639. CLK_BLOCKHEADER bheader;
  640. if( sizeof(bheader) == m_file.Read(&bheader,sizeof(bheader)) )
  641. {
  642. SP_ASSERT( CLK_BLOCKHEADER_MAGIC == bheader.m_dwMagic );
  643. SP_ASSERT( !bheader.m_bUsed );
  644. if( bUseIt )
  645. {
  646. bheader.m_bUsed = bUseIt;
  647. bheader.m_dwDataRecordCount = 0;
  648. bheader.m_dwPosNextBlock = -1;
  649. m_file.Seek( dwPosBlock, CSPFile::begin );
  650. m_file.Write( &bheader, sizeof(bheader) );
  651. m_header.m_dwPosFirstBlankBlock = bheader.m_dwPosNextBlock;
  652. m_file.Seek( 0, CSPFile::begin );
  653. m_file.Write( &m_header, sizeof(m_header) );
  654. // m_file.Flush();
  655. }
  656. return dwPosBlock;
  657. }
  658. }
  659. // Add
  660. if( bAddIfNotExists )
  661. {
  662. SP_ASSERT( bUseIt ); // Must Use It
  663. DWORD dwDataSize = m_header.m_dwDataRecordSize*m_header.m_dwRecordPerBlock;
  664. if( dwDataSize <= 0 )
  665. return -1;
  666. m_file.SeekToEnd( );
  667. dwPosBlock = m_file.GetPosition();
  668. CLK_BLOCKHEADER bheader;
  669. memset( &bheader, 0, sizeof(bheader) );
  670. bheader.m_dwMagic = CLK_BLOCKHEADER_MAGIC;
  671. bheader.m_bUsed = bUseIt;
  672. bheader.m_dwPosNextBlock = -1;
  673. bheader.m_dwPosFirstRecord = dwPosBlock + sizeof(bheader);
  674. m_file.Write( &bheader, sizeof(bheader) );
  675. char * temp = new char[dwDataSize];
  676. if( !temp )
  677. return -1;
  678. memset( temp, 0, m_header.m_dwDataRecordSize );
  679. m_file.Write( temp, dwDataSize );
  680. delete [] temp;
  681. // m_file.Flush();
  682. }
  683. return dwPosBlock;
  684. }
  685. // 清空数据Block链中的数据,并将除第一个Block外的其他Block置为未用
  686. DWORD CClkFile::EmptyBlockChain( DWORD dwPosFirstBlock )
  687. {
  688. SP_ASSERT( CSPFile::hFileNull != m_file.m_hFile );
  689. if( CSPFile::hFileNull == m_file.m_hFile )
  690. return FALSE;
  691. DWORD dwCount = 0;
  692. DWORD dwPosBlock = dwPosFirstBlock;
  693. while( -1 != dwPosBlock && 0 != dwPosBlock )
  694. {
  695. m_file.Seek( dwPosBlock, CSPFile::begin );
  696. DWORD dwPosNextBlock = -1;
  697. CLK_BLOCKHEADER bheader;
  698. if( sizeof(bheader) != m_file.Read(&bheader,sizeof(bheader))
  699. || CLK_BLOCKHEADER_MAGIC != bheader.m_dwMagic )
  700. {
  701. SP_ASSERT( FALSE );
  702. }
  703. else
  704. {
  705. dwPosNextBlock = bheader.m_dwPosNextBlock;
  706. }
  707. // Empty it
  708. bheader.m_bUsed = (dwPosFirstBlock == dwPosBlock); // 第一块继续使用
  709. bheader.m_dwDataRecordCount = 0;
  710. bheader.m_dwPosNextBlock = -1;
  711. if( !bheader.m_bUsed )
  712. bheader.m_dwPosNextBlock = m_header.m_dwPosFirstBlankBlock;
  713. m_file.Seek( dwPosBlock, CSPFile::begin );
  714. m_file.Write( &bheader, sizeof(bheader) );
  715. // 加入Blank Block Chain
  716. if( !bheader.m_bUsed )
  717. {
  718. m_header.m_dwPosFirstBlankBlock = dwPosBlock;
  719. m_file.Seek( 0, CSPFile::begin );
  720. m_file.Write( &m_header, sizeof(m_header) );
  721. }
  722. // m_file.Flush();
  723. dwCount ++;
  724. dwPosBlock = dwPosNextBlock;
  725. }
  726. return dwCount;
  727. }
  728. // 读数据记录
  729. DWORD CClkFile::ReadData( DWORD dwPosBlock, void * pData, DWORD dwDataElementSize, DWORD dwMaxDataElement )
  730. {
  731. SP_ASSERT( CSPFile::hFileNull != m_file.m_hFile );
  732. if( CSPFile::hFileNull == m_file.m_hFile )
  733. return FALSE;
  734. if( NULL == pData || dwMaxDataElement == 0 )
  735. return 0;
  736. DWORD dwCount = 0;
  737. while( -1 != dwPosBlock && 0 != dwPosBlock )
  738. {
  739. m_file.Seek( dwPosBlock, CSPFile::begin );
  740. CLK_BLOCKHEADER bheader;
  741. if( sizeof(bheader) != m_file.Read(&bheader,sizeof(bheader))
  742. || CLK_BLOCKHEADER_MAGIC != bheader.m_dwMagic )
  743. {
  744. SP_ASSERT( FALSE );
  745. return dwCount;
  746. }
  747. for( DWORD i=0; i<bheader.m_dwDataRecordCount; i++ )
  748. {
  749. DWORD dwPos = bheader.m_dwPosFirstRecord + i * m_header.m_dwDataRecordSize;
  750. if( m_file.GetPosition() != dwPos )
  751. m_file.Seek( dwPos, CSPFile::begin );
  752. m_file.Read( ((BYTE *)pData)+dwDataElementSize*dwCount, min(dwDataElementSize,m_header.m_dwDataRecordSize) );
  753. dwCount ++;
  754. if( dwCount >= dwMaxDataElement )
  755. return dwCount;
  756. }
  757. dwPosBlock = bheader.m_dwPosNextBlock;
  758. }
  759. return dwCount;
  760. }
  761. // 写数据记录
  762. DWORD CClkFile::WriteData( DWORD dwPosBlock, void * pData, DWORD dwDataElementSize, DWORD dwDataElementCount, BOOL bFlush )
  763. {
  764. SP_ASSERT( CSPFile::hFileNull != m_file.m_hFile );
  765. if( CSPFile::hFileNull == m_file.m_hFile )
  766. return 0;
  767. SP_ASSERT( -1 != dwPosBlock && 0 != dwPosBlock );
  768. if( -1 == dwPosBlock || 0 == dwPosBlock )
  769. return 0;
  770. DWORD dwCount = 0;
  771. while( dwCount < dwDataElementCount && -1 != dwPosBlock && 0 != dwPosBlock )
  772. {
  773. m_file.Seek( dwPosBlock, CSPFile::begin );
  774. CLK_BLOCKHEADER bheader;
  775. if( sizeof(bheader) != m_file.Read(&bheader,sizeof(bheader))
  776. || CLK_BLOCKHEADER_MAGIC != bheader.m_dwMagic )
  777. {
  778. SP_ASSERT( FALSE );
  779. return dwCount;
  780. }
  781. if( -1 != bheader.m_dwPosNextBlock && 0 != bheader.m_dwPosNextBlock )
  782. {
  783. SP_ASSERT( bheader.m_dwDataRecordCount == m_header.m_dwRecordPerBlock );
  784. if( bheader.m_dwDataRecordCount == m_header.m_dwRecordPerBlock )
  785. {
  786. dwPosBlock = bheader.m_dwPosNextBlock;
  787. continue;
  788. }
  789. }
  790. // Write
  791. DWORD dwCountOld = dwCount;
  792. for( DWORD i=bheader.m_dwDataRecordCount; i<m_header.m_dwRecordPerBlock; i++ )
  793. {
  794. DWORD dwPos = bheader.m_dwPosFirstRecord + i * m_header.m_dwDataRecordSize;
  795. if( m_file.GetPosition() != dwPos )
  796. m_file.Seek( dwPos, CSPFile::begin );
  797. m_file.Write( ((BYTE *)pData)+dwDataElementSize*dwCount, min(dwDataElementSize,m_header.m_dwDataRecordSize) );
  798. dwCount ++;
  799. if( dwCount >= dwDataElementCount )
  800. break;
  801. }
  802. // 修改Block Header
  803. bheader.m_bUsed = TRUE;
  804. bheader.m_dwDataRecordCount += (dwCount-dwCountOld);
  805. bheader.m_dwPosNextBlock = -1;
  806. if( dwCount < dwDataElementCount )
  807. bheader.m_dwPosNextBlock = GetFirstBlankBlockPos( TRUE, TRUE );
  808. m_file.Seek( dwPosBlock, CSPFile::begin );
  809. m_file.Write( &bheader, sizeof(bheader) );
  810. // 新Block
  811. dwPosBlock = bheader.m_dwPosNextBlock;
  812. }
  813. if( bFlush )
  814. m_file.Flush();
  815. return dwCount;
  816. }
  817. /////////////////////////////////////////////////////////////////////////////////////
  818. // class CSelfDB
  819. CSelfDB::CSelfDB( const char * rootpath, BOOL bOK )
  820. : CQianlong( rootpath, bOK )
  821. {
  822. }
  823. CSelfDB::~CSelfDB( )
  824. {
  825. }
  826. CSPString CSelfDB::GetNewsPath( DWORD dwMarket )
  827. {
  828. CSPString strPath = AfxGetProfile().GetSelfDBPath();
  829. strPath += self_news;
  830. return strPath;
  831. }
  832. CSPString CSelfDB::GetBasePath( DWORD dwMarket )
  833. {
  834. CSPString strPath = AfxGetProfile().GetSelfDBPath();
  835. switch( dwMarket )
  836. {
  837. case CStock::marketSHSE:
  838. strPath += ml_sh_base;
  839. break;
  840. case CStock::marketSZSE:
  841. strPath += ml_sz_base;
  842. break;
  843. default:
  844. strPath += ml_sh_base;
  845. SP_ASSERT( FALSE );
  846. }
  847. return strPath;
  848. }
  849. BOOL CSelfDB::CreateSelfDB( const char * rootpath )
  850. {
  851. if( NULL == rootpath || strlen(rootpath) == 0 )
  852. return FALSE;
  853. // get rootpath
  854. CSPString strRoot = rootpath;
  855. int nLen = strRoot.GetLength();
  856. if( strRoot[nLen-1] != '\' && strRoot[nLen-1] != '/' )
  857. strRoot += CHAR_DIRSEP;
  858. nLen = strRoot.GetLength();
  859. if( 0 != access( strRoot, 0 ) )
  860. return FALSE;
  861. if( 0 != access( strRoot + ml_dat, 0 ) )
  862. mkdir( strRoot + ml_dat );
  863. if( 0 != access( strRoot + ml_data, 0 ) )
  864. mkdir( strRoot + ml_data );
  865. if( 0 != access( strRoot + ml_sh, 0 ) )
  866. mkdir( strRoot + ml_sh );
  867. if( 0 != access( strRoot + ml_sh_base, 0 ) )
  868. mkdir( strRoot + ml_sh_base );
  869. if( 0 != access( strRoot + ml_sh_month, 0 ) )
  870. mkdir( strRoot + ml_sh_month );
  871. if( 0 != access( strRoot + ml_sh_week, 0 ) )
  872. mkdir( strRoot + ml_sh_week );
  873. if( 0 != access( strRoot + ml_sh_day, 0 ) )
  874. mkdir( strRoot + ml_sh_day );
  875. if( 0 != access( strRoot + ml_sh_min, 0 ) )
  876. mkdir( strRoot + ml_sh_min );
  877. if( 0 != access( strRoot + self_sh_xdr, 0 ) )
  878. mkdir( strRoot + self_sh_xdr );
  879. if( 0 != access( strRoot + ml_sz, 0 ) )
  880. mkdir( strRoot + ml_sz );
  881. if( 0 != access( strRoot + ml_sz_base, 0 ) )
  882. mkdir( strRoot + ml_sz_base );
  883. if( 0 != access( strRoot + ml_sz_month, 0 ) )
  884. mkdir( strRoot + ml_sz_month );
  885. if( 0 != access( strRoot + ml_sz_week, 0 ) )
  886. mkdir( strRoot + ml_sz_week );
  887. if( 0 != access( strRoot + ml_sz_day, 0 ) )
  888. mkdir( strRoot + ml_sz_day );
  889. if( 0 != access( strRoot + ml_sz_min, 0 ) )
  890. mkdir( strRoot + ml_sz_min );
  891. if( 0 != access( strRoot + self_sz_xdr, 0 ) )
  892. mkdir( strRoot + self_sz_xdr );
  893. if( 0 != access( strRoot + self_news, 0 ) )
  894. mkdir( strRoot + self_news );
  895. return TRUE;
  896. }
  897. int LoadCodeTable( CStockContainer & container, LPCTSTR lpszFileName, DWORD dwMarket )
  898. {
  899. int nCount = 0;
  900. char seps[]   = ",trn";
  901. char quotation_mark[] = """;
  902. BOOL bHasQuotationMark = FALSE;
  903. CSPFile file;
  904. if( file.Open( lpszFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
  905. {
  906. CSPString rString;
  907. while( file.ReadString( rString ) )
  908. {
  909. CStockInfo info;
  910. // 600000,浦发银行,17,PFYH,"PuFaYinHang"
  911. // 英文名称可以用双引号引起来
  912. int nToken = 0;
  913. while( !rString.IsEmpty() )
  914. {
  915. nToken ++;
  916. CSPString sTemp;
  917. int nIndex = -1;
  918. if( 5 == nToken && -1 != (nIndex=rString.Find( quotation_mark )) )
  919. {
  920. rString = rString.Mid( nIndex+1 );
  921. nIndex = rString.Find( quotation_mark );
  922. if( -1 != nIndex ) sTemp = rString.Left( nIndex );
  923. if( -1 != nIndex ) rString = rString.Mid( nIndex+1 );
  924. nIndex = rString.FindOneOf( seps );
  925. if( -1 != nIndex )
  926. rString = rString.Mid( nIndex+1 );
  927. else
  928. rString.Empty();
  929. }
  930. else
  931. {
  932. nIndex = rString.FindOneOf( seps );
  933. if( -1 != nIndex )
  934. {
  935. sTemp = rString.Left( nIndex );
  936. rString = rString.Mid( nIndex+1 );
  937. }
  938. else
  939. {
  940. sTemp = rString;
  941. rString.Empty();
  942. }
  943. }
  944. if( 1 == nToken )
  945. info.SetStockCode( dwMarket, sTemp );
  946. else if( 2 == nToken )
  947. info.SetStockName( sTemp );
  948. else if( 3 == nToken )
  949. info.SetType( atol(sTemp) );
  950. else if( 4 == nToken )
  951. info.SetStockShortName( sTemp );
  952. else if( 5 == nToken )
  953. {
  954. info.SetStockNameEnu( sTemp );
  955. break;
  956. }
  957. }
  958. if( info.IsValidStock() )
  959. container.Add( info );
  960. nCount ++;
  961. }
  962. file.Close();
  963. }
  964. return nCount;
  965. }
  966. int CSelfDB::LoadCodetable( CStockContainer & container )
  967. {
  968. if( !m_bIsOK ) return 0;
  969. container.SetSize( 0, 2000 );
  970. // 上海指数
  971. CSPString sFileName = GetRootPath();
  972. sFileName += self_sh_code;
  973. LoadCodeTable( container, sFileName, CStock::marketSHSE );
  974. // 深圳指数
  975. sFileName = GetRootPath();
  976. sFileName += self_sz_code;
  977. LoadCodeTable( container, sFileName, CStock::marketSZSE );
  978. if( container.GetSize() <= 0 )
  979. CQianlong::LoadCodetable( container );
  980. return container.GetSize();
  981. }
  982. int CSelfDB::StoreCodetable( CStockContainer & container )
  983. {
  984. if( !m_bIsOK ) return 0;
  985. if( container.GetSize() <= 0 )
  986. return 0;
  987. // 上海指数
  988. CSPString sFileNameSH = GetRootPath();
  989. sFileNameSH += self_sh_code;
  990. // 深圳指数
  991. CSPString sFileNameSZ = GetRootPath();
  992. sFileNameSZ += self_sz_code;
  993. CSPFile fileSHSE, fileSZSE;
  994. if( !fileSHSE.Open( sFileNameSH, CSPFile::modeCreate | CSPFile::modeWrite )
  995. || !fileSZSE.Open( sFileNameSZ, CSPFile::modeCreate | CSPFile::modeWrite ) )
  996. {
  997. return 0;
  998. }
  999. container.Lock();
  1000. for( int i=0; i<container.GetSize(); i++ )
  1001. {
  1002. CStockInfo & info = container.ElementAt(i);
  1003. CSPString str;
  1004. str.Format( "%s,%s,%d,%s,"%s"rn", info.GetStockCode(), info.GetStockNameChs(), info.GetType(),
  1005. info.GetStockShortName(), info.GetStockNameEnu() );
  1006. if( info.IsShangHai() )
  1007. {
  1008. fileSHSE.Write( str, str.GetLength() );
  1009. }
  1010. if( info.IsShenZhen() )
  1011. {
  1012. fileSZSE.Write( str, str.GetLength() );
  1013. }
  1014. }
  1015. container.UnLock();
  1016. return container.GetSize();
  1017. }
  1018. int CSelfDB::LoadKData( CStock *pstock, int nKType )
  1019. {
  1020. // WILLCHECK
  1021. int ret = CQianlong::LoadKData( pstock, nKType );
  1022. if( CKData::ktypeMin5 == nKType && LoadMinute( pstock ) > 0 )
  1023. {
  1024. CKData & kdataMin5 = pstock->GetKDataMin5();
  1025. CMinute & minute = pstock->GetMinute();
  1026. CKData kdataNew;
  1027. if( minute.ToKData( kdataNew ) && CKData::ktypeMin5 == kdataNew.GetKType() )
  1028. {
  1029. kdataMin5.MergeKData( &kdataNew );
  1030. }
  1031. return kdataMin5.GetSize();
  1032. }
  1033. return ret;
  1034. }
  1035. int CSelfDB::LoadBasetable( CStockContainer & container )
  1036. {
  1037. container.Lock();
  1038. CSPMapStringToPtr map;
  1039. map.InitHashTable( container.GetSize() + container.GetSize() + 100 );
  1040. for( int i=0; i<container.GetSize(); i++ )
  1041. {
  1042. CStockInfo & info = container.ElementAt(i);
  1043. map.SetAt( info.GetStockCode(), (void *)i );
  1044. info.m_basedata.RemoveAll();
  1045. }
  1046. CSPString sFileName = GetRootPath();
  1047. sFileName += self_chna_basetbl;
  1048. CSPFile file;
  1049. if( file.Open( sFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
  1050. {
  1051. BASEDATA block;
  1052. while( sizeof(block) == file.Read( &block, sizeof(block) ) )
  1053. {
  1054. void * pArrayID = NULL;
  1055. if( map.Lookup( block.m_szCode, pArrayID ) )
  1056. {
  1057. int nIndex = ((int)pArrayID);
  1058. if( nIndex >= 0 && nIndex < container.GetSize() )
  1059. {
  1060. container.ElementAt(nIndex).m_basedata.InsertBaseDataSort( block );
  1061. }
  1062. }
  1063. }
  1064. file.Close();
  1065. }
  1066. container.UnLock();
  1067. return container.GetSize();
  1068. }
  1069. int CSelfDB::StoreBasetable( CStockContainer & container )
  1070. {
  1071. SP_ASSERT( m_bIsOK && container.GetSize() > 0 );
  1072. if( !m_bIsOK || container.GetSize() <= 0 ) return 0;
  1073. int nCount = 0;
  1074. CSPString sRoot = GetRootPath();
  1075. CSPString sFileName = sRoot + self_chna_basetbl;
  1076. container.Lock();
  1077. CSPFile file;
  1078. if( file.Open( sFileName, CSPFile::modeWrite | CSPFile::modeCreate ) )
  1079. {
  1080. for( int i=0; i<container.GetSize(); i++ )
  1081. {
  1082. CStockInfo & info = container.ElementAt(i);
  1083. for( int k=0; k<info.m_basedata.GetSize(); k++ )
  1084. {
  1085. BASEDATA & block = info.m_basedata.ElementAt(k);
  1086. if( k == info.m_basedata.GetSize() - 1 )
  1087. {
  1088. block.m_fYield_average = info.m_fYield_average;
  1089. block.m_fYield_stddev = info.m_fYield_stddev;
  1090. block.m_fBeite = info.m_fBeite;
  1091. }
  1092. file.Write( &block, sizeof(block) );
  1093. }
  1094. nCount ++;
  1095. }
  1096. }
  1097. container.UnLock();
  1098. return nCount;
  1099. }
  1100. int CSelfDB::LoadDRData( CStock *pstock )
  1101. {
  1102. SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
  1103. if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
  1104. CSPString sFileName;
  1105. GetFileName( sFileName, CStock::dataDR, &(pstock->GetStockInfo()) );
  1106. CDRData & drdata = pstock->GetDRData();
  1107. DWORD dwMarket = pstock->GetStockInfo().GetMarket();
  1108. CSPString sCode = pstock->GetStockCode();
  1109. CSPFile file;
  1110. if( file.Open( sFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
  1111. {
  1112. DWORD dwLen = file.GetLength();
  1113. CLK_DRDATA dbdr;
  1114. int nSize = dwLen/sizeof(dbdr);
  1115. drdata.SetSize( 0, nSize );
  1116. while( sizeof(dbdr) == file.Read( &dbdr, sizeof(dbdr) ) )
  1117. {
  1118. DRDATA dr;
  1119. if( convert_CLK_DRDATA_to_DRDATA( dwMarket, sCode, &dbdr, &dr ) )
  1120. drdata.InsertDRDataSort( dr );
  1121. }
  1122. file.Close();
  1123. return drdata.GetSize();
  1124. }
  1125. // Load From FXJ_DRDATA
  1126. sFileName = GetRootPath();
  1127. sFileName += self_chna_xdr;
  1128. WORD wFxjMarket = 'HS';
  1129. if( CStock::marketSZSE == dwMarket )
  1130. wFxjMarket = 'ZS';
  1131. if( file.Open( sFileName, CSPFile::modeRead | CSPFile::shareDenyNone ) )
  1132. {
  1133. if( 8 == file.Seek( 8, CSPFile::begin ) )
  1134. {
  1135. BOOL bMy = FALSE;
  1136. FXJ_DRDATA fxjdr;
  1137. while( sizeof(fxjdr) == file.Read( &fxjdr, sizeof(fxjdr) ) )
  1138. {
  1139. BOOL bMyOld = bMy;
  1140. if( -1 == fxjdr.m_dwMagic )
  1141. bMy = ( fxjdr.m_wMarket == wFxjMarket && 0 == strncmp( sCode, fxjdr.m_szCode, min(sizeof(fxjdr.m_szCode),sCode.GetLength()) ) );
  1142. else if( bMy )
  1143. {
  1144. DRDATA dr;
  1145. if( convert_FXJ_DRDATA_to_DRDATA( dwMarket, sCode, &fxjdr, &dr ) )
  1146. drdata.InsertDRDataSort( dr );
  1147. }
  1148. if( bMyOld && !bMy )
  1149. break;
  1150. }
  1151. }
  1152. }
  1153. return drdata.GetSize();
  1154. }
  1155. int CSelfDB::StoreDRData( CStock *pstock )
  1156. {
  1157. SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
  1158. if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
  1159. CSPString sFileName;
  1160. GetFileName( sFileName, CStock::dataDR, &(pstock->GetStockInfo()) );
  1161. CDRData & drdata = pstock->GetDRData();
  1162. if( drdata.GetSize() == 0 )
  1163. {
  1164. ::DeleteFile( sFileName );
  1165. return 0;
  1166. }
  1167. // Compare
  1168. CStock stocktemp;
  1169. stocktemp.SetStockInfo( &(pstock->GetStockInfo()) );
  1170. if( LoadDRData( &stocktemp ) > 0 && stocktemp.GetDRData().IsSameAs(&drdata) )
  1171. return drdata.GetSize();
  1172. // Store
  1173. CSPFile file;
  1174. if( file.Open( sFileName, CSPFile::modeCreate | CSPFile::modeWrite | CSPFile::shareDenyNone ) )
  1175. {
  1176. for( int i=0; i<drdata.GetSize(); i++ )
  1177. {
  1178. CLK_DRDATA dbdr;
  1179. convert_DRDATA_to_CLK_DRDATA( &(drdata.ElementAt(i)), &dbdr );
  1180. file.Write( &dbdr, sizeof(dbdr) );
  1181. }
  1182. }
  1183. return drdata.GetSize();
  1184. }
  1185. DWORD ReadReport( CStock * pstock, LPCTSTR lpszFileName )
  1186. {
  1187. SP_ASSERT( pstock && pstock->GetStockInfo().IsValidStock() );
  1188. if( !pstock || !pstock->GetStockInfo().IsValidStock() )
  1189. return 0;
  1190. CReport & aReport = pstock->GetReport();
  1191. aReport.RemoveAll();
  1192. // 读取
  1193. CClkFile file;
  1194. if( file.Open( lpszFileName ) )
  1195. {
  1196. DWORD dwDataRecordCount = file.GetDataRecordCount( pstock->GetStockInfo().GetMarket(), pstock->GetStockCode() );
  1197. aReport.SetSize( dwDataRecordCount );
  1198. DWORD dwCount = file.LoadDataRecord(pstock->GetStockInfo().GetMarket(), pstock->GetStockCode(),
  1199. aReport.GetData(), sizeof(REPORT), dwDataRecordCount );
  1200. aReport.SetSize( dwCount );
  1201. aReport.Sort( );
  1202. int nOldSize = aReport.GetSize();
  1203. aReport.RemoveDirty( );
  1204. if( nOldSize - aReport.GetSize() > 50 )
  1205. {
  1206. SP_VERIFY( aReport.GetSize() == (int)file.StoreDataRecord( pstock->GetStockInfo().GetMarket(), pstock->GetStockCode(),
  1207. aReport.GetData(), sizeof(REPORT), aReport.GetSize(), TRUE ) );
  1208. }
  1209. }
  1210. return aReport.GetSize();
  1211. }
  1212. int CSelfDB::LoadReport( CStock *pstock )
  1213. {
  1214. SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
  1215. if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
  1216. pstock->GetReport().RemoveAll();
  1217. CSPString sFileName;
  1218. SP_VERIFY( GetFileName( sFileName, CStock::dataReport, &(pstock->GetStockInfo()) ) );
  1219. ReadReport( pstock, sFileName );
  1220. return pstock->GetReport().GetSize();
  1221. }
  1222. DWORD ReadMinute( CStock * pstock, LPCTSTR lpszFileName )
  1223. {
  1224. SP_ASSERT( pstock && pstock->GetStockInfo().IsValidStock() );
  1225. if( !pstock || !pstock->GetStockInfo().IsValidStock() )
  1226. return 0;
  1227. CMinute & aMinute = pstock->GetMinute();
  1228. aMinute.RemoveAll();
  1229. // 读取
  1230. CClkFile file;
  1231. if( file.Open( lpszFileName ) )
  1232. {
  1233. DWORD dwDataRecordCount = file.GetDataRecordCount( pstock->GetStockInfo().GetMarket(), pstock->GetStockCode() );
  1234. aMinute.SetSize( dwDataRecordCount );
  1235. DWORD dwCount = file.LoadDataRecord(pstock->GetStockInfo().GetMarket(), pstock->GetStockCode(),
  1236. aMinute.GetData(), sizeof(MINUTE), dwDataRecordCount );
  1237. aMinute.SetSize( dwCount );
  1238. aMinute.Sort( );
  1239. aMinute.RemoveDirty( );
  1240. }
  1241. return aMinute.GetSize();
  1242. }
  1243. int CSelfDB::LoadMinute( CStock *pstock )
  1244. {
  1245. SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
  1246. if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
  1247. pstock->GetMinute().RemoveAll();
  1248. CSPString sFileName;
  1249. SP_VERIFY( GetFileName( sFileName, CStock::dataMinute, &(pstock->GetStockInfo()) ) );
  1250. ReadMinute( pstock, sFileName );
  1251. return pstock->GetMinute().GetSize();
  1252. }
  1253. int CSelfDB::LoadOutline( CStock *pstock )
  1254. {
  1255. SP_ASSERT( m_bIsOK && pstock && pstock->GetStockInfo().IsValidStock() );
  1256. if( !m_bIsOK || !pstock || !pstock->GetStockInfo().IsValidStock() ) return 0;
  1257. COutline & aOutline = pstock->GetOutline();
  1258. aOutline.RemoveAll();
  1259. CSPString sFileName;
  1260. SP_VERIFY( GetFileName( sFileName, CStock::dataOutline, &(pstock->GetStockInfo()) ) );
  1261. CSPFile file;
  1262. if( file.Open( sFileName, CSPFile::modeRead ) )
  1263. {
  1264. OUTLINE outline;
  1265. aOutline.SetSize( aOutline.GetSize(), file.GetLength()/sizeof(outline) + 10 );
  1266. while( sizeof(outline) == file.Read(&outline,sizeof(outline)) )
  1267. aOutline.Add( outline );
  1268. }
  1269. return aOutline.GetSize();
  1270. }
  1271. int CSelfDB::StoreReport( REPORT * pReport, int nCount, BOOL bBigTrade )
  1272. {
  1273. SP_ASSERT( m_bIsOK && pReport && nCount > 0 );
  1274. if( !m_bIsOK || !pReport || nCount <= 0 ) return 0;
  1275. static BOOL bFirstCall = TRUE;
  1276. if( bFirstCall )
  1277. {
  1278. bFirstCall = FALSE;
  1279. // remove old
  1280. CSPString sRoot = GetRootPath();
  1281. CClkFile::RemoveFileIfOutoftime( sRoot+self_sh_report, pReport->m_time );
  1282. CClkFile::RemoveFileIfOutoftime( sRoot+self_sz_report, pReport->m_time );
  1283. }
  1284. CSPString sFileName;
  1285. CClkFile file;
  1286. DWORD dwStoreCount = 0;
  1287. for( int i=0; i<nCount; i++ )
  1288. {
  1289. CStockInfo info;
  1290. CSPString sFileNameNew;
  1291. if( !info.SetStockCode( pReport[i].m_dwMarket, pReport[i].m_szCode )
  1292. || !GetFileName( sFileNameNew, CStock::dataReport, &info ) )
  1293. continue;
  1294. if( 0 != sFileNameNew.Compare( sFileName ) )
  1295. {
  1296. sFileName = sFileNameNew;
  1297. SP_VERIFY( CClkFile::BuildEmptyFile( sFileName, CStock::dataReport, pReport->m_dwMarket, 5000, 125, FALSE ) );
  1298. SP_VERIFY( file.Open( sFileName ) );
  1299. }
  1300. // store
  1301. if( bBigTrade )
  1302. {
  1303. dwStoreCount += file.StoreDataRecord( pReport[i].m_dwMarket, STKLIB_CODE_ZLDD,
  1304. &(pReport[i]), sizeof(REPORT), 1, FALSE );
  1305. }
  1306. else
  1307. {
  1308. dwStoreCount += file.StoreDataRecord( pReport[i].m_dwMarket, pReport[i].m_szCode,
  1309. &(pReport[i]), sizeof(REPORT), 1, FALSE );
  1310. }
  1311. }
  1312. return dwStoreCount;
  1313. }
  1314. int CSelfDB::StoreMinute( MINUTE * pMinute, int nCount )
  1315. {
  1316. SP_ASSERT( m_bIsOK && pMinute && nCount > 0 );
  1317. if( !m_bIsOK || !pMinute || nCount <= 0 ) return 0;
  1318. static BOOL bFirstCall = TRUE;
  1319. if( bFirstCall )
  1320. {
  1321. bFirstCall = FALSE;
  1322. // remove old
  1323. CSPString sRoot = GetRootPath();
  1324. CClkFile::RemoveFileIfOutoftime( sRoot+self_sh_minute, pMinute->m_time );
  1325. CClkFile::RemoveFileIfOutoftime( sRoot+self_sz_minute, pMinute->m_time );
  1326. }
  1327. CSPString sFileName;
  1328. CClkFile file;
  1329. DWORD dwStoreCount = 0;
  1330. CMinute aMinute;
  1331. for( int i=0; i<nCount; i++ )
  1332. {
  1333. CStockInfo info;
  1334. CSPString sFileNameNew;
  1335. if( !info.SetStockCode( pMinute[i].m_dwMarket, pMinute[i].m_szCode )
  1336. || !GetFileName( sFileNameNew, CStock::dataMinute, &info ) )
  1337. continue;
  1338. if( 0 != sFileNameNew.Compare( sFileName ) )
  1339. {
  1340. sFileName = sFileNameNew;
  1341. SP_VERIFY( CClkFile::BuildEmptyFile( sFileName, CStock::dataMinute, pMinute->m_dwMarket, 5000, 250, FALSE ) );
  1342. SP_VERIFY( file.Open( sFileName ) );
  1343. }
  1344. if( aMinute.GetSize() > 0
  1345. && (aMinute[0].m_dwMarket != pMinute[i].m_dwMarket || 0 != strncmp(aMinute[0].m_szCode,pMinute[i].m_szCode,sizeof(pMinute[i].m_szCode))) )
  1346. {
  1347. dwStoreCount ++;
  1348. // store
  1349. file.StoreDataRecord( aMinute[0].m_dwMarket, aMinute[0].m_szCode,
  1350. aMinute.GetData(), sizeof(MINUTE), aMinute.GetSize(), TRUE );
  1351. aMinute.RemoveAll();
  1352. }
  1353. aMinute.Add( pMinute[i] );
  1354. }
  1355. if( aMinute.GetSize() > 0 )
  1356. {
  1357. dwStoreCount ++;
  1358. // store
  1359. file.StoreDataRecord( aMinute[0].m_dwMarket, aMinute[0].m_szCode,
  1360. aMinute.GetData(), sizeof(MINUTE), aMinute.GetSize(), TRUE );
  1361. aMinute.RemoveAll();
  1362. }
  1363. return dwStoreCount;
  1364. }
  1365. int CSelfDB::StoreOutline( OUTLINE * pOutline, int nCount )
  1366. {
  1367. SP_ASSERT( m_bIsOK && pOutline && nCount > 0 );
  1368. if( !m_bIsOK || !pOutline || nCount <= 0 ) return 0;
  1369. CSPString sFileName;
  1370. SP_VERIFY( GetFileName(sFileName,CStock::dataOutline,NULL) );
  1371. CSPFile file;
  1372. if( file.Open( sFileName, CSPFile::modeCreate | CSPFile::modeWrite ) )
  1373. {
  1374. file.Write( pOutline, sizeof(OUTLINE)*nCount );
  1375. file.Close();
  1376. return nCount;
  1377. }
  1378. return 0;
  1379. }
  1380. BOOL CSelfDB::GetAccurateRoot( const char * rootpath, char *accurateroot, int maxlen )
  1381. {
  1382. if( 0 == rootpath || strlen(rootpath)==0 )
  1383. return FALSE;
  1384. // get rootpath
  1385. CSPString strRoot = rootpath;
  1386. int nLen = strRoot.GetLength();
  1387. if( strRoot[nLen-1] != '\' && strRoot[nLen-1] != '/' )
  1388. strRoot += CHAR_DIRSEP;
  1389. nLen = strRoot.GetLength();
  1390. if( 0 != access( strRoot + ml_dat, 0 ) )
  1391. return FALSE;
  1392. if( 0 != access( strRoot + ml_data, 0 ) )
  1393. return FALSE;
  1394. if( 0 != access( strRoot + ml_sh, 0 ) )
  1395. return FALSE;
  1396. if( 0 != access( strRoot + ml_sh_base, 0 ) )
  1397. return FALSE;
  1398. if( 0 != access( strRoot + ml_sh_month, 0 ) )
  1399. return FALSE;
  1400. if( 0 != access( strRoot + ml_sh_week, 0 ) )
  1401. return FALSE;
  1402. if( 0 != access( strRoot + ml_sh_day, 0 ) )
  1403. return FALSE;
  1404. if( 0 != access( strRoot + ml_sh_min, 0 ) )
  1405. return FALSE;
  1406. if( 0 != access( strRoot + self_sh_xdr, 0 ) )
  1407. return FALSE;
  1408. if( 0 != access( strRoot + self_news, 0 ) )
  1409. return FALSE;
  1410. strncpy( accurateroot, strRoot, maxlen-1);
  1411. accurateroot[maxlen-1] = '';
  1412. return TRUE;
  1413. }
  1414. int CSelfDB::InstallCodetbl( const char * filename, const char *orgname )
  1415. {
  1416. if( NULL == filename || strlen(filename) == 0
  1417. || NULL == orgname || strlen(orgname) == 0 )
  1418. return 0;
  1419. CSPString sFileName = GetRootPath();
  1420. CSPString sOrgName = "dat\";
  1421. sOrgName += orgname;
  1422. if( 0 == sOrgName.CompareNoCase(ml_sh_info)
  1423. || 0 == sOrgName.CompareNoCase(ml_sz_info)
  1424. || 0 == sOrgName.CompareNoCase(ml_sh_now)
  1425. || 0 == sOrgName.CompareNoCase(ml_sz_now)
  1426. || 0 == sOrgName.CompareNoCase(ml_sh_pyjc)
  1427. || 0 == sOrgName.CompareNoCase(ml_sz_pyjc)
  1428. || 0 == sOrgName.CompareNoCase(ml_sh_trace)
  1429. || 0 == sOrgName.CompareNoCase(ml_sz_trace)
  1430. || 0 == sOrgName.CompareNoCase(ml_sh_minute)
  1431. || 0 == sOrgName.CompareNoCase(ml_sz_minute) )
  1432. sFileName += ml_dat;
  1433. else
  1434. sFileName += ml_data;
  1435. sFileName += orgname;
  1436. return CSPFile::CopyFile( filename, sFileName, FALSE );
  1437. }
  1438. int CSelfDB::InstallCodetblBlock( const char * filename, const char *orgname )
  1439. {
  1440. if( NULL == filename || strlen(filename) == 0
  1441. || NULL == orgname || strlen(orgname) == 0 )
  1442. return 0;
  1443. int nRet = 0;
  1444. CDomainContainer newdomains;
  1445. if( newdomains.Load( filename ) )
  1446. {
  1447. nRet = AfxGetDomainContainer().AddDomainReplace( newdomains );
  1448. AfxGetDomainContainer().Store( AfxGetProfile().GetDomainFile() );
  1449. }
  1450. return nRet;
  1451. }
  1452. int CSelfDB::InstallCodetblFxjBlock( const char * filename, const char *orgname )
  1453. {
  1454. if( NULL == filename || strlen(filename) == 0
  1455. || NULL == orgname || strlen(orgname) == 0 )
  1456. return 0;
  1457. CSPString sName = orgname;
  1458. int nIndex = sName.Find( '.' );
  1459. if( -1 != nIndex )
  1460. sName = sName.Left(nIndex);
  1461. CDomain domain;
  1462. domain.m_strName = sName;
  1463. int nRet = domain.AddFxjDomain( filename );
  1464. if( nRet > 0 )
  1465. {
  1466. AfxGetDomainContainer().AddDomainReplace( domain );
  1467. }
  1468. return nRet;
  1469. }
  1470. int CSelfDB::InstallDRData( CDRData & drdata )
  1471. {
  1472. if( drdata.GetSize() <= 0 )
  1473. return 0;
  1474. CSPString sFileName;
  1475. CStockInfo stockinfo;
  1476. DWORD dwMarket = drdata.ElementAt(0).m_dwMarket;
  1477. CSPString sCode = drdata.ElementAt(0).m_szCode;
  1478. stockinfo.SetStockCode( dwMarket, sCode );
  1479. if( !GetFileName( sFileName, CStock::dataDR, &stockinfo ) )
  1480. return 0;
  1481. int nCount = 0;
  1482. CSPFile fileTo;
  1483. if( fileTo.Open( sFileName, CSPFile::modeCreate | CSPFile::modeNoTruncate | CSPFile::modeReadWrite ) )
  1484. {
  1485. for( int i=0; i<drdata.GetSize(); i++ )
  1486. {
  1487. CLK_DRDATA dbdrnew;
  1488. convert_DRDATA_to_CLK_DRDATA( &(drdata.ElementAt(i)), &dbdrnew );
  1489. fileTo.SeekToBegin( );
  1490. CLK_DRDATA dbdr;
  1491. memset( &dbdr, 0, sizeof(dbdr) );
  1492. BOOL bHas = FALSE;
  1493. BOOL bInsert = FALSE;
  1494. while( sizeof(dbdr) == fileTo.Read( &dbdr, sizeof(dbdr) ) )
  1495. {
  1496. if( dbdr.date == dbdrnew.date )
  1497. {
  1498. bHas = TRUE;
  1499. fileTo.Seek( fileTo.GetPosition()-sizeof(dbdr), CSPFile::begin );
  1500. break;
  1501. }
  1502. if( dbdr.date > dbdrnew.date )
  1503. {
  1504. bInsert = TRUE;
  1505. break;
  1506. }
  1507. }
  1508. if( bHas || !bInsert )
  1509. fileTo.Write( &dbdrnew, sizeof(dbdrnew) );
  1510. else if( bInsert )
  1511. {
  1512. int nCur = fileTo.GetPosition();
  1513. int nLen = fileTo.GetLength();
  1514. BYTE * pbuffer = new BYTE[nLen-nCur+1];
  1515. if( pbuffer )
  1516. {
  1517. if( nLen - nCur > 0 ) fileTo.Read( pbuffer, nLen-nCur );
  1518. fileTo.Seek( nCur-sizeof(dbdr), CSPFile::begin );
  1519. fileTo.Write( &dbdrnew, sizeof(dbdrnew) );
  1520. fileTo.Write( &dbdr, sizeof(dbdr) );
  1521. if( nLen - nCur > 0 ) fileTo.Write( pbuffer, nLen-nCur );
  1522. delete [] pbuffer;
  1523. }
  1524. }
  1525. nCount ++;
  1526. fileTo.Flush();
  1527. }
  1528. fileTo.Close();
  1529. }
  1530. return nCount;
  1531. }
  1532. int CSelfDB::InstallDRDataClk( const char * filename, const char *orgname )
  1533. {
  1534. if( NULL == filename || strlen(filename) == 0
  1535. || NULL == orgname || strlen(orgname) == 0 )
  1536. return 0;
  1537. CSPString sFileName;
  1538. CSPString sCode = orgname;
  1539. int nIndex = sCode.Find( '.' );
  1540. if( -1 != nIndex )
  1541. sCode = sCode.Left(nIndex);
  1542. CStockInfo info;
  1543. info.SetStockCode( CStock::marketUnknown, sCode );
  1544. DWORD dwMarket = info.GetMarket();
  1545. CDRData drdata;
  1546. CSPFile file;
  1547. if( file.Open( filename, CSPFile::modeRead ) )
  1548. {
  1549. CLK_DRDATA dbdr;
  1550. while( sizeof(dbdr) == file.Read(&dbdr,sizeof(dbdr)) )
  1551. {
  1552. DRDATA dr;
  1553. convert_CLK_DRDATA_to_DRDATA( dwMarket, sCode, &dbdr, &dr );
  1554. drdata.Add( dr );
  1555. }
  1556. file.Close();
  1557. }
  1558. return InstallDRData( drdata );
  1559. }
  1560. int CSelfDB::InstallDRDataFxj( const char * fxjfilename )
  1561. {
  1562. if( NULL == fxjfilename || strlen(fxjfilename) == 0 )
  1563. return 0;
  1564. CSPString sFileName = GetRootPath();
  1565. sFileName += self_chna_xdr;
  1566. return CSPFile::CopyFile( fxjfilename, sFileName, FALSE );
  1567. }
  1568. int CSelfDB::InstallBasetable( const char * filename, const char * orgname )
  1569. {
  1570. if( NULL == filename || strlen(filename) == 0
  1571. || NULL == orgname || strlen(orgname) == 0 )
  1572. return 0;
  1573. CSPString sFileName = GetRootPath();
  1574. sFileName += ml_data;
  1575. sFileName += orgname;
  1576. return CSPFile::CopyFile( filename, sFileName, FALSE );
  1577. }
  1578. int CSelfDB::InstallBasetableTdx( const char * filename )
  1579. {
  1580. if( NULL == filename || strlen(filename) == 0 )
  1581. return 0;
  1582. int nCount = 0;
  1583. CSPString sRoot = GetRootPath();
  1584. CSPString sFileNameSHSZ = sRoot + self_chna_basetbl;
  1585. CSPFile fileSHSZ, fileTdx;
  1586. if( fileSHSZ.Open( sFileNameSHSZ, CSPFile::modeWrite | CSPFile::modeCreate )
  1587. && fileTdx.Open( filename, CSPFile::modeRead ) )
  1588. {
  1589. fileTdx.Seek( TDX_FHEADER_SIZE, CSPFile::begin );
  1590. TDX_BASEDATA tdxblock;
  1591. while( sizeof(tdxblock) == fileTdx.Read( &tdxblock, sizeof(tdxblock) ) )
  1592. {
  1593. BASEDATA block;
  1594. if( convert_TDX_BASEDATA_to_BASEDATA( &tdxblock, &block ) )
  1595. {
  1596. fileSHSZ.Write( &block, sizeof(block) );
  1597. nCount ++;
  1598. }
  1599. }
  1600. }
  1601. return nCount;
  1602. }
  1603. int CSelfDB::InstallBasetableFxj( const char * filename )
  1604. {
  1605. if( NULL == filename || strlen(filename) == 0 )
  1606. return 0;
  1607. DWORD dwDate = CSPTime::GetCurrentTime().ToStockTimeDay();
  1608. {
  1609. CSPString sTemp = filename;
  1610. int index1 = sTemp.ReverseFind( '/' );
  1611. int index2 = sTemp.ReverseFind( '\' );
  1612. int index = max(index1,index2);
  1613. if( index > 0 )
  1614. sTemp = sTemp.Mid(index+1);
  1615. DWORD dwTemp = atol(sTemp);
  1616. CSPTime sptime;
  1617. if( sptime.FromStockTimeDay( dwTemp ) )
  1618. dwDate = dwTemp;
  1619. }
  1620. int nCount = 0;
  1621. CSPString sRoot = GetRootPath();
  1622. CSPString sFileNameSHSZ = sRoot + self_chna_basetbl;
  1623. CSPFile fileSHSZ, fileFxj;
  1624. if( fileSHSZ.Open( sFileNameSHSZ, CSPFile::modeWrite | CSPFile::modeCreate )
  1625. && fileFxj.Open( filename, CSPFile::modeRead ) )
  1626. {
  1627. fileFxj.Seek( FXJ_FHEADER_SIZE, CSPFile::begin );
  1628. FXJ_BASEDATA fxjblock;
  1629. while( sizeof(fxjblock) == fileFxj.Read( &fxjblock, sizeof(fxjblock) ) )
  1630. {
  1631. BASEDATA block;
  1632. if( convert_FXJ_BASEDATA_to_BASEDATA( &fxjblock, &block, dwDate ) )
  1633. {
  1634. fileSHSZ.Write( &block, sizeof(block) );
  1635. nCount ++;
  1636. }
  1637. }
  1638. }
  1639. return nCount;
  1640. }
  1641. int CSelfDB::InstallNewsText( const char * filename, const char *orgname )
  1642. {
  1643. if( NULL == filename || strlen(filename) == 0
  1644. || NULL == orgname || strlen(orgname) == 0 )
  1645. return 0;
  1646. CSPString sFileName = GetRootPath();
  1647. sFileName += self_news;
  1648. sFileName += orgname;
  1649. return CSPFile::CopyFile( filename, sFileName, FALSE );
  1650. }
  1651. int CSelfDB::InstallNewsText( const char * buffer, int nLen, const char *orgname )
  1652. {
  1653. if( NULL == buffer || nLen <= 0
  1654. || NULL == orgname || strlen(orgname) == 0 )
  1655. return 0;
  1656. CSPString sFileName = GetRootPath();
  1657. sFileName += self_news;
  1658. sFileName += orgname;
  1659. CSPFile file;
  1660. if( file.Open(sFileName,CSPFile::modeWrite|CSPFile::modeCreate) )
  1661. {
  1662. file.Write( buffer, nLen );
  1663. file.Close();
  1664. return 1;
  1665. }
  1666. return 0;
  1667. }
  1668. BOOL CSelfDB::GetFileName( CSPString &sFileName, int nDataType,
  1669. CStockInfo * pInfo, int nKType )
  1670. {
  1671. if( CStock::dataOutline == nDataType )
  1672. {
  1673. sFileName = GetRootPath();
  1674. sFileName += self_outline;
  1675. return TRUE;
  1676. }
  1677. if( NULL == pInfo || !pInfo->IsValidStock() )
  1678. return FALSE;
  1679. // 如果钱龙文件存在,就返回钱龙文件名(dataDR除外)
  1680. CSPString sFileNameQL;
  1681. if( CStock::dataDR != nDataType
  1682. && CQianlong::GetFileName( sFileNameQL, nDataType, pInfo, nKType )
  1683. && 0 == access(sFileNameQL,0) )
  1684. {
  1685. sFileName = sFileNameQL;
  1686. return TRUE;
  1687. }
  1688. // 确定市场类型
  1689. if( CStock::marketUnknown == pInfo->GetMarket() )
  1690. pInfo->ResolveTypeAndMarket( );
  1691. // 如果在 ml_sh 目录下找到文件,就返回找到的文件名
  1692. // 否则,若钱龙文件名长度大于0,就返回钱龙文件名,等于0就返回 ml_sh 下的文件名
  1693. if( CStock::dataBasetext == nDataType )
  1694. {
  1695. sFileName = GetRootPath();
  1696. sFileName += ml_sh_base;
  1697. sFileName += CSPString(pInfo->GetStockCode()) + ml_ext_base;
  1698. if( 0 != access(sFileName,0) && sFileNameQL.GetLength() > 0 )
  1699. sFileName = sFileNameQL;
  1700. return TRUE;
  1701. }
  1702. else if( CStock::dataK == nDataType )
  1703. {
  1704. sFileName = GetRootPath();
  1705. sFileName += ml_sh;
  1706. switch( nKType )
  1707. {
  1708. case CKData::ktypeMonth:
  1709. sFileName += CSPString(ml_month) + pInfo->GetStockCode() + ml_ext_month;
  1710. break;
  1711. case CKData::ktypeWeek:
  1712. sFileName += CSPString(ml_week) + pInfo->GetStockCode() + ml_ext_week;
  1713. break;
  1714. case CKData::ktypeDay:
  1715. sFileName += CSPString(ml_day) + pInfo->GetStockCode() + ml_ext_day;
  1716. break;
  1717. case CKData::ktypeMin60:
  1718. return FALSE;
  1719. case CKData::ktypeMin30:
  1720. return FALSE;
  1721. case CKData::ktypeMin15:
  1722. return FALSE;
  1723. case CKData::ktypeMin5:
  1724. sFileName += CSPString(ml_min5) + pInfo->GetStockCode() + ml_ext_min5;
  1725. break;
  1726. default:
  1727. return FALSE;
  1728. }
  1729. if( 0 != access(sFileName,0) && sFileNameQL.GetLength() > 0 )
  1730. sFileName = sFileNameQL;
  1731. return TRUE;
  1732. }
  1733. else if( CStock::dataDR == nDataType )
  1734. {
  1735. sFileName = GetRootPath();
  1736. if( pInfo->IsShenZhen() )
  1737. sFileName += self_sz_xdr;
  1738. else
  1739. sFileName += self_sh_xdr;
  1740. sFileName += CSPString(pInfo->GetStockCode()) + self_ext_xdr;
  1741. if( 0 == access(sFileName,0) )
  1742. return TRUE;
  1743. CSPString sTemp = GetRootPath();
  1744. sTemp += self_sh_xdr;
  1745. sTemp += CSPString(pInfo->GetStockCode()) + self_ext_xdr;
  1746. if( 0 == access(sTemp,0) )
  1747. sFileName = sTemp;
  1748. return TRUE;
  1749. }
  1750. else if( CStock::dataReport == nDataType )
  1751. {
  1752. sFileName = GetRootPath();
  1753. if( pInfo->IsShenZhen() )
  1754. sFileName += self_sz_report;
  1755. else
  1756. sFileName += self_sh_report;
  1757. return TRUE;
  1758. }
  1759. else if( CStock::dataMinute == nDataType )
  1760. {
  1761. sFileName = GetRootPath();
  1762. if( pInfo->IsShenZhen() )
  1763. sFileName += self_sz_minute;
  1764. else
  1765. sFileName += self_sh_minute;
  1766. return TRUE;
  1767. }
  1768. return FALSE;
  1769. }