Oracle Tuxedo工作站客户端与服务端的样例程序
服务端代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <atmi.h>
#include <userlog.h> static void trim(char *strIn, char *strOut){ char *start, *end, *temp; temp = strIn;
while (*temp == ' ')
{
++temp;
} start = temp; temp = strIn + strlen(strIn) - ; while (*temp == ' '){
--temp;
} end = temp; for (strIn = start; strIn <= end;){
*strOut++ = *strIn++;
} *strOut = '\0'; } // return 1 is true , 0 is false
static int isDigit(const char* str, int len)
{
int i;
if (len == )
{
return ;
}
for (i = ; i < len; ++i)
{
if (i == && str[i] == '-') continue; if (!isdigit(str[i]))
{
return ;
}
}
return ;
} static int extractErrorCodeTagValue(const char* source)
{
char tagBeginStr[] = { };
char tagEndStr[] = { };
char errorCodeStr[] = { };
char errorCodeStrOut[] = { };
const char *beginPos = NULL;
const char *endPos = NULL;
const char* ERROR_CODE_TAG = "ERRORCODE"; char *workPtr = NULL;
int i = ; if (source == NULL || strlen(source) == )
{
return -;
} sprintf(tagBeginStr, "<%s>", ERROR_CODE_TAG);
sprintf(tagEndStr, "</%s>", ERROR_CODE_TAG); beginPos = strstr(source, tagBeginStr);
endPos = strstr(source, tagEndStr); if (beginPos == NULL || endPos == NULL)
{
return -;
} for (workPtr = (char*)beginPos + strlen(tagBeginStr); workPtr != endPos; workPtr++,i++)
{
errorCodeStr[i] = *workPtr;
} if (strlen(errorCodeStr) == )
{
return -;
} trim(errorCodeStr, errorCodeStrOut); if (!isDigit(errorCodeStrOut, strlen(errorCodeStrOut)))
{
return -;
} return atoi(errorCodeStrOut); } EXEC SQL INCLUDE sqlca; EXEC SQL BEGIN DECLARE SECTION;
char result_out[] = "";
char* requestData = NULL;
long requestDataLen = ;
char* resultData = NULL;
int retErrorCode = ;
EXEC SQL VAR result_out IS STRING();
EXEC SQL END DECLARE SECTION; TEST(TPSVCINFO *rqst) { requestData = rqst->data;
requestDataLen = rqst->len; userlog("Request Data is:%s", requestData); userlog("Request Data Length is:%d", requestDataLen); EXEC SQL EXECUTE
DECLARE
result_out_sql varchar2();
BEGIN
result_out_sql := '';
prc_K_testJsdQuery(:requestData,result_out_sql);
:result_out := result_out_sql;
END;
END-EXEC; userlog("result_out is: %s",result_out); retErrorCode = extractErrorCodeTagValue(result_out);
userlog("ret Error Code is: %d",retErrorCode);
if(retErrorCode != )
{
EXEC SQL ROLLBACK;
userlog("executed rollback");
}
else
{
EXEC SQL COMMIT;
userlog("executed commit");
} resultData = (char *)tpalloc("STRING",NULL, + );
if(resultData)
{
memset(resultData,, + );
strncpy(resultData,result_out,);
userlog("result Data is: %s",resultData);
userlog("result Data Length is: %d",strlen(resultData));
tpreturn(TPSUCCESS,,resultData,strlen(resultData),);
tpfree(resultData);
}
else
{
tpreturn(TPFAIL,,NULL,,);
} }
以上代码内嵌了SQL,采用了Oracle的Pro*C/C++ 编程方式,需要运行以下命令生成相应的可以编译的server_test.c文件:
/*功能:调用TUXEDO服务端的服务TEST,取EMPNO=1000所对应的ENAME的值,并显示出来*/
#include <stdio.h>
#include "atmi.h"
main(argc,argv)
{ long reqlen=;
char *sendbuf;
char *rcvbuf; char *wsaddrEnv = tuxgetenv("WSNADDR");
if(wsaddrEnv)
{
fprintf(stderr,"wsnaddr is:%s\n",wsaddrEnv);
}
/* 与TUXEDO服务端建立连接 */
if (tpinit((TPINIT *) NULL) == -)
{
(void) fprintf(stderr,"Tpinit failedn");
exit();
} /* 分配发送缓冲区*/ sendbuf = (char *)tpalloc("STRING",NULL,reqlen); if ( sendbuf == (char *)NULL) { printf("tpalloc failedn"); tpterm(); } /* 分配接受缓冲区*/
rcvbuf = (char *)tpalloc("STRING",NULL,reqlen); if ( rcvbuf == (char *)NULL) { printf("tpalloc failedn"); tpterm(); } strcpy(sendbuf,"<AKC190>L2017262210000651420</AKC190><YYBM>0080</YYBM>"); /*调用TUXEDO的服务TEST*/ if (tpcall("TEST", (char *)sendbuf, 0L, (char **)&rcvbuf, (long *)&reqlen, < ) )
/*tpcall("TOUPPER", (char *)sendbuf, 0, (char **)&rcvbuf, &rcvlen, (long)0))*/
{ printf("tpcall failed,tperrno=%ld,tperrtext=%s\n",tperrno,tpstrerror(tperrno)); tpfree(rcvbuf); tpterm(); exit(); } printf("name=%s\n",rcvbuf); tpfree(rcvbuf); tpfree(sendbuf); tpterm(); return(); }
然后以上代码用以下命令行来编译:
Oracle Tuxedo工作站客户端与服务端的样例程序的更多相关文章
- Tuxedo安装、配置、以及演示样例程序 (学习网址)
Tuxedo安装.配置.以及演示样例程序 (学习网址): 1.http://liu9403.iteye.com/blog/1415684 2.http://www.cnblogs.com/fnng/a ...
- aiohttp web服务端(server)样例 (非client)
python版本 python3.6 (其他版本需要小改,版本>python3.4) 参考网址:https://www.cnblogs.com/ameile/p/5589808.html as ...
- 同一台电脑同时装Oracle客户端和服务端
1.如果之前安装过Oracle,Win+R输入Services.msc,关掉以Oracle开头的服务(卸载Oracle服务端和客户端步骤一样,见另外一篇帖子) 2.Win+R输入regedit打开注册 ...
- 安装_oracle11G_客户端_服务端_链接_oracle
在开始之前呢,有一些注细节需要注意,oracle11G_客户端_和_服务端, 分为两种 一种是 开发者使用 一种是 BDA 自己使用(同时也需要根据自己 PC 的系统来做_win7_与 ...
- TCP学习之五:客户端、服务端异步传输字符串
参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 消息发送接口: 消息接收接口: 客户端: 服务端: 消息发送类: ...
- TCP学习之三:客户端、服务端同步传输字符串
参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 一个客户端.发送一条消息 客户端: 服务端: 注意:Networ ...
- 客户端向服务端传送特殊字符解决方法(检测到有潜在危险的 Request.Form 值)
当客户端向服务端传输特殊字符时报错,错误信息如下图:
- [Java]Hessian客户端和服务端代码例子
简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...
- SignalR 实现web浏览器客户端与服务端的推送功能
SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...
随机推荐
- C# 图片识别(支持21种语言) (转)
图片识别的技术到几天已经很成熟了,只是相关的资料很少,为了方便在此汇总一下(C#实现),方便需要的朋友查阅,也给自己做个记号. 图片识别的用途:很多人用它去破解网站的验证码,用于达到自动刷票或者是批量 ...
- js操作XML文件兼容IE与FireFox
最近项目中用到了xml,需求是用户安装产品时先把一系列的数据保存到xml文件中,当执行到最后一步时才写入数据库,这样最大限度的减少了数据库的访问,于是不得不纠结在各浏览器的兼容性的问题(悲哀啊.... ...
- 在Web应用程序中执行计划任务(多线程)
在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQ ...
- Java Base64加密解密
使用Apache commons codec 类Base64 maven依赖 <dependency> <groupId>commons-codec</groupId&g ...
- light oj 1007 Mathematically Hard (欧拉函数)
题目地址:light oj 1007 第一发欧拉函数. 欧拉函数重要性质: 设a为N的质因数.若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N ...
- 【R】函数-概率函数
- ASP入门(十二)-Application对象
在一起协同工作以完成某项任务的一组ASP文件称为一个应用程序.Application 对象用于把这些文件捆绑在一起. Application 对象用于在整个应用程序生存期间保存信息. Applicat ...
- (纪录片)鸟瞰中国 China from Above
简介: 类型: 纪录片官方网站: natgeotv.com/uk/china-from-above制片国家/地区: 美国语言: 英语集数: 2单集片长: 44分钟IMDb链接: tt4872012 主 ...
- java报错综合
1.java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I 方法一:这是因为在struts2自带的antlr-2.7.2.jar包的 ...
- ACCESS和MSSQL-如何随机读取数据库记录
查询语句只要这样写,就可以随机取出记录了 SQL="Select top 6 * from Dv_bbs1 where isbest = 1 and layer = 1 order by n ...