QuoteInterface_TDF::QuoteInterface_TDF(const SubscribeContracts* subscribe_contracts, const ConfigData& cfg) : cfg_(cfg), p_stock_md_save_(NULL), p_stock_idx_save_(NULL) { if (subscribe_contracts) { subscribe_contracts_ = *subscribe_contracts; } InitErrorMap(); sprintf(qtm_name_, "tdf_%s_%u", cfg.Logon_config().account.c_str(), getpid()); QuoteUpdateState(qtm_name_, QtmState::INIT); // create save object p_stock_md_save_ = new QuoteDataSave<TDF_MARKET_DATA_MY>(cfg_, qtm_name_, "tdf_market_data", TDF_STOCK_QUOTE_TYPE); p_stock_idx_save_ = new QuoteDataSave<TDF_INDEX_DATA_MY>(cfg_, qtm_name_, "tdf_index_data", TDF_INDEX_QUOTE_TYPE); p_stock_oq_save_ = new QuoteDataSave<T_OrderQueue>(cfg_, qtm_name_, "order_queue_data", KMDS_ORDER_QUEUE_TYPE); p_stock_pe_save_ = new QuoteDataSave<T_PerEntrust>(cfg_, qtm_name_, "per_entrust_data", KMDS_PER_ENTRUST_TYPE); p_stock_pb_save_ = new QuoteDataSave<T_PerBargain>(cfg_, qtm_name_, "per_bargain_data", KMDS_PER_BARGAIN_TYPE); s_p_stock_md_save = p_stock_md_save_; s_p_stock_idx_save = p_stock_idx_save_; s_p_stock_oq_save = p_stock_oq_save_; s_p_stock_pe_save = p_stock_pe_save_; s_p_stock_pb_save = p_stock_pb_save_; // environment settings //TDF_SetEnv(TDF_ENVIRON_HEART_BEAT_INTERVAL, 10); //TDF_SetEnv(TDF_ENVIRON_MISSED_BEART_COUNT, 2); //TDF_SetEnv(TDF_ENVIRON_OPEN_TIME_OUT, 30); // quote connection settings open_settings = new TDF_OPEN_SETTING(); InitOpenSetting(open_settings, cfg); TDF_ERR nErr = TDF_ERR_SUCCESS; g_hTDF = TDF_Open(open_settings, &nErr); // try till open success while (nErr == TDF_ERR_NETWORK_ERROR || g_hTDF == NULL) { MY_LOG_ERROR("TDF_Open returned: %s; try again.", GetErrStr(nErr)); QuoteUpdateState(qtm_name_, QtmState::CONNECT_FAIL); sleep(3); g_hTDF = TDF_Open(open_settings, &nErr); } MY_LOG_INFO("TDF_Open success."); QuoteUpdateState(qtm_name_, QtmState::CONNECT_SUCCESS); QuoteUpdateState(qtm_name_, QtmState::API_READY); }
bool CTTLog::Write(const LogLevel level, const char *pLog, ...) { CCriticalGuard guard(m_cs); if (level > _eAllowLevel) { // 写入日志级别高于允许级别,则不写入 return false; } // 组织日志 std::stringstream strm; struct tm when = {0}; time_t now = 0;; //得到时间信息字符串 time(&now); when = *localtime(&now); char szTime[128] = {0}; sprintf(szTime, "%4d-%02d-%02d %02d:%02d:%02d", (when.tm_year + 1900), (when.tm_mon + 1), when.tm_mday, when.tm_hour, when.tm_min, when.tm_sec); strm << szTime << "\t"; strm << "[ " << GetErrStr(level) << " ]\t"; char buf[512]; memset(buf, 0, sizeof(buf)); va_list argList; va_start(argList, pLog); vsprintf(buf, pLog, argList); va_end(argList); strm << buf << "\r\n"; sprintf(szTime, "%s %4d-%02d-%02d.log", _filename.c_str(), (when.tm_year + 1900), (when.tm_mon + 1), when.tm_mday); std::string file = _path.length()>0 ? _path+"\\" : ".\\"; file += szTime; if (!_oFile.is_open()) { // 文件已关闭,重新打开文件 // 首先判断目录是否存在 if (_path.length() && !PathIsDirectory(_path.c_str())) { //不存在,创建子目录 if (!CreateDirectory(_path.c_str(), NULL)) { return 0; } } _oFile.open(file.c_str(), std::ios_base::app|std::ios_base::binary); if (!_oFile.is_open()) { // 文件打不开 assert(false); return false; } } _oFile.seekp(0, std::ios::end); unsigned int len = _oFile.tellp(); if (len+strm.str().length() > _maxSize) { // 文件已经超过允许最大大小,备份文件 sprintf(szTime, "%s %4d-%02d-%02d %02d%02d%02d-bak.log", (_filename.c_str(), when.tm_year + 1900), (when.tm_mon + 1), when.tm_mday, when.tm_hour, when.tm_min, when.tm_sec); // 得到备份文件名 _oFile.close(); std::string newFile = _path.length() > 0 ? _path+"\\" : ".\\"; newFile += szTime; rename(file.c_str(), newFile.c_str()); // 重命名文件 // 重新打开新文件 _oFile.open(file.c_str(), std::ios_base::app|std::ios_base::binary); if (!_oFile.is_open()) { // 文件打不开 assert(false); return false; } } _oFile << strm.str(); _oFile.flush(); // 每次关闭文件 _oFile.close(); return true; }