📄 datarecovery_impl.cpp
字号:
else if (i==10) strcpy(m_JmDxx[DataCount-1].fxr_szd, tmpStr+k); else if (i==11) strcpy(m_JmDxx[DataCount-1].sxr_szd, tmpStr+k); else if (i==12) m_JmDxx[DataCount-1].fx_dxzx = atoi(tmpStr); else if (i==13) m_JmDxx[DataCount-1].sx_dxzx = atoi(tmpStr); else if (i==14) m_JmDxx[DataCount-1].dxlx = atoi(tmpStr); else if (i==15) m_JmDxx[DataCount-1].bmlx = tmpStr[k]; else if (i==16) m_JmDxx[DataCount-1].sf_zt = tmpStr[k]; else if (i==17) m_JmDxx[DataCount-1].sf_dzfd = tmpStr[k]; else if (i==18) m_JmDxx[DataCount-1].sf_nrfd = tmpStr[k]; else if (i==19) m_JmDxx[DataCount-1].sf_dzct = tmpStr[k]; else if (i==20) m_JmDxx[DataCount-1].sf_nrct = tmpStr[k]; else if (i==21) m_JmDxx[DataCount-1].sf_dzjc = tmpStr[k]; else if (i==22) m_JmDxx[DataCount-1].sf_nrjc = tmpStr[k]; break; case 10: if (i==0) strcpy(m_BfDxx[DataCount-1].fssj, tmpStr+k); else if (i==1) m_BfDxx[DataCount-1].dxzx_id = atoi(tmpStr); else if (i==2) strcpy(m_BfDxx[DataCount-1].fwq_ip, tmpStr+k); else if (i==3) strcpy(m_BfDxx[DataCount-1].dx_xh, tmpStr+k); else if (i==4) strcpy(m_BfDxx[DataCount-1].dxx_block_id, tmpStr+k); else if (i==5) strcpy(m_BfDxx[DataCount-1].ydz, tmpStr+k); else if (i==6) strcpy(m_BfDxx[DataCount-1].mddz, tmpStr+k); else if (i==7) strcpy(m_BfDxx[DataCount-1].dxnr, tmpStr+k); else if (i==8) m_BfDxx[DataCount-1].dxlx = atoi(tmpStr); else if (i==9) m_BfDxx[DataCount-1].bmlx == tmpStr[k]; else if (i==10) m_BfDxx[DataCount-1].dxfl = atoi(tmpStr); else if (i==11) strcpy(m_BfDxx[DataCount-1].ydz_sd, tmpStr+k); else if (i==12) strcpy(m_BfDxx[DataCount-1].mddz_sd, tmpStr+k); else if (i==13) strcpy(m_BfDxx[DataCount-1].fxr_szd, tmpStr+k); else if (i==14) strcpy(m_BfDxx[DataCount-1].sxr_szd, tmpStr+k); else if (i==15) m_BfDxx[DataCount-1].fx_dxzx = atoi(tmpStr); else if (i==16) m_BfDxx[DataCount-1].sx_dxzx = atoi(tmpStr); break; default: cout << "error table type" << endl; } //strcpy (Recoverd_data+curInnerStartIndex, tmpStr+k); //curInnerStartIndex += tmplen; //strcpy( Recoverd_data+curInnerStartIndex++, "\'" ); //只要不是最后一个字段,都需要加上逗号 , //if (i != (m_nDXX_TABLE_FIELD-1)) // strcpy( Recoverd_data+curInnerStartIndex++, "\," ); //执行完以上的语句之后,因该是 'XXXX', 的情况了 curStartIndex += m_DXX_TABLE[i]-1; //由于m_DXX_TABLE[i]的值是算入了字符串结束符的,所以也要-1 } // end for (i=0;i<m_nDXX_TABLE_FIELD;i++) //1.4最后再加上右括号之后,一条记录算是完成了 //strcpy( Recoverd_data+curInnerStartIndex++, "\)" ); }//end for while // writefile.open("/home/oracle/pdb_rx/DataRecovery/DataRecovery/TestFile");// writefile << Recoverd_data << endl;// writefile.close(); //2.接下来调用加载接口,将数据加载入库 try { if (CORBA::is_nil(m_DivServer)) { // Get "DIV.LOAD" object CORBA::Object_var dsobj =afls->alloc_obj("DIV.LOAD"); assert(!CORBA::is_nil(dsobj)); m_DivServer = IDivideServer::_narrow(dsobj); assert(!CORBA::is_nil(m_DivServer)); } } catch(const CORBA::Exception& ex) { m_DivServer =NULL; cout <<"perhaps DivideServer have breakdown !"<<endl<<"please check it "<<endl; } try { if ( strcmp("DZFX_DXX", m_TableName) == 0 || strcmp("dzfx_dxx", m_TableName) == 0 ) { rc = m_DivServer -> nExecInsertDZFX_DXX((const char *)"0", m_DzfxDxx, DataCount); cout << "rc for insert dzfx_dxx =" << rc <<endl; } else if ( strcmp("DZFD_DXX", m_TableName) == 0 || strcmp("dzfd_dxx", m_TableName) == 0 ) rc = m_DivServer -> nExecInsertDZFD_DXX((const char *)"0", m_DzfdDxx, DataCount); else if ( strcmp("NRFD_DXX", m_TableName) == 0 || strcmp("nrfd_dxx", m_TableName) == 0 ) rc = m_DivServer -> nExecInsertNRFD_DXX((const char *)"0", m_NrfdDxx, DataCount); else if ( strcmp("DZCT_DXX", m_TableName) == 0 || strcmp("dzct_dxx", m_TableName) == 0 ) rc = m_DivServer -> nExecInsertDZCT_DXX((const char *)"0", m_DzctDxx, DataCount); else if ( strcmp("NRCT_DXX", m_TableName) == 0 || strcmp("nrct_dxx", m_TableName) == 0 ) rc = m_DivServer -> nExecInsertNRCT_DXX((const char *)"0", m_NrctDxx, DataCount); else if ( strcmp("NRJC_DXX", m_TableName) == 0 || strcmp("nrjc_dxx", m_TableName) == 0 ) rc = m_DivServer -> nExecInsertNRJC_DXX((const char *)"0", m_NrjcDxx, DataCount); else if ( strcmp("DZJS_DXX", m_TableName) == 0 || strcmp("dzjs_dxx", m_TableName) == 0 ) rc = m_DivServer -> nExecInsertDZJS_DXX((const char *)"0", m_DzjsDxx, DataCount); else if ( strcmp("NRJS_DXX", m_TableName) == 0 || strcmp("nrjs_dxx", m_TableName) == 0 ) rc = m_DivServer -> nExecInsertNRJS_DXX((const char *)"0", m_NrjsDxx, DataCount); else if ( strcmp("JM_DXX", m_TableName) == 0 || strcmp("jm_dxx", m_TableName) == 0 ) { cout << "DataCount=" << DataCount <<endl; for (i=0;i<DataCount;i++) { cout << "m_JmDxx["<< i <<"].fssj="<< m_JmDxx[i].fssj << endl; cout << "m_JmDxx["<< i <<"].dxzx_id="<< m_JmDxx[i].dxzx_id << endl; cout << "m_JmDxx["<< i <<"].fwq_ip="<< m_JmDxx[i].fwq_ip << endl; cout << "m_JmDxx["<< i <<"].dx_xh="<< m_JmDxx[i].dx_xh << endl; cout << "m_JmDxx["<< i <<"].dxx_block_id="<<m_JmDxx[i].dxx_block_id << endl; cout << "m_JmDxx["<< i <<"].ydz="<< m_JmDxx[i].ydz << endl; cout << "m_JmDxx["<< i <<"].mddz="<< m_JmDxx[i].mddz << endl; cout << "m_JmDxx["<< i <<"].dxnr="<< m_JmDxx[i].dxnr << endl; cout << "m_JmDxx["<< i <<"].ydz_sd="<< m_JmDxx[i].ydz_sd << endl; cout << "m_JmDxx["<< i <<"].mddz_sd="<< m_JmDxx[i].mddz_sd << endl; cout << "m_JmDxx["<< i <<"].fxr_szd="<< m_JmDxx[i].fxr_szd << endl; cout << "m_JmDxx["<< i <<"].sxr_szd="<< m_JmDxx[i].sxr_szd << endl; cout << "m_JmDxx["<< i <<"].fx_dxzx="<< m_JmDxx[i].fx_dxzx << endl; cout << "m_JmDxx["<< i <<"].sf_zt="<< m_JmDxx[i].sf_zt << endl; cout << "m_JmDxx["<< i <<"].dxlx="<< m_JmDxx[i].dxlx << endl; cout << "m_JmDxx["<< i <<"].sf_zt="<< m_JmDxx[i].sf_zt << endl; cout << "m_JmDxx["<< i <<"].bmlx="<< m_JmDxx[i].bmlx << endl; cout << "m_JmDxx["<< i <<"].sf_dzfd="<< m_JmDxx[i].sf_dzfd << endl; cout << "m_JmDxx["<< i <<"].sf_nrfd="<< m_JmDxx[i].sf_nrfd << endl; cout << "m_JmDxx["<< i <<"].sf_dzct="<< m_JmDxx[i].sf_dzct << endl; cout << "m_JmDxx["<< i <<"].sf_nrct="<< m_JmDxx[i].sf_nrct << endl; cout << "m_JmDxx["<< i <<"].sf_dzjc="<< m_JmDxx[i].sf_dzjc << endl; cout << "m_JmDxx["<< i <<"].sf_nrjc="<< m_JmDxx[i].sf_nrjc << endl; } rc = m_DivServer -> nExecInsertJM_DXX((const char *)"0", m_JmDxx, DataCount); cout << "rc for insert jm_dxx =" << rc <<endl; }else if ( strcmp("BF_DXX", m_TableName) == 0 || strcmp("bf_dxx", m_TableName) == 0 ) rc = m_DivServer -> nExecInsertBF_DXX((const char *)"0", m_BfDxx, DataCount); } catch(const CORBA::Exception& ex) { cerr << ex <<endl; return -1; } //cout << "Recoverd_data = \n" << Recoverd_data <<endl; //rc = SUCCESS; return rc;}//负责将tab.dmp文件装入R_Data之中,在CBJ(即客户端)中调用此函数,将R_Data取到。CORBA::ShortDataRecovery_impl::transfer(DataRecovery::RECOVERED_DATA& R_Data) throw(CORBA::SystemException){ UpdateTime(); // TODO: Implementation CORBA::Short rc = 0; char buffer[3*1024]; R_Data.length(3*1024); ifstream DumpFile; DumpFile.open("/home/oracle/pdb/DataRecovery/EXPDATA/tab.dmp", std::ios::binary); CORBA::Long i=0; //i用来记录已经取了多少数据 int j; //j用来记录因该拓展多少次sequence; int tmpLength; if (!DumpFile.fail()) { i=0;j=1; while(!DumpFile.eof()) { DumpFile.read(buffer, sizeof(buffer)); tmpLength = DumpFile.gcount(); //如果长度不够,则拓展长度 if (i >= 3*1024*j) { j++; R_Data.length(3*1024*j); } //octet类型相当于unsigned char类型,所以只能用memcpy来填,而不能用strcpy memcpy((DataRecovery::RECOVERED_DATA*)&R_Data[i], buffer, sizeof(buffer)); i+=tmpLength; } } R_Data.length(i); //都传完之后,再做一次截断操作! DumpFile.close(); return rc;}//用来获得表的类型信息CORBA::Short DataRecovery_impl::nTableType(const char* strTableName)throw(CORBA::SystemException){ UpdateTime(); int TableType =-1; int rc; //通过表名来判断表的类型 CTableInfo TableInfo(m_config.sGetDicNode()); //cout << "m_config.sGetDicNode()=" << m_config.sGetDicNode() <<endl; struct TableDisInfo *pTableDisInfo = NULL; TableInfo.nRefreshInfo(); //连接数据字典 rc = TableInfo.nSearchDisInfo(strTableName, &pTableDisInfo); if (rc != SUCCESS) { cerr << "error in get table info\nerror code is:" << rc <<endl; return rc; } if (pTableDisInfo->nDisType == 0) //日志表 TableType=1; else if (pTableDisInfo->nDisType == 1 && (strcmp(pTableDisInfo->sDomain, "TJDOMAIN") == 0)) //统计表 TableType=3; else if (pTableDisInfo->nDisType == 1)//配置表 TableType=2; else { cerr << "Table dis type error"<< endl; return -1; } return TableType;}float DataRecovery_impl::fEstimateFileSize(const char* strTableName){ char ExpdpStatament [MAX_STATEMENT_LEN]; char tmpStr[100]; char strNum[20]; int nSize = -1; float fNum; float fEFileSize; int i,j,k; fstream EstimateFile; sprintf(ExpdpStatament, "expdp pdb_cuser/dbc DIRECTORY=dump_dir ESTIMATE_ONLY=Y ESTIMATE=BLOCKS TABLES=%s",strTableName); system(ExpdpStatament); system("more /home/oracle/pdb/DataRecovery/EXPDATA/export.log | grep 'Total estimation using BLOCKS method:' > /home/oracle/pdb/DataRecovery/EXPDATA/estimate"); EstimateFile.open("/home/oracle/pdb/DataRecovery/EXPDATA/estimate", std::ios::in); EstimateFile.getline(tmpStr, 100); //先定为到:之后 i=0;j=0;k=0; while(tmpStr[i] != ':') i++; //分析数字位!还要包含小数点! for (j=i; j<100; j++) { //去掉空格 if (tmpStr[j] == ' ') continue; if ((tmpStr[j]>='0' && tmpStr[j]<='9') || tmpStr[j] == '.') { strNum[k] = tmpStr[j]; k++; } else { if (tmpStr[j] == 'B') { nSize = 1; break; } else if (tmpStr[j] == 'K') { nSize = 1024; break; } else if (tmpStr[j] == 'M') { nSize = 1024*1024; break; } else if (tmpStr[j] == 'G') { nSize = 1024*1024*1024; break; } //只需要考虑一个单位,另外一个一定是B } if (tmpStr[j] == '\0') break; } //最后一位应该为空! strNum[k] = '\0'; cout << "strNum="<< strNum << endl; cout << "nSize="<< nSize << endl; fNum = atof(strNum); cout << "fNum="<< fNum << endl; fEFileSize = fNum * nSize; cout << "fEFileSize =" << fEFileSize << endl; return fEFileSize;}//// Operation declare nGetNextDataTJ//CORBA::ShortDataRecovery_impl::nGetNextDataTJ(CORBA::Short times, const char* TableName) throw(CORBA::SystemException){ UpdateTime(); // TODO: Implementation CORBA::Short rc = 0; char ExpdpStatament [MAX_STATEMENT_LEN]; fstream ParaFile; ParaFile.open("/home/oracle/pdb/DataRecovery/EXPDATA/para.txt", std::ios::out); ParaFile << "DIRECTORY=dump_dir DUMPFILE=tab.dmp CONTENT=DATA_ONLY TABLES= "<< TableName << endl; ParaFile << "QUERY='\"WHERE SJ>=(to_date(''"<< m_MinDate <<"'',''yyyy-mm-dd hh24:mi:ss'') + " << (times-1)*m_nInterval<< ")and SJ<(to_date(''"<< m_MinDate <<"'',''yyyy-mm-dd hh24:mi:ss'') + "<< times*m_nInterval <<")\"'"; ParaFile.close(); sprintf(ExpdpStatament, "expdp pdb_cuser/dbc parfile=/home/oracle/pdb/DataRecovery/EXPDATA/para.txt"); system("rm /home/oracle/pdb/DataRecovery/EXPDATA/tab.dmp"); system(ExpdpStatament); return rc;}// 更新最新操作的时间voidDataRecovery_impl::UpdateTime(){ last_int = time(0); cout << "UpdataTime:last_int =" << last_int<< endl;}// 获得最近操作的时间(整数)intDataRecovery_impl::nGetLastTime(){ return last_int;}boolean DataRecovery_impl::isTimeOut(time_t curr_int){ CORBA::String_var strMsg; if ((curr_int - nGetLastTime() ) > m_maxIdleTime) { strMsg = CORBA::string_dup("times out! "); //strMsg += m_strStatement; //IMPERR(ERR_SQSERVER_COMMON, strMsg.in()); //20051017 现在是为了查看方便,程序稳定后删除 cerr << "-----times out-----" << endl; cerr << "curr_int =" << curr_int << endl; cerr << "nGetLastTime() = " << nGetLastTime() << endl; cerr << "m_maxIdleTime =" << m_maxIdleTime << endl; return true; } return false;}//const char* DataRecovery_impl::getUserID()//{// return m_strClientID.in();//}// 析构结果集对象void DataRecovery_impl::destroy() throw(CORBA::SystemException){// MultiSync; m_TimeThread -> delNodebyPointer(this); PortableServer::ObjectId_var id = m_poa -> servant_to_id(this); m_poa -> deactivate_object(id);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -