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;
}