⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datarecovery_impl.cpp

📁 oracle下调用数据泵接口进行远程数据导出和导入(数据恢复)的CORBA服务
💻 CPP
📖 第 1 页 / 共 4 页
字号:
										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 + -