[转帖]Tuxedo缓冲区的封装代码,成就你打造通用的tuxedo客户端(四)_MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 4826 | 回复: 0   主题: [转帖]Tuxedo缓冲区的封装代码,成就你打造通用的tuxedo客户端(四)        下一篇 
haili.yang
注册用户
等级:少校
经验:936
发帖:71
精华:1
注册:2012-12-24
状态:离线
发送短消息息给haili.yang 加好友    发送短消息息给haili.yang 发消息
发表于: IP:您无权察看 2012-12-25 11:16:01 | [全部帖] [楼主帖] 楼主

Tuxedo缓冲区的封装代码,成就你打造通用的tuxedo客户端(四)

 int TuxPost::BufferViewSend() //View方式缓冲区填充数据,填充完毕。。。我靠,好累。

{

map<string,VeiwType>::iterator

it=gview.theView.begin();

map<string,string>::iterator

vinbufit=gview.Vinbufmap.begin();

    这个map取值来自于getdata函数

char log[255]="";

int i=0;

int tmp1=0;

double tmp2=0.0;

float tmp3=0.0;

char tmp4[255]="";

long tmp5=0;

long rbegin=0;

long sizeit=0;

while(it!=gview.theView.end())

{

    string value;

    //如果gview.theView里面first也就是v1....v2..v3等和gview.Vinbufmap里面的first相同

    for(vinbufit;vinbufit!=gview.Vinbufmap.end();++vinbufit) {

    if(vinbufit->first==it->first) {

    value=vinbufit->second;//value=真正的请求的值

    break;

    }

    }

    string type=it->second.tmp;//取出类型

    rbegin=it->second.begin;//取出开始的位置,注意内存对其update里面。。

    sizeit=atol(it->second.orivalue.c_str());//取出大小

    if(type=="int"||type=="INT") {//如果是int

    tmp1=atoi(value.c_str());

    memcpy(v_SendBuff+rbegin,&tmp1,sizeit);

    }

    if(type=="double"||type=="DOUBLE") {

    tmp2=strtod(value.c_str(),NULL);

    memcpy(v_SendBuff+rbegin,&tmp2,sizeit);

    }

    if(type=="float"||type=="FLOAT") {

    tmp3=atof(value.c_str());

    memcpy(v_SendBuff+rbegin,&tmp3,sizeit);

    }

    if(strncmp(type.c_str(),"char",4)==0||strncmp(type.c_str(),"CHAR",4)==0) {//判断是不是CHAR类型

    memset(tmp4,0,sizeof(tmp4));

    memcpy(tmp4,value.c_str(),value.size());

    tmp4[sizeit]=0;

    memcpy(v_SendBuff+rbegin,tmp4,sizeit);

    }

    if(type=="long"||type=="LONG") {

    tmp5=atol(value.c_str());

    memcpy(v_SendBuff+rbegin,&tmp5,sizeit);

    }

    //5种类型的填充,��别填充到v_SendBuff

    memset(log,0,sizeof(log));

    sprintf(log," || View缓冲区类型的第%d成员,填充VIEW32缓冲区成功",i);

    m+=log;

    rbegin=0;

    sizeit=0;

    ++it;

    ++i;

}

    m+=" || 填充view32缓冲区数据成功";

return 0;

}

int TuxPost::BufferFmlSend(char *data,char *value,constchar *p) //填充fml缓冲区,来源数据是view gv

{ string s(p);

char sTmp[255]="";

char tmp[255]="";

memcpy(tmp,data,strlen(data));

char sTmp1[20480]="";

char sout1[255][255];

int

ret=-1;

strcpy(sTmp,data);

strcat(sTmp,"==");

strcat(sTmp,value);

sTmp[strlen(sTmp)+1]=0;

string s1(s.substr(0,s.find(sTmp)));

memset(sTmp,0,sizeof(sTmp));

memcpy(sTmp,s1.c_str(),s1.size());

int i=0;

i=iNum(sTmp,tmp);//注意这里的iNum的计��方式,也就是计算本次请求的data,value在p指针里面是属于第多少次请求,因为FML缓冲区是允许重复的,所以这个i特别重要。。 ret=SetSendFml(data,value,i);

if(ret==-1)

{

    m+=" || FML缓冲区填充数据失败";

return -1;

}

return 0;

} //这里才是真正填充的地

int TuxPost::SetSendFml(char *data,char *value,int iNum)

{

int ret=0;

int tmp1=0;

doubletmp2=0.0;

float tmp3=0.0;

char tmp4[255]="";

long tmp5=0;

map<string,VeiwType>::iterator it=gview.theView.begin();

while(it!=gview.theView.end()) {

long FMLID=Fldid32(data);//根据域表头��件,算出fldidno。。

if(strcmp(data,it->second.name.c_str())==0) {

string a=it->second.tmp;//判断gview.v1在theView这个map里面的类型,//判断gview.v1在theView这个map里面的类型,

//判断gview.v1在theView这个map里面的类型,

if(a=="int"||a=="INT") {//将gview.v1转化为Int//将gview.v1转化为int

tmp1=atoi(value);

ret=Fadd32((FBFR32 *)f_SendBuff,FMLID,(char *)&tmp1,iNum);

if(ret==-1) {

    m+=" || 向tuxedo缓冲区填充数据失败,Fadd32失败";

m+=Fstrerror32(Ferror32);

return -1;

}

}

if(a=="double"||a=="DOUBLE") {

//将gview.v1转化为double

tmp2=strtod(value,NULL);

ret=Fadd32((FBFR32*)f_SendBuff,FMLID,(char *)&tmp2,iNum);

if(ret==-1) {

    m+=" || 向tuxedo缓冲区填充数据失败,Fadd32失败";

m+=Fstrerror32(Ferror32);

return -1;

}

}

if(a=="long"||a=="LONG") {

//将gview.v1转化为double

tmp5=atol(value);

ret=Fadd32((FBFR32*)f_SendBuff,FMLID,(char *)&tmp5,iNum);

if(ret==-1) {

    m+=" || 向tuxedo缓冲区填充数据失败,Fadd32失败";

m+=Fstrerror32(Ferror32);

return -1;

}

}

if(a=="float"||a=="FLOAT") //将gview.v1转化为float

{//将gview.v1转化为float

tmp3=atof(value);

ret=Fadd32((FBFR32*)f_SendBuff,FMLID,(char *)&tmp3,iNum);

if(ret==-1)

{

    m+=" || 向tuxedo缓冲区填充数据失败,Fadd32失败";

m+=Fstrerror32(Ferror32);

return -1;

}

}

if(strncmp(a.c_str(),"char",4)==0||strncmp(a.c_str(),"CHAR",4)==0) {//将gview.v1转化为char//将gview.v1转化为char memset(tmp4,0,sizeof(tmp4)); strcpy(tmp4,value);

ret=Fadd32((FBFR32*)f_SendBuff,FMLID,(char *)tmp4,iNum);

if(ret==-1) {

    m+=" || 向tuxedo缓冲区填充数据失败,Fadd32失败";

m+=Fstrerror32(Ferror32);

return -1;

}

}

it->second.begin=FMLID;

}

++it;

}

return 0;

}

// 填充完毕了,下一步,我们来呼叫tuxedo函数。

int TuxPost::SInvoke(char *sname)

{

int ret=0;

m_status=-1;

long len=0;

char tmp[255]="";

if(BufferStringSend()==-1) {

    m+=" || 填充string缓冲区失败,或者分配string发送和接收缓冲区失败或者未连接上tuxedo";

return -1;

}

ret=tpcall(sname,(char*)s_SendBuff,strlen(s_SendBuff),(char **)&s_RecBuff,&len,TPNOTIME);

if(ret==-1) {

m+=tperrno;

m_status=-1;

    m+=" ||调用服务错误,严重失败";

m+=tpstrerror(tperrno);

m+=tpstrerrordetail(tperrordetail(0), 0);

if(tperrno==6) {

m+=" || tpcall()

所调用的SERVICE无法找到所致。一般来讲,可能是提供的该服务的进程都";

m_status=-3;

return -1;

}

}

sprintf(tmp," || 调用服务%s成功",sname);

m_status=0;

m+=tmp;

return 0;

}

int TuxPost::VInvoke(char *sname)

{

m_status=-1;

int ret=0;

long len;

char tmp[255]="";

char

encode[255]="";

char

decode[255]="";

memset(encode,NULL,255);

memset(decode,NULL,255);

if(BufferViewSend()==-1) {

    m+=" || 分配view32缓冲区失败,或者填充数据失败,或者连接tuxedo失败,请检查";

return -1;

}

ret=tpcall(sname,v_SendBuff,gview.SumVeiw(),(char

**)&v_RecBuff,&len,TPNOTIME);

if(ret==-1) {

m+=tperrno;

m_status=-1;

m+=" ||

调用服务错误,严重失败";

m+=tpstrerror(tperrno);

m+=tpstrerrordetail(tperrordetail(0),0);

if(tperrno==6) {

    m+=" || tpcall()所调用的SERVICE无法找到所致。一般来讲,可能是提供的该服务的进程都异常";

return -1;

}

return -1;

}

sprintf(tmp," || 调用服务%s成功",sname);

m_status=0;

m+=tmp;

return 0;

}

int TuxPost::FInvoke(char *sname)

{

m_status=-1;

char tmp[255]="";

int ret=0;

long len=0;

ret=tpcall(sname,(char *)f_SendBuff,0,(char **)&f_RecBuff,&len,TPNOTIME);

if(ret==-1) {

m+=tperrno;

m_status=-1;

    m+=" || 调用服务错误,严重失败";

m+=tpstrerror(tperrno);

m+= tpstrerrordetail(tperrordetail(0), 0);

if(tperrno==6) {

    m+=" || tpcall()所调用的SERVICE无法找到所致。一般来讲,可能是提供的该服务的进程都异常";

m+= tpstrerrordetail(tperrordetail(0), 0);

m_status=-3;

return -1;

}

return -1;

}

m_status=0;

sprintf(tmp," || 调用服务%s成功",sname);

m+=tmp;

return 0;

}




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论