Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}