📄 expinterface.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 + -