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

📄 expinterface.cpp

📁 在动态库中实现异步导出大数据量的oracle数据
💻 CPP
字号:
#include "stdafx.h"
#include <jni.h>
#include "../ocicpp/ocicpp.h"

#include "ExpInterface.h"

using  std::string;
using namespace OCICPP;

jstring WindowsTojstring( JNIEnv* env, char* str );
char* jstringToWindows( JNIEnv *env, jstring jstr );
char * TrimBegin(char* pch);
char *TrimEnd(char* pch);
char* Trim(char *pch);
DWORD WINAPI ThreadTask( LPVOID pParam  );

typedef struct _DataConnect
{
	char username[50];				//用户名
	char password[50];					//密码
	char dbname[50];		//tns名称
	char expid[20];					//导出id
}DataConnect;

JNIEXPORT jstring JNICALL Java_ExpInterface_ExportFile(JNIEnv *env, jclass object,jstring UserName,jstring Password,jstring TnsName,jstring ExpID)
{
	DataConnect *datacon=new DataConnect;

	const char *username = jstringToWindows(env,UserName);
	const char *password = jstringToWindows(env,Password);
	const char *tnsname = jstringToWindows(env,TnsName);
	const char *expid = jstringToWindows(env,ExpID);

	strcpy(datacon->username,username);
	strcpy(datacon->password,password);
	strcpy(datacon->dbname,tnsname);
	strcpy(datacon->expid,expid);

	HANDLE phandle=CreateThread(NULL,0,ThreadTask,(LPVOID)datacon,0,0 );

	return WindowsTojstring(env,"0");

}

DWORD WINAPI ThreadTask( LPVOID pParam  )
{
	DataConnect *datacon=(DataConnect *)pParam;

	Connection con;
	Cursor cur,curexp,cursp;
	char sqlstr[2000];
	int id;
	string expsql,folder,filename,colname,colvalue,RtnBuf;
	FILE *expfd;
	bool RtnValue=true;
	int O_status;
	
	try
	{
		db::init();	
		db::connect(datacon->dbname,datacon->username,datacon->password,con);
	
		sprintf(sqlstr,"select ID,SQLS,FOLDER,FILENAME from CRM_EXPORT_FILE where id=%s",datacon->expid);
		con.execQuery(sqlstr,cur,1);
		
		if(cur.fetch())
		{
			cur.getInt(0,id);
			cur.getStr(1,expsql);
			cur.getStr(2,folder);
			cur.getStr(3,filename);
			cur.drop();
			
			if(expsql.find('$',0)==-1)
			{
				con.execQuery(expsql,curexp,1);
			}
			else
			{
				char seps[]   = "$";
				char param[20][100],paramname[100],params[1000];
				char spname[100];
				int row=0;
				short isNull;
				char *token = strtok((char*)expsql.c_str(), seps );
				strcpy(spname,token);
				memset(param,0,sizeof(param));
				while(token!=NULL)
				{
					token=strtok( NULL, seps );
					if(token!=NULL)
					{
						strcpy(param[row],token);
						row++;
					}
				}
				
				strcpy(params,"");
				for(int i=0;i<row;i++)
				{
					sprintf(paramname,":param%d,",i);
					strcat(params,paramname);
				}

				sprintf(sqlstr,"call %s(%s:o_status,:curexp)",spname,params);
				con.prepare(sqlstr,cursp,1);
				
				for(i=0;i<row;i++)
				{
					sprintf(paramname,":param%d",i);
					string bindvalue=param[i];
					cursp.bind(paramname,bindvalue,&isNull);
				}

				cursp.bind(":o_status",O_status,&isNull);
				cursp.bind(":curexp",curexp,&isNull);
				cursp.execute();
				curexp.execute();
				cursp.drop();
			}
			int cols=curexp.getNCols();
			filename=folder+"/"+filename;
			expfd=fopen(filename.c_str(),"w+");
			if(expfd!=NULL)
			{
				for (int i=0;i<cols;i++)
				{
					curexp.getColName(i,colname);
					fwrite(colname.c_str(),1,colname.length(),expfd);
					if(i<(cols-1))
						fwrite(",",1,1,expfd);						
				}
				fwrite("\r\n",1,2,expfd);						
				fflush(expfd);
					
				while(curexp.fetch())
				{				
					for (int i=0;i<cols;i++)
					{
						curexp.getStr(i,colvalue);
						if(!curexp.isNull(i))
						{
							char *trimcolvalue=Trim((char *)colvalue.c_str());
							fwrite(trimcolvalue,1,strlen(trimcolvalue),expfd);
						}
						if(i<(cols-1))
							fwrite(",",1,1,expfd);		
					}
					fwrite("\r\n",1,2,expfd);						
					fflush(expfd);
				}
				fclose(expfd);
				curexp.drop();
			}
			else
			{
				RtnValue=false;
				curexp.drop();
				RtnBuf="打开文件出错.";
			}

		}
		else
		{
				RtnValue=false;
				cur.drop();
				RtnBuf="所提供ID没有导出记录.";
		}
	}
	catch(OraError er)
	{
		RtnValue=false;
		cur.drop();
		RtnBuf=er.message;
		string::size_type sz=RtnBuf.find("'");
		while(sz!=string::npos)   
		{   
          RtnBuf.replace(sz,   1,   " ");
          sz=RtnBuf.find("'");   
		}					
	}
	
	try
	{
		if(RtnValue)
			sprintf(sqlstr,"update CRM_EXPORT_FILE set STATUS=4 where id=%s",datacon->expid);
		else
			sprintf(sqlstr,"update CRM_EXPORT_FILE set STATUS=4,ERRORMSG='%s' where id=%s",RtnBuf.c_str(),datacon->expid);
			
		con.execUpdate(sqlstr);
	}
	catch(OraError er)
	{
		RtnValue=false;
	}
	con.drop();

	return 0;
}

jstring WindowsTojstring( JNIEnv* env, char* str )
{
	jstring rtn = 0;
	int slen = strlen(str);
	unsigned short * buffer = 0;
	if( slen == 0 )
		rtn = (env)->NewStringUTF(str ); 
	else
	{
		int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
		buffer = (unsigned short *)malloc( length*2 + 1 );
		if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
		rtn = (env)->NewString( (jchar*)buffer, length );
	}
	if( buffer )
	free( buffer );
	return rtn;
}
char* jstringToWindows( JNIEnv *env, jstring jstr )
{
	int length = (env)->GetStringLength(jstr );
	const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
	char* rtn = (char*)malloc( length*2+1 );
	int size = 0;
	size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
	if( size <= 0 )
	return NULL;
	(env)->ReleaseStringChars(jstr, jcstr );
	rtn[size] = 0;
	return rtn;
}

char * TrimBegin(char* pch)
{
        if(pch == NULL || pch[0] ==0)
        {
                return pch;
        }
        int i = 0;
        int nLen = strlen(pch);
        for(i = 0; i < nLen; i++)
        {
                if(pch[i]!=0x20)
                {
                        break;
                }
        }
        memmove(pch,pch+i,nLen-i);
        memset(pch+(nLen-i),0x00,i);
        return pch;
}
char *TrimEnd(char* pch)
{
        int i = 0;
        if(pch ==NULL||pch[0]==0)
        {
                return pch;
        }
        int nLen = strlen(pch);
        for(i = nLen-1; i>=0; i--)
        {
                if(pch[i]!=0x20)
                        break;
        }
        if(i<nLen-1)
                *(pch+1+i) = '\0';
        return pch;
}
char* Trim(char *pch)
{
        if(pch ==NULL || pch[0] == 0)
                return pch;
        return TrimBegin(TrimEnd(pch));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -