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

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

 bool Veiw::PrintVeiw()//打印容器theView里面存储的东西内容

{

    for(map<string,VeiwType>::iterator it=theView.begin();it!=theView.end();++it)

    {

    cout<<"first["<<it->first<<"]"<<",second VeiwType {

    name="<<it->second.name<< ",value="<<(it->second).value<< ", tmp="<<(it->second).tmp<<

    ", param="<<(it->second).param<< ", begin="<<it->second.begin<< "};"<<endl;

    }

    return true;

} //打印结果---

bool Veiw::Printmap()

{

    for(map<string,string>::iterator it=Vinbufmap.begin();it!=Vinbufmap.end();++it) {

    cout<<it->first<<"== "<<","<<it->second<<endl;

    }

    return true;

}

bool Veiw::Printvec()

{

for(vector<string>::iterator it=Voutbuf.begin();it!=Voutbuf.end();++it) {

    cout<<" "<<(*it)<<endl;

}

return true;

}

int TuxPost::CallAnaly(char *p, char *sname)//解析soap消息数据

//解析rid=123;rsal=wocao;rname=guowl sname是请求的tuxedo服务的名称

{

    if(p==NULL || sname==NULL)

    {

    return -1;

    }

    memset(Buffer,0,BUFFLEN*sizeof(char));

    memset(g_out1,0,sizeof(g_out1));

    memset(g_out2,0,sizeof(g_out2));

    memset(m_CurServiceName,0,sizeof(m_CurServiceName));

    strcpy(m_CurServiceName,sname);//本次请求的服务名称

    string s;

    char sTmp1[255]="";

    if(strncmp(Stype,"STRING",6)==0)

    {//对于string类型,这里使用了gview.instr这个对象

    gview.instr.clear();

    gview.instr=p;//gview.instr表示,STRING类型的请求入参数据

    size_t sp=gview.instr.find_first_of("=");

    if(static_cast<int>(sp)!=-1) {//string的入参请求数据为:  send=guowlnihaoa

    string stemp=gview.instr.substr(0,sp);//stemp=send

    //找到"="之前的业务名称,判断是否为入参

    if(Param(stemp.c_str())==IN||Param(stemp.c_str())==INOUT) {

    gview.instr.erase(0,sp+2);//拿到真正的入参数据,gview.instr=guowlnihaoa

    return 0;

    } else {

    memset(sTmp1,0,sizeof(sTmp1));

    sprintf(sTmp1," || string类型的本次请求的服务名称%s,入参数据,在isalt.def里面对应的业务成员%s错误,不是in入参;",p,stemp.c_str());

    m+=sTmp1;

    return -1;

    }

    } else {

    memset(sTmp1,0,sizeof(sTmp1));

    sprintf(sTmp1,"||string类型的本次请求的服务名称%s,入参数据请求错误,找不到==符号,请改正",p);

    m+=sTmp1;

    return -1;

}

}

//对于非STRING类型的请求数据,要使用splitStr逐个分割

int iNum=splitStr(p,";",g_out1);//第一次分割,使用;符号做分割。分割后变成了s  out[0]="rid=123",sout[1]="rsal=wocao",sout[2]="rname=guowl"

//第一次,使用";"分割,分割后,g_out1[1]="rid=123",g_out1[2]="rname=guowl"

for (int i=0;i<iNum && iNum>=2;++i)

{

    memset(g_out2,0,sizeof(g_out2));

    int iNum1=splitStr(g_out1[i],"==",g_out2);//第二次用“=”分割,分割后的结果赋值给out1二维数组,iNum1只能=2,因为一个=,就把rid=123分割成了两部分

    if (iNum1==2 && (Param(g_out2[0])==IN || Param(g_out2[0])==INOUT)) {

    if(strncmp(Stype,"FML",3)==0) {

    if(SetSendFmlBuffer(g_out2[0],g_out2[1],p)==-1) {

    memset(sTmp1,0,sizeof(sTmp1));

    sprintf(sTmp1," || FML缓冲区第%d个soap请求的业务成员赋值给isalt对应的v1~v50失败;",i);

    m+=sTmp1;

    return -1;

    }

    continue;

    }

    if(strncmp(Stype,"VIEW",4)==0 && gv.GetData(g_out2[0],g_out2[1])==0)//GetData是View这个类的一个函数,分别实现了v1~v50的赋值

    {

    memset(sTmp1,0,sizeof(sTmp1));

    sprintf(sTmp1,"  || 第%d个soap请求的业务成员赋值给isalt对应的v1~v50成功;",i);

    m+=sTmp1;

    continue;

    }

    }

}

return 0;

}

//好了,分析本次请求入参的数据就到这里了。。下面我们看一下怎么分配6种缓冲区以及分配发送和接受的STRING类型缓冲:

int TuxPost::StringSrc()//分配string类型的发送缓冲区

{

if(TuxInit()==false)

{//判断是否已经连接上tuxedo

m_status=-1;

    m+=" || isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面";

return -1;

}

if(strcmp(Stype,"STRING")==0)

s_SendBuff=tpalloc("STRING", NULL, BUFFLEN*sizeof(char));

if(s_SendBuff==NULL)

{

m_status=-1;

m_Errno=tperrno;

    m+="||分配string类型发送往tuxedo内存出错可能是申请的空间太大,系统内存不足!";

return -1;

}

    m+=" || 分配string类型发送往tuxedo内存内存成功";

return 0;

}

int TuxPost::StringDest()//分配string类型的接收缓冲区

{

if(StringSrc()==-1)

{//是嵌套的。。。

m_status=-1;

    m+=" || isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面或者STRING分配的内存空间太大";

return -1;

}

s_RecBuff=tpalloc("STRING",NULL,BUFFLEN*sizeof(char));

if(s_RecBuff==NULL)

{

m_status=-1;

m_Errno = tperrno;

    m+="||分配STRING类型缓冲区接收tuxedo内存出错可能是申请的空间太大,没有足够的内存可以?  褂?";

return -1;

}

return 0;

}

//注意VIEW32缓冲区,都是使用了CARRAY类型的缓冲区。

int TuxPost::ViewSrc()//分配view32类型的发送缓冲区

{

if(TuxInit()==false)

{

m_status=-1;

m+="||isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面";

return -1;

}

v_SendBuff=tpalloc("CARRAY", NULL, BUFFLEN*sizeof(char)+1);

if(v_SendBuff==NULL)

{

m_status=-1;

m_Errno=tperrno;

    m+="||分配view32类型发送往tuxedo内存内存出错可能是申请的空间太大,系统内存不足!";

return -1;

}

m+="||分配view32类型发送往tuxedo内存成功";

return 0;

}

int TuxPost::ViewDest()//分配view32类型的接收缓冲区

{

if(ViewSrc()==-1)

{

m_status=-1;

m+="||isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面,或者view分配的内存空间太大";

return -1;

}

v_RecBuff=tpalloc("CARRAY", NULL, BUFFLEN*sizeof(char)+1);

if(v_RecBuff==NULL)

{

m_status=-1;

m_Errno=tperrno;

    m+="||分配内存出错可能是申请的空间太大,系统内存不足!";

return -1;

}

    m+="||分配VIEW32缓冲区内存成功";

return 0;

}

int TuxPost::FmlSrc()//分配fml32类型的发送缓冲区

{

if(TuxInit()==false)

{

m_status=-1;

m+="||isalt初始化连接诶tuxedo失败,请检查wsnaddr的配置,在isalt.def里面";

return -1;

}

f_SendBuff=tpalloc("FML32", NULL, BUFFLEN*sizeof(char)+1);

if(f_SendBuff==NULL)

{

m_status=-1;

m_Errno=tperrno;

    m+="||分配fml32类型发送往tuxedo内存出错可能是申请的空间太大,系统内存不足!";

return -1;

}

m+=" || 分配fml32类型缓冲区发送往tuxedo内存成功";

return 0;

}

int TuxPost::FmlDest()//分配fml32类型的接收缓冲区

{

if(CheckFmlTables()==-1)

{

m_status=-1;

m+=" || 验证域表文件出错,请核查";

return -1;

}

if(FmlSrc()==-1)

{

m_status=-1;

m+="||isalt分配fml缓冲区失败,请检查配置信息,有可能是wsnaddr错误或者需要分配的内存";

return -1;

}

f_RecBuff=tpalloc("FML32", NULL, BUFFLEN*sizeof(char)+1);

if(f_RecBuff==NULL)

{

m_status=-1;

m_Errno=tperrno;

m+="||分配fml32类型接收tuxedo返回结果内存出错可能是申请的空间太大,系统内存不足!";

return -1;

}

m+=" || 分配fml32类型接收tuxedo返回结果存成功";

return 0;

}

//六:下面我们开始针对6种缓冲区进行分别填充。

int TuxPost::BufferStringSend()

{

if(gview.instr=="") {

    m+="|| 发送给tuxedo请求数据为空,请检查,原因可能是业务数据成员和isalt.def里面配置的不正 确导致,请检查";

return-1;

} //在CallAnaly这个函数中,我们知道,STRING类型,是吧请求的数据赋值到了:

// gview.instr这个对象上面。。。。所以,你懂得。直接复制即可。

if(s_SendBuff!=NULL) {

memcpy(s_SendBuff,gview.instr.c_str(),gview.instr.size());

s_SendBuff[gview.instr.size()]=0;

    m+=" || 填充string类型缓冲区成功";

}

return 0;

}

int Veiw::GetData(char *data,char *value) //将业务数据向isalt成员做转化,输入业务名称和值,做了20次对比

{

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

    string tmp="v";

    int i=1;

    while (it!=theView.end())

    {

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

    //如果data和theView容器里面的name的取值相同

    tmp+=IntToString(i);//这里构造v1...v2...v3等等,i是不停的++

    Vinbufmap.insert(map<string,string>::value_type(tmp,value)); //插入Vinbufmap里面分别是(v1,123) (v2,"nihao")等信息

    }

    ++it;

    ++i;

    }

    return 0;

}




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