美文网首页
分布式联机服务技术框架(IBP)设计与实战(六、开发接口参考)

分布式联机服务技术框架(IBP)设计与实战(六、开发接口参考)

作者: 潇湘夜雨2018 | 来源:发表于2018-01-28 19:06 被阅读125次
    版本号 修订日期 修订人 内容
    0.0.1.0 2018-01-28 厉华 创建

    1. API接口

    1.1. 公共API接口

    1.1.1. 文件类

    1.1.1.1. IBPCreateTempFile

    函数原型: FILE *IBPCreateTempFile( char *file_id , char *filename , char *pathfilename , char *mode );
    函数描述: 创建本地唯一附带临时文件
    函数说明: char *file_id 文件ID,用于前后台交换多个文件时指定文件用<br />char *filename 附带文件名;声明变量“char filename[ IBP_MAXLEN_FILENAME + 1 ] ;”;如果填为NULL,则函数返回时不填充<br />char *pathfilename 带路径的附带文件名;声明变量“char filename[ IBP_MAXLEN_FILENAME + 1 ] ;”;如果填为NULL,则函数返回时不填充<br />char *mode fopen打开模式,文本文件用"w",二进制文件用"b"
    返回值: 返回非NULL表示成功,值为打开FILE指针;返回NULL表示失败

    1.2. 注册代理API接口

    1.2.1. 环境类

    1.2.1.1. IBMAOpenConfigSpace

    函数原型: struct IbmaConfigSpace *IBMAOpenConfigSpace( char *config_filename );
    函数描述: 打开配置共享内存
    函数说明: 从注册代理主配置文件config_filename得到配置共享内存key,申请配置共享内存句柄所需内存,打开配置共享内存,返回该句柄指针。<br />当config_filename为NULL时取缺省值"ibma.conf"。<br />config_filename不含路径,写死路径在"$HOME/etc"。
    返回值: 返回非NULL表示成功,值为打开句柄指针;返回NULL表示失败

    1.2.1.2. IBMACheckConfigSpaceAttaching

    函数原型: int IBMACheckConfigSpaceAttaching( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 检查是否有新构建的配置共享内存,如果有则切换到新构建的
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄。
    返回值: 返回1表示切换配置共享内存;0表示成功;非0表示失败

    1.2.1.3. IBMACloseConfigSpace

    函数原型: void IBMACloseConfigSpace( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 关闭配置共享内存打开句柄
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: (无)

    1.2.1.4. IBMAGetConfigSpaceAttaching

    函数原型: struct ConfigSpaceAttaching *IBMAGetConfigSpaceAttaching( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 得到配置空间首区结构指针
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: 配置空间首区结构地址(只读)

    1.2.1.5. IBMAGetThisNodePtr

    函数原型: char *IBMAGetThisNodePtr( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 得到自己通讯节点名
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: 返回自己通讯节点名(只读)

    1.2.1.6. IBMAGetRetryConnectTimeval

    函数原型: int IBMAGetRetryConnectTimeval( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 得到暂禁时间配置
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: 返回暂禁时间配置(只读)

    1.2.1.7. IBMAGetMinCompressSize

    函数原型: int IBMAGetMinCompressSize( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 得到最小压缩数据大小
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: 返回最小压缩数据大小(只读);当HTTP体数据大于等于该配置值时才激活压缩

    1.2.1.8. IBMAGetIbmsServerIp

    函数原型: char *IBMAGetIbmsServerIp( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 得到注册中心IP
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: 返回注册中心IP(只读)

    1.2.1.9. IBMAGetIbmsServerPort

    函数原型: int IBMAGetIbmsServerPort( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 得到注册中心PORT
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: 返回注册中心PORT(只读)

    1.2.2. 通讯节点类

    1.2.2.1. IBMAGetNodeCount

    函数原型: int IBMAGetNodeCount( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 得到本地配置副本中的通讯节点数量(包含自己)
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: 返回通讯节点数量

    1.2.2.2. IBMAGetThisNode

    函数原型: struct NodeSpaceUnit *IBMAGetThisNode( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 得到自己通讯节点结构信息,需要通过其它函数获取属性
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: 返回自己通讯节点结构信息(只读)

    1.2.2.3. IBMATravelNodes

    函数原型: struct NodeSpaceUnit *IBMATravelNodes( struct IbmaConfigSpace *ibma_config_space , struct NodeSpaceUnit *p_node_unit );
    函数描述: 遍历本地配置副本中所有通讯节点结构信息,需要通过其它函数获取属性
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄<br />struct NodeSpaceUnit *p_node_unit 上一次遍历值,第一次设置为NULL
    返回值: 返回每次遍历的通讯节点结构信息(只读)

    1.2.2.4. IBMAQueryNode

    函数原型: struct NodeSpaceUnit *IBMAQueryNode( struct IbmaConfigSpace *ibma_config_space , char *node );
    函数描述: 查询本地配置副本中指定名字的通讯节点结构信息,需要通过其它函数获取属性
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄<br />char *node 指定通讯节点名
    返回值: 返回指定名字的通讯节点结构信息(只读)

    1.2.2.5. IBMAGetNodePtr

    函数原型: char *IBMAGetNodePtr( struct NodeSpaceUnit *p_node_unit );
    函数描述: 从通讯节点结构信息中获取节点名
    函数说明: struct NodeSpaceUnit *p_node_unit 通讯节点结构信息
    返回值: 返回节点名(只读)

    1.2.2.6. IBMAGetNodeInvalid

    函数原型: char IBMAGetNodeInvalid( struct NodeSpaceUnit *p_node_unit );
    函数描述: 从通讯节点结构信息中获取节点是否被禁用
    函数说明: struct NodeSpaceUnit *p_node_unit 通讯节点结构信息
    返回值: 返回0表示该节点可用,返回非0表示该节点禁用

    1.2.2.7. IBMAGetNodeHostCount

    函数原型: int IBMAGetNodeHostCount( struct NodeSpaceUnit *p_node_unit );
    函数描述: 从通讯节点结构信息中获取节点的主机集群数量
    函数说明: struct NodeSpaceUnit *p_node_unit 通讯节点结构信息
    返回值: 返回主机集群数量

    1.2.2.8. IBMAGetNodeEncryptKeyExpPtr

    函数原型: char *IBMAGetNodeEncryptKeyExpPtr( struct NodeSpaceUnit *p_node_unit )
    函数描述: 从通讯节点结构信息中获取节点的通讯节点密钥
    函数说明: struct NodeSpaceUnit *p_node_unit 通讯节点结构信息
    返回值: 返回通讯节点密钥

    1.2.2.9. IBMAGetNodeOldKeyDisableTimestamp

    函数原型: int IBMAGetNodeOldKeyDisableTimestamp( struct NodeSpaceUnit *p_node_unit )
    函数描述: 从通讯节点结构信息中获取节点的旧密钥失效时间戳
    函数说明: struct NodeSpaceUnit *p_node_unit 通讯节点结构信息
    返回值: 返回旧密钥失效时间戳

    1.2.2.10. IBMAGetNodeNewKeyEnableTimestamp

    函数原型: int IBMAGetNodeNewKeyEnableTimestamp( struct NodeSpaceUnit *p_node_unit )
    函数描述: 从通讯节点结构信息中获取节点的新密钥生效时间戳
    函数说明: struct NodeSpaceUnit *p_node_unit 通讯节点结构信息
    返回值: 返回新密钥生效时间戳

    1.2.3. 通讯节点主机集群类

    1.2.3.1. IBMATravelNodeHosts

    函数原型: struct HostSpaceUnit *IBMATravelNodeHosts( struct IbmaConfigSpace *ibma_config_space , struct NodeSpaceUnit *p_node_unit , struct HostSpaceUnit *p_host_unit );
    函数描述: 遍历本地配置副本中的指定通讯节点的主机信息
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄<br />struct NodeSpaceUnit *p_node_unit 通讯节点结构信息<br />struct HostSpaceUnit *p_host_unit 上一次主机信息结构指针,第一次设置为NULL
    返回值: 遍历指定通讯节点的主机信息

    1.2.3.2. IBMAQueryNodeHost

    函数原型: struct HostSpaceUnit *IBMAQueryNodeHost( struct IbmaConfigSpace *ibma_config_space , struct NodeSpaceUnit *p_node_unit , char *ip , int port );
    函数描述: 查询指定通讯节点的主机信息结构
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄<br />struct NodeSpaceUnit *p_node_unit 通讯节点结构信息<br />char *ip 主机IP<br />int port 主机PORT
    返回值: 查询指定通讯节点的主机信息

    1.2.3.3. IBMAGetHostIpPtr

    函数原型: char *IBMAGetHostIpPtr( struct HostSpaceUnit *p_host_unit );
    函数描述: 得到主机信息结构中的IP
    函数说明: struct HostSpaceUnit *p_host_unit主机结构信息
    返回值: 主机信息结构IP

    1.2.3.4. IBMAGetHostPort

    函数原型: int IBMAGetHostPort( struct HostSpaceUnit *p_host_unit );
    函数描述: 得到主机信息结构中的PORT
    函数说明: struct HostSpaceUnit *p_host_unit 主机结构信息
    返回值: 主机信息结构PORT

    1.2.3.5. IBMAGetHostLoad

    函数原型: int IBMAGetHostLoad( struct HostSpaceUnit *p_host_unit );
    函数描述: 得到主机信息结构中的当前负载
    函数说明: struct HostSpaceUnit *p_host_unit 主机结构信息
    返回值: 主机信息结构当前负载

    1.2.3.6. IBMASetHostLoad

    函数原型: void IBMASetHostLoad( struct HostSpaceUnit *p_host_unit , int load , int loop );
    函数描述: 设置主机信息结构中的当前负载
    函数说明: struct HostSpaceUnit *p_host_unit 主机结构信息<br />int load 负载值<br />int loop 是否循环标志
    返回值: 设置主机信息结构的负载

    1.2.3.7. IBMAGetHostInvalid

    函数原型: char IBMAGetHostInvalid( struct HostSpaceUnit *p_host_unit );
    函数描述: 得到主机信息结构中的有效性
    函数说明: struct HostSpaceUnit *p_host_unit 主机结构信息
    返回值: 主机信息结构有效性

    1.2.3.8. IBMAGetHostRetryConnectTimestamp

    函数原型: time_t IBMAGetHostRetryConnectTimestamp( struct HostSpaceUnit *p_host_unit );
    函数描述: 得到主机重连时间戳
    函数说明: struct HostSpaceUnit *p_host_unit 主机结构信息
    返回值: 主机重连时间戳

    1.2.4. 交易码信息类

    1.2.4.1. IBMAGetAppCount

    函数原型: int IBMAGetAppCount( struct IbmaConfigSpace *ibma_config_space );
    函数描述: 得到本地配置副本中的交易码数量(包含自己)
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄
    返回值: 返回交易码数量

    1.2.4.2. IBMATravelApps

    函数原型: struct AppSpaceUnit *IBMATravelApps( struct IbmaConfigSpace *ibma_config_space , struct AppSpaceUnit *p_app_unit );
    函数描述: 遍历本地配置副本中所有交易码结构信息,需要通过其它函数获取属性
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄<br />struct AppSpaceUnit *p_app_unit 上一次遍历值,第一次设置为NULL
    返回值: 返回每次遍历的交易码结构信息(只读)

    1.2.4.3. IBMAQueryApp

    函数原型: struct AppSpaceUnit *IBMAQueryApp( struct IbmaConfigSpace *ibma_config_space , char *app );
    函数描述: 查询本地配置副本中指定名字的交易码结构信息,需要通过其它函数获取属性
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄<br />char *app 指定交易码
    返回值: 返回指定名字的交易码结构信息(只读)

    1.2.4.4. IBMAGetAppPtr

    函数原型: char *IBMAGetAppPtr( struct AppSpaceUnit *p_app_unit );
    函数描述: 得到交易码信息结构中的IP
    函数说明: struct AppSpaceUnit *p_app_unit 交易码信息结构
    返回值: 交易码信息结构中的交易码

    1.2.4.5. IBMAGetAppDescPtr

    函数原型: char *IBMAGetAppDescPtr( struct AppSpaceUnit *p_app_unit );
    函数描述: 得到交易码信息结构中的描述
    函数说明: struct AppSpaceUnit *p_app_unit 交易码信息结构
    返回值: 交易码信息结构中的描述

    1.2.4.6. IBMAGetAppBinPtr

    函数原型: char *IBMAGetAppBinPtr( struct AppSpaceUnit *p_app_unit );
    函数描述: 得到交易码信息结构中的应用包名
    函数说明: struct AppSpaceUnit *p_app_unit 交易码信息结构
    返回值: 交易码信息结构中的应用包名

    1.2.4.7. IBMAGetAppTimeout

    函数原型: int IBMAGetAppTimeout( struct AppSpaceUnit *p_app_unit );
    函数描述: 得到交易码信息结构中的超时值
    函数说明: struct AppSpaceUnit *p_app_unit 交易码信息结构
    返回值: 交易码信息结构中的超时值<br />

    1.2.4.8. IBMAGetAppTimeout2

    函数原型: int IBMAGetAppTimeout2( struct AppSpaceUnit *p_app_unit );
    函数描述: 得到交易码信息结构中的timeout2值
    函数说明: struct AppSpaceUnit *p_app_unit 交易码信息结构
    返回值: 交易码信息结构中的timeout2值

    1.2.4.9. IBMAGetAppServerNodePtr

    函数原型: char *IBMAGetAppServerNodePtr( struct AppSpaceUnit *p_app_unit );
    函数描述: 得到交易码信息结构中的服务节点
    函数说明: struct AppSpaceUnit *p_app_unit 交易码信息结构
    返回值: 交易码信息结构中的服务节点

    1.2.5. 应用自定义KV配置类

    1.2.5.1. IBMATravelNodeKvs

    函数原型: struct KvSpaceUnit *IBMATravelNodeKvs( struct IbmaConfigSpace *ibma_config_space , struct KvSpaceUnit *p_kv_unit );
    函数描述: 遍历本地配置副本中的本节点的key-value信息
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄<br />struct KvSpaceUnit * p_kv_unit 上一次key-value信息结构指针,第一次设置为NULL
    返回值: 遍历本节点的key-value信息

    1.2.5.2. IBMAQueryNodekv

    函数原型: struct KvSpaceUnit *IBMAQueryNodekv( struct IbmaConfigSpace *ibma_config_space , char *p_kv_key );
    函数描述: 查询本节点的key-value信息结构
    函数说明: struct IbmaConfigSpace *ibma_config_space 配置共享内存句柄<br />char *p_kv_key key-value中key信息
    返回值: 查询本节点的key-value信息

    1.2.5.3. IBMAGetKvKeyPtr

    函数原型: char *IBMAGetKvKeyPtr( struct KvSpaceUnit *p_kv_unit );
    函数描述: 得到key-value信息结构中的key
    函数说明: struct KvSpaceUnit * p_kv_unit key-value结构信息
    返回值: key-value结构中的key

    1.2.5.4. IBMAGetKvValuePtr

    函数原型: char *IBMAGetKvValuePtr( struct KvSpaceUnit *p_kv_unit );
    函数描述: 得到key-value信息结构中的value
    函数说明: struct KvSpaceUnit * p_kv_unit key-value结构信息
    返回值: key-value结构中的value

    1.2.5.5. IBMAGetNodeKvCount

    函数原型: int IBMAGetNodeKvCount( struct NodeSpaceUnit *p_node_unit );
    函数描述: 得到本地配置副本中的key-value数量(包含自己)
    函数说明: struct NodeSpaceUnit *p_node_unit通讯节点结构信息
    返回值: 返回本节点key-value信息

    1.3. 通讯客户端API接口

    1.3.1. 环境类

    1.3.1.1. IBACCreateEnvirment

    函数原型: struct IbacApiEnv *IBACCreateEnvirment( char *config_filename );
    函数描述: 创建通讯客户端API环境
    函数说明: char *config_filename 注册代理主配置文件
    返回值: 成功则返回通讯客户端API环境,失败则返回NULL

    1.3.1.2. IBACDestroyEnvirment

    函数原型: void IBACDestroyEnvirment( struct IbacApiEnv *p_env );
    函数描述: 销毁通讯客户端API环境
    函数说明: struct IbacApiEnv *p_env 通讯客户端API环境结构
    返回值: (无)

    1.3.1.3. IBACCreateMultiEnvirments

    函数原型: struct IbacMultiEnvs *IBACCreateMultiEnvirments( char *config_filename , int count );
    函数描述: 创建通讯客户端并行交易API环境
    函数说明: char *config_filename 注册代理主配置文件<br />int count 并行交易数量
    返回值: 成功则返回通讯客户端并行交易API环境,失败则返回NULL

    1.3.1.4. IBACDestroyMultiEnvirments

    函数原型: void IBACDestroyMultiEnvirments( struct IbacMultiEnvs *p_multi_envs );
    函数描述: 销毁通讯客户端并行交易API环境
    函数说明: struct IbacMultiEnvs *p_multi_env 通讯客户端并行交易API环境结构
    返回值: (无)

    1.3.2. 请求类(中层)

    1.3.2.1. IBACRequester

    函数原型: int IBACRequester( struct IbacApiEnv *p_env , char *node , char *app , char **pp_msg , int *p_msg_len , ... );
    函数描述: 连接服务端,发送接收交易,断开服务
    函数说明: struct IbacApiEnv *p_env 通讯客户端环境结构<br />char *node 服务端通讯节点名<br />char *app 交易码<br />char **pp_msg 输入时指向请求报文首地址的指针,输出时指向响应报文首地址的指针<br />int *p_msg_len 输入时存放请求报文大小,输出时存放响应报文大小<br />... 请求文件名字符串列表和响应文件名字符串列表(无请求响应文件时填"NULL,NULL",有一个请求文件无响应文件时填"req_pathfilename,NULL,NULL",无请求文件有一个响应文件时填"NULL,rsp_pathfilename,NULL",同时又请求响应文件时填"req_pathfilename,NULL,rsp_pathfilename,NULL"),如果字符串为空则跳过
    返回值: 成功则0,失败则返回非0

    1.3.3. 请求类(低层)

    1.3.3.1. IBACConnect

    函数原型: int IBACConnect( struct IbacApiEnv *ibac_api_env , char *node );
    函数描述: 连接服务端主机
    函数说明: struct IbacApiEnv *p_env 通讯客户端环境结构<br />char *node 服务端通讯节点名
    返回值: 成功则0,失败则返回非0

    1.3.3.2. IBACSendRequestAndReceiveResponse

    函数原型: int IBACSendRequestAndReceiveResponse( struct IbacApiEnv *ibac_api_env , char *app , char **pp_msg , int *p_msg_len , ... );
    函数描述: 发送请求到服务端主机并同步接收响应
    函数说明: struct IbacApiEnv *p_env 通讯客户端环境结构<br />char *app 交易码<br />char **pp_msg 输入时指向请求报文首地址的指针,输出时指向响应报文首地址的指针<br />int *p_msg_len 输入时存放请求报文大小,输出时存放响应报文大小<br />... 请求文件名字符串列表和响应文件名字符串列表(无请求响应文件时填"NULL,NULL",有一个请求文件无响应文件时填"req_pathfilename,NULL,NULL",无请求文件有一个响应文件时填"NULL,rsp_pathfilename,NULL",同时又请求响应文件时填"req_pathfilename,NULL,rsp_pathfilename,NULL"),如果字符串为空则跳过
    返回值: 成功则0,失败则返回非0

    1.3.3.3. IBACDisconnect

    函数原型: int IBACDisconnect( struct IbacApiEnv *ibac_api_env );
    函数描述: 断开服务端主机
    函数说明: struct IbacApiEnv *p_env 通讯客户端环境结构
    返回值: 成功则0,失败则返回非0

    1.3.3.4. IBACMultiConnect

    函数原型: int IBACMultiConnect( struct IbacMultiEnvs *p_multi_envs , struct IbacMultiRequesters *multi_requesters );
    函数描述: 并行连接通讯服务端
    函数说明: struct IbacMultiEnvs *p_multi_envs通讯客户端并行交易API环境结构<br />struct IbacMultiRequesters *multi_requesters 并行交易配置
    返回值: 成功则0,失败则返回非0

    1.3.3.5. IBACMultiSendRequestsAndReceiveResponses

    函数原型: int IBACMultiSendRequestsAndReceiveResponses( struct IbacMultiEnvs *p_multi_envs , struct IbacMultiRequesters *multi_requesters );
    函数描述: 发送并行交易请求并接收响应
    函数说明: struct IbacMultiEnvs *p_multi_envs通讯客户端并行交易API环境结构<br />struct IbacMultiRequesters *multi_requesters 并行交易配置
    返回值: 成功则0,失败则返回非0

    1.3.3.6. IBACMultiSendCommitOrRollbackAndReceiveResponses

    函数原型: int IBACMultiSendCommitOrRollbackAndReceiveResponses( struct IbacMultiEnvs *p_multi_envs , struct IbacMultiRequesters *multi_requesters , int commit_or_rollback_flag );
    函数描述: 发送二阶段提交或回滚请求并接收响应
    函数说明: struct IbacMultiEnvs *p_multi_envs通讯客户端并行交易API环境结构<br />struct IbacMultiRequesters *multi_requesters 并行交易配置<br />int commit_or_rollback_flag 并行提交宏IBAC_MULTI_COMMIT_DATABASE 或 并行回滚宏IBAC_MULTI_ROLLBACK_DATABASE
    返回值: 成功则0,失败则返回非0

    1.3.3.7. IBACMultiDisconnect

    函数原型: void IBACMultiDisconnect( struct IbacMultiEnvs *p_multi_envs , struct IbacMultiRequesters *multi_requesters );
    函数描述: 并行断开通讯服务端
    函数说明: struct IbacMultiEnvs *p_multi_envs通讯客户端并行交易API环境结构<br />struct IbacMultiRequesters *multi_requesters 并行交易配置
    返回值: (无)

    1.4. 通讯服务端API接口

    1.4.1. 信息查询类

    1.4.1.1. IBASGetThisNode

    函数原型: const char *IBASGetThisNode( struct IbasEnv *p_env );
    函数描述: 得到本通讯节点名
    函数说明: struct IbasEnv *p_env 通讯服务端环境结构
    返回值: 本通讯节点名(只读)

    1.4.1.2. IBASGetThisApp

    函数原型: const char *IBASGetThisApp( struct IbasEnv *p_env );
    函数描述: 得到当前交易码
    函数说明: struct IbasEnv *p_env 通讯服务端环境结构
    返回值: 当前交易码(只读)

    1.4.1.3. IBASSendResponseAhead

    函数原型: int IBASSendResponseAhead();
    函数描述: 提前发送响应
    函数说明: (无)
    返回值: 0表示成功;非0表示失败

    1.4.1.4. IBASGetClientNode

    函数原型: const char *IBASGetClientNode();
    函数描述: 得到客户端节点
    函数说明: (无)
    返回值: 客户端节点

    1.4.1.5. IBASGetClientIp

    函数原型: const char *IBASGetClientIp();
    函数描述: 得到客户端IP
    函数说明: (无)
    返回值: 客户端节点

    1.4.1.6. IBASGetClientPort

    函数原型: const int IBASGetClientPort()
    函数描述: 得到客户端访问端口
    函数说明: (无)
    返回值: 客户端访问端口

    1.4.1.7. IBASGetCommJnlsno

    函数原型: const char *IBASGetCommJnlsno();
    函数描述: 得到客户端流水号
    函数说明: (无)
    返回值: 客户端流水号

    1.4.1.8. IBASGetThisAppCommTimeout

    函数原型: int IBASGetThisAppCommTimeout();
    函数描述: 得到客户端通讯超时时间
    函数说明: (无)
    返回值: 通讯超时时间

    1.4.1.9. IBASGetThisAppTimeout

    函数原型: int IBASGetThisAppTimeout();
    函数描述: 得到交易超时时间
    函数说明: (无)
    返回值: 交易超时时间

    1.4.1.10. IBASGetWorkerIndex

    函数原型: int IBASGetWorkerIndex();
    函数描述: 得到工作进程序号
    函数说明: (无)
    返回值: 工作进程序号

    1.4.1.11. IBASGetWorkerProcessCount

    函数原型: int IBASGetWorkerProcessCount();
    函数描述: 得到工作进程数目
    函数说明: (无)
    返回值: 工作进程数目

    1.4.1.12. IBASGetResponseBody

    函数原型: struct HttpBuffer *IBASGetResponseBody();
    函数描述: 得到响应报文体
    函数说明: (无)
    返回值: 响应报文体

    1.4.2. 数据类

    1.4.2.1. IBASGetHttpEnv

    函数原型: struct HttpEnv *IBASGetHttpEnv( struct IbasEnv *p_env );
    函数描述: 得到HTTP协议环境
    函数说明: struct IbasEnv *p_env 通讯服务端环境结构
    返回值: HTTP协议环境

    1.4.2.2. IBASSetTransactionAddonInfo

    函数原型: int IBASSetTransactionAddonInfo( char *busi_channel , char *busi_jnlsno , char *busi_transaction_code , long response_code , char *addon_text );
    函数描述: 设置交易响应信息
    函数说明: char *busi_channel 渠道号<br />char *busi_jnlsno 流水号<br />char *busi_transaction_code 业务交易码<br />long response_code 响应码<br />char *addon_text 附加信息
    返回值: 设置交易响应信息

    1.4.3. 附带文件类

    1.4.3.1. IBASGetRequestFileCount

    函数原型: int IBASGetRequestFileCount( struct IbasAddonFiles *addon_files );
    函数描述: 得到请求附带文件数量
    函数说明: struct IbasAddonFiles *addon_files 附带文件名容器
    返回值: 请求附带文件数量

    1.4.3.2. IBASGetRequestFileById

    函数原型: char *IBASGetRequestFileById( struct IbasAddonFiles *addon_files , char *file_id );
    函数描述: 得到指定文件ID的请求附带文件名
    函数说明: struct IbasAddonFiles *addon_files 附带文件名容器<br />char *file_id
    返回值: 指定文件ID的请求附带文件名

    1.4.3.3. IBASGetResponseFileCount

    函数原型: int IBASGetResponseFileCount( struct IbasAddonFiles *addon_files );
    函数描述: 得到响应附带文件数量
    函数说明: struct IbasAddonFiles *addon_files 附带文件名容器
    返回值: 响应附带文件数量

    1.4.3.4. IBASPutResponseFile

    函数原型: int IBASPutResponseFile( struct IbasAddonFiles *addon_files , char *filename );
    函数描述: 压入响应附带文件名
    函数说明: struct IbasAddonFiles *addon_files 附带文件名容器<br />char *file_id
    返回值: 0表示成功;非0表示失败

    1.4.3.5. IBASGetPathFilename

    函数原型: void IBASGetPathFilename( char *filename , char *pathfilename , int sizeof_pathfilename );
    函数描述: 给定附加文件名,返回追加绝对路径的附带文件名
    函数说明: char *filename 附加文件名<br />char *pathfilename 追加绝对路径的附带文件名<br />int sizeof_pathfilename 追加绝对路径的附带文件名缓冲区大小
    返回值: (无)

    1.4.3.6. IBASGetEnv

    函数原型: struct IbasEnv *IBASGetEnv();
    函数描述: 得到ibas主环境结构
    函数说明: (无)
    返回值: ibas主环境结构

    1.5. 报文转换层API接口

    1.5.1. 交易发起类

    1.5.1.1. IBMSGVSendRequestAndReceiveResponse_JSON

    函数原型: int IBMSGVSendRequestAndReceiveResponse_JSON( struct IbacEnv *p_env , char *app , void *pv_req_st , DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func , void *pv_rsp_st , DSCDESERIALIZE_JSON_xxx_V *p_unpack_func , ... );
    函数描述: 打包JSON报文,发送接收通讯报文,解包JSON报文
    函数说明: struct IbacApiEnv *p_env 通讯客户端环境结构<br />char *app 交易码<br />void *pv_req_st 请求结构体<br />DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func打包JSON报文函数<br />void *pv_rsp_st 响应结构体<br />DSCDESERIALIZE_JSON_xxx_V *p_unpack_func 解包JSON报文函数<br />... 请求文件名字符串列表和响应文件名字符串列表(具体见通讯客户端API)
    返回值: 成功则返回0,失败则返回非0

    1.5.1.2. IBMSGVRequester_JSON

    函数原型: int IBMSGVRequester_JSON( struct IbacApiEnv *p_env , char *node , char *app , void *pv_req_st , DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func , void *pv_rsp_st , DSCDESERIALIZE_JSON_xxx_V *p_unpack_func , ... );
    函数描述: 连接服务端,打包JSON报文,发送接收通讯报文,解包JSON报文,断开服务
    函数说明: struct IbacApiEnv *p_env 通讯客户端环境结构<br />char *node 服务端通讯节点名<br />char *app 交易码<br />void *pv_req_st 请求结构体<br />DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func打包JSON报文函数<br />void *pv_rsp_st 响应结构体<br />DSCDESERIALIZE_JSON_xxx_V *p_unpack_func 解包JSON报文函数<br />... 请求文件名字符串列表和响应文件名字符串列表(具体见通讯客户端API)
    返回值: 成功则0,失败则返回非0

    1.5.1.3. IBMSGVCall_JSON

    函数原型: int IBMSGVCall_JSON( struct IbacApiEnv *ibac_api_env , char *app , void *pv_req_st , DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func , void *pv_rsp_st , DSCDESERIALIZE_JSON_xxx_V *p_unpack_func , ... );
    函数描述: 创建通讯客户端API环境,连接服务端,打包JSON报文,发送接收通讯报文,解包JSON报文,断开服务,销毁通讯客户端API环境
    函数说明: struct IbacApiEnv *p_env 通讯客户端环境结构<br />char *app 交易码<br />void *pv_req_st 请求结构体<br />DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func打包JSON报文函数<br />void *pv_rsp_st 响应结构体<br />DSCDESERIALIZE_JSON_xxx_V *p_unpack_func 解包JSON报文函数<br />... 请求文件名字符串列表和响应文件名字符串列表(具体见通讯客户端API)
    返回值: 成功则0,失败则返回非0<br />

    1.5.2. 交易接收类

    1.5.2.1. IBMSGVReceiver_JSON

    函数原型: int IBMSGVReceiver_JSON( struct HttpBuffer *req_buf , DSCDESERIALIZE_JSON_xxx_V *p_unpack_func , void *pv_req_st , struct HttpBuffer *rsp_buf , DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func , void *pv_rsp_st , funcIbmsgvTransmain *p_transmain_func , struct IbasAddonFiles *addon_files );
    函数描述: 解包JSON报文,调用回调函数transmain,打包JSON报文
    函数说明: struct HttpBuffer *req_buf 请求报文缓冲区<br />DSCDESERIALIZE_JSON_xxx_V *p_unpack_func 解包JSON报文函数<br />void *pv_req_st 请求结构体<br />struct HttpBuffer *rsp_buf 响应报文缓冲区<br />DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func 打包JSON报文函数<br />void *pv_rsp_st 响应结构体<br />funcIbmsgvTransmain *p_transmain_func 交易层入口回调函数<br />struct IbasAddonFiles *addon_files 请求和响应附带文件缓冲区,通过ibas_api函数存取
    返回值: 成功则0,失败则返回非0

    1.5.2.2. IBMSGVReceiver_JSON_SendResponseAhead

    函数原型: int IBMSGVReceiver_JSON_SendResponseAhead<br />( DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func , void *pv_rsp_st );
    函数描述: 打包JSON报文,通讯发送响应
    函数说明: DSCSERIALIZE_JSON_DUP_xxx_V *p_pack_func 打包JSON报文函数<br />void *pv_rsp_st 响应结构体
    返回值: 成功则0,失败则返回非0<br />

    1.6. 交易管理层API接口

    1.6.1. 分阶段模板类

    1.6.1.1. IBTSExecuteSchedule_BT_PC_BP_AP_AT

    函数原型: int IBTSExecuteSchedule_BT_PC_BP_AP_AT( char *req_msg_name , int sizeof_req_msg , void *p_req_st , char *rsp_msg_name , int sizeof_rsp_msg , void *p_rsp_st , struct IbasAddonFiles *addon_files , char *trans_code , char *response_code , int response_code_bufsize , char *response_desc , int response_desc_bufsize , TransFunc *TF_HeaderMapping , TransFunc *TF_InsertTransList , TransFunc *TF_UpdateTransList , struct TransSchedule_BT_PC_BP_AP_AT *p_ts );
    函数描述: 数据库事务(交易前处理)(如果报错跳到交易后处理),<br />数据库事务(公共检查)(如果报错跳到交易后处理),<br />数据库事务(业务检查、业务处理、账务处理)(如果报错跳到交易后处理),<br />数据库事务(交易后处理)(如果报错则结束)
    函数说明: char *req_msg_name 请求结构体名称<br />int sizeof_req_msg 请求结构体大小<br />void *p_req_st 请求结构体<br />char *rsp_msg_name 响应结构体名称<br />int sizeof_rsp_msg 响应结构体大小<br />void *p_rsp_st 响应结构体<br />struct IbasAddonFiles *addon_files 请求和响应附带文件缓冲区<br />char *trans_code 业务交易码<br />char *response_code 响应码缓冲区<br />int response_code_bufsize 响应码缓冲区大小<br />char *response_desc 响应描述缓冲区<br />int response_desc_bufsize 响应描述缓冲区大小<br />TransFunc *TF_HeaderMapping 填充translist结构函数(注: IB2和IB1填充TF_BT_InsertTransListHeaderMapping即可,IB1自定义)<br />TransFunc *TF_InsertTransList 登记业务流水表函数<br />TransFunc *TF_UpdateTransList 更新业务流水表函数<br />struct TransSchedule_BT_PC_BP_AP_AT *p_ts 分阶段模板配置
    返回值: 成功则返回0,失败则返回非0

    1.6.1.2. IBTSRecursiveSchedule_BT_PC_BP_AP_AT

    函数原型: int IBTSRecursiveSchedule_BT_PC_BP_AP_AT( struct TransEnv *p_te , TransFunc *TF_HeaderMapping , TransFunc *TF_InsertTransList , TransFunc *TF_UpdateTransList , struct TransSchedule_BT_PC_BP_AP_AT *p_ts );<br /> <br />
    函数描述: 递归子交易分阶段模板
    函数说明: struct TransEnv *p_te 交易环境结构<br />struct TransSchedule_BT_PC_BP_AP_AT *p_ts 分阶段模板配置<br />TransFunc *TF_HeaderMapping 填充translist结构函数(注: IB2和IB1填充TF_BT_InsertTransListHeaderMapping即可,IB1自定义)<br />TransFunc *TF_InsertTransList 登记业务流水表函数<br />TransFunc *TF_UpdateTransList 更新业务流水表函数<br />
    返回值: 成功则返回0,失败则返回非0

    1.6.1.3. IBTSExecuteSchedule_BT_PC_RI_BP_AP_AT

    函数原型: int IBTSExecuteSchedule_BT_PC_BP_RI_AP_AT( char *req_msg_name , int sizeof_req_msg , void *p_req_st , char *rsp_msg_name , int sizeof_rsp_msg , void *p_rsp_st , struct IbasAddonFiles *addon_files , char *trans_code , char *response_code , int response_code_bufsize , char *response_desc , int response_desc_bufsize , TransFunc *TF_HeaderMapping , TransFunc *TF_InsertTransList , TransFunc *TF_UpdateTransList , struct TransSchedule_BT_PC_BP_RI_AP_AT *p_ts );
    函数描述: 数据库事务(交易前处理)(如果报错跳到交易后处理),<br />数据库事务(公共检查)(如果报错跳到交易后处理),<br />数据库事务(业务检查、请求联动交易、业务处理、账务处理)(如果报错跳到交易后处理),<br />数据库事务(交易后处理)(如果报错则结束)
    函数说明: char *req_msg_name 请求结构体名称<br />int sizeof_req_msg 请求结构体大小<br />void *p_req_st 请求结构体<br />char *rsp_msg_name 响应结构体名称<br />int sizeof_rsp_msg 响应结构体大小<br />void *p_rsp_st 响应结构体<br />struct IbasAddonFiles *addon_files 请求和响应附带文件缓冲区<br />char *trans_code 业务交易码<br />char *response_code 响应码缓冲区<br />int response_code_bufsize 响应码缓冲区大小<br />char *response_desc 响应描述缓冲区<br />int response_desc_bufsize 响应描述缓冲区大小<br />TransFunc *TF_HeaderMapping 填充translist结构函数(注: IB2和IB1填充TF_BT_InsertTransListHeaderMapping即可,IB1自定义)<br />TransFunc *TF_InsertTransList 登记业务流水表函数<br />TransFunc *TF_UpdateTransList 更新业务流水表函数<br />struct TransSchedule_BT_PC_BP_RI_AP_AT *p_ts 分阶段模板配置
    返回值: 成功则返回0,失败则返回非0

    1.6.1.4. IBTSRecursiveSchedule_BT_PC_BP_RI_AP_AT

    函数原型: int IBTSRecursiveSchedule_BT_PC_BP_RI_AP_AT( struct TransEnv *p_te , TransFunc *TF_HeaderMapping , TransFunc *TF_InsertTransList , TransFunc *TF_UpdateTransList , struct TransSchedule_BT_PC_BP_RI_AP_AT *p_ts );
    函数描述: 递归子交易分阶段模板
    函数说明: struct TransEnv *p_te 交易环境结构<br />struct TransSchedule_BT_PC_BP_RI_AP_AT *p_ts 分阶段模板配置<br />TransFunc *TF_HeaderMapping 填充translist结构函数(注: IB2和IB1填充TF_BT_InsertTransListHeaderMapping即可,IB1自定义)<br />TransFunc *TF_InsertTransList 登记业务流水表函数<br />TransFunc *TF_UpdateTransList 更新业务流水表函数
    返回值: 成功则返回0,失败则返回非0

    1.6.1.5. IBTSExecuteSchedule_BT_PC_BP_AT__AP

    函数原型: int IBTSExecuteSchedule_BT_PC_BP_AT_AP( char *req_msg_name , int sizeof_req_msg , void *p_req_st , char *rsp_msg_name , int sizeof_rsp_msg , void *p_rsp_st , struct IbasAddonFiles *addon_files , char *trans_code , char *response_code , int response_code_bufsize , char *response_desc , int response_desc_bufsize , TransFunc *TF_HeaderMapping , TransFunc *TF_InsertTransList , TransFunc *TF_UpdateTransList , struct TransSchedule_BT_PC_BP_AT_AP *p_ts );
    函数描述: 数据库事务(交易前处理)(如果报错跳到交易后处理),<br />数据库事务(公共检查)(如果报错跳到交易后处理),<br />数据库事务(交易后处理)(如果报错则结束),<br />数据库事务(业务检查、业务处理、账务处理)(如果报错则结束)
    函数说明: char *req_msg_name 请求结构体名称<br />int sizeof_req_msg 请求结构体大小<br />void *p_req_st 请求结构体<br />char *rsp_msg_name 响应结构体名称<br />int sizeof_rsp_msg 响应结构体大小<br />void *p_rsp_st 响应结构体<br />struct IbasAddonFiles *addon_files 请求和响应附带文件缓冲区<br />char *trans_code 业务交易码<br />char *response_code 响应码缓冲区<br />int response_code_bufsize 响应码缓冲区大小<br />char *response_desc 响应描述缓冲区<br />int response_desc_bufsize 响应描述缓冲区大小<br />TransFunc *TF_HeaderMapping 填充translist结构函数(注: IB2和IB1填充TF_BT_InsertTransListHeaderMapping即可,IB1自定义)<br />TransFunc *TF_InsertTransList 登记业务流水表函数<br />TransFunc *TF_UpdateTransList 更新业务流水表函数<br />struct TransSchedule_BT_PC_BP_AT_AP *p_ts 分阶段模板配置
    返回值: 成功则返回0,失败则返回非0

    1.6.1.6. IBTSRecursiveSchedule_BT_PC_BP_AP_AT

    函数原型: int IBTSRecursiveSchedule_BT_PC_BP_AT_AP( struct TransEnv *p_te , TransFunc *TF_HeaderMapping , TransFunc *TF_InsertTransList , TransFunc *TF_UpdateTransList , struct TransSchedule_BT_PC_BP_AT_AP *p_ts );
    函数描述: 递归子交易分阶段模板
    函数说明: struct TransEnv *p_te 交易环境结构<br />struct TransSchedule_BT_PC_BP_AT_AP *p_ts 分阶段模板配置<br />TransFunc *TF_HeaderMapping 填充translist结构函数(注: IB2和IB1填充TF_BT_InsertTransListHeaderMapping即可,IB1自定义)<br />TransFunc *TF_InsertTransList 登记业务流水表函数<br />TransFunc *TF_UpdateTransList 更新业务流水表函数
    返回值: 成功则返回0,失败则返回非0

    1.6.2. 得到配置信息类

    1.6.2.1. IBTMGetFuncParaPtr

    函数原型: char *IBTMGetFuncParaPtr( struct TransEnv *p_te );
    函数描述: 得到函数树配置中的函数参数
    函数说明: struct TransEnv *p_te 交易环境
    返回值: 返回函数树配置中的函数参数

    1.6.3. 设置响应信息类

    1.6.3.1. IBTMFormatResponseCode

    函数原型: int IBTMFormatResponseCode( struct TransEnv *p_te , int response_code );
    函数描述: 设置响应码到交易环境中的响应码字段(调用分阶段执行引擎指定)中
    函数说明: struct TransEnv *p_te 交易环境<br />int response_code 响应码
    返回值: 返回输入参数response_code的值

    1.6.3.2. IBTMFormatResponseCode

    函数原型: int IBTMFormatResponseCode( struct TransEnv *p_te , int response_code );
    函数描述: 设置响应码到交易环境中的响应码字段(调用分阶段执行引擎指定)中
    函数说明: struct TransEnv *p_te 交易环境<br />int response_code 响应码
    返回值: 返回输入参数response_code的值

    1.6.3.3. IBTMFormatResponseDesc

    函数原型: void IBTMFormatResponseDesc( struct TransEnv *p_te , char *response_desc_format , ... );
    函数描述: 设置响应描述到交易环境中的响应码字段(调用分阶段执行引擎指定)中
    函数说明: struct TransEnv *p_te 交易环境<br />char *response_desc_format , ... 响应描述可变参数列表
    返回值: (无)

    1.6.3.4. IBTMFormatResponseInfo

    函数原型: int IBTMFormatResponseInfo( struct TransEnv *p_te , int response_code , char *response_desc_format , ... );
    函数描述: 设置响应码和响应描述到交易环境中的响应码字段(调用分阶段执行引擎指定)中
    函数说明: struct TransEnv *p_te 交易环境<br />int response_code 响应码<br />char *response_desc_format , ... 响应描述可变参数列表
    返回值: 返回输入参数response_code的值

    1.6.4. 结构体树类

    1.6.4.1. IBTMAppendStructBlock

    函数原型: int IBTMAppendStructBlock( struct TransEnv *tpe , char *name , long struct_size , void **ppmem );
    函数描述: 挂接一个结构体到结构体树中
    函数说明: struct TransEnv *p_te 交易环境<br />char *name 结构体名字(最长64字符)<br />long struct_size 结构体大小<br />void *ppmem 如果(ppmem)==NULL则自动分配内存用以存放该结构体
    返回值: 成功则返回0,失败则返回非0

    1.6.4.2. IBTMGetStructBlock

    函数原型: int IBTMGetStructBlock( struct TransEnv *tpe , char *name , long struct_size , void **ppmem );
    函数描述: 从结构体树中获取一个结构体
    函数说明: struct TransEnv *p_te 交易环境<br />char *name 结构体名字(最长64字符)<br />long struct_size 结构体大小<br />void *ppmem 返回成功时,(ppmem)指向该结构体
    返回值: 成功则返回0,失败则返回非0

    1.6.4.3. IBTMAppendGetStructBlock

    函数原型: int IBTMAppendGetStructBlock( struct TransEnv *tpe , char *name , long struct_size , void **ppmem );
    函数描述: 从结构体树中获取一个结构体,如果没有就挂接一个
    函数说明: struct TransEnv *p_te 交易环境<br />char *name 结构体名字(最长64字符)<br />long struct_size 结构体大小<br />void *ppmem如果(ppmem)==NULL则自动分配内存用以存放该结构体
    返回值: 成功则返回0,失败则返回非0

    1.6.5. 动态结构体类

    1.6.5.1. DS_NEW

    宏使用示例: DS *ds = DS_NEW( "struct_name" ) ;
    函数描述: 创建一个动态结构体。动态结构体用于在应用模块之间安全的交换数据
    函数说明: 动态结构体名称
    返回值: 成功则返回动态结构体,失败则返回NULL

    1.6.5.2. DS_ADD

    宏使用示例: DS_TRY(ds)<br />{ <br /> DS_ADD( ds , char , char_field , 0x30 ); <br /> DS_ADD( ds , int , int_field , 123 );<br /> DS_ADD( ds , long , long_field , 45678 );<br /> DS_ADD( ds , float , float_field , 123.0 );<br /> DS_ADD( ds , double , double_field , 456.789 );<br /> DS_ADD( ds , char* , string_field , "hello" );<br />} <br />DS_CATCH(ds)<br />{ <br /> ERRORLOGG( "DS_ADD failed , LINE[%d] FIELD_NAME[%s] ERROR[%d]" , DSGetLastSourceLine(ds) , DSGetFieldName(ds) , DSGetLastError(ds) )<br /> DS_DELETE ( ds );<br /> return -1;<br />}
    函数描述: 往动态结构体中添加变量字段并直接赋值
    函数说明: 动态结构体、变量类型、变量名、变量值
    返回值: 全部ADD成功则跳到DS_CATCH后面,有一个ADD失败则跳到DS_CATCH里面

    1.6.5.3. DS_SET

    宏使用示例: DS_TRY(ds)<br />{ <br /> DS_SET( ds , char , char_field , 0x30 ); <br /> DS_SET( ds , int , int_field , 123 );<br /> DS_SET( ds , long , long_field , 45678 );<br /> DS_SET( ds , float , float_field , 123.0 );<br /> DS_SET( ds , double , double_field , 456.789 );<br /> DS_SET( ds , char* , string_field , "hello" );<br />} <br />DS_CATCH(ds)<br />{ <br /> ERRORLOGG( "DS_SET failed , LINE[%d] FIELD_NAME[%s] ERROR[%d]" , DSGetLastSourceLine(ds) , DSGetFieldName(ds) , DSGetLastError(ds) )<br /> DS_DELETE( ds );<br /> return -1;<br />}
    函数描述: 设置值到动态结构体中的变量字段中
    函数说明: 动态结构体、变量类型、变量名、变量值
    返回值: 全部SET成功则跳到DS_CATCH后面,有一个SET失败则跳到DS_CATCH里面

    1.6.5.4. DS_GET

    宏使用示例: DS_TRY(ds)<br />{ <br /> DS_GET( ds , char , char_field , ch ); <br /> DS_GET( ds , int , int_field , i );<br /> DS_GET( ds , long , long_field , l );<br /> DS_GET( ds , float , float_field , f );<br /> DS_GET( ds , double , double_field , d );<br /> DS_GET( ds , char* , string_field , buf , sizeof(buf) );<br />} <br />DS_CATCH(ds)<br />{ <br /> ERRORLOGG( "DS_GET failed , LINE[%d] FIELD_NAME[%s] ERROR[%d]" , DSGetLastSourceLine(ds) , DSGetFieldName(ds) , DSGetLastError(ds) )<br /> DS_DELETE( ds );<br /> return -1;<br />}
    函数描述: 从动态结构体中的变量字段中提取值出来
    函数说明: 动态结构体、变量类型、变量名、变量值<br />当类型为字符串时,最后需要再加一个参数设置输出缓冲区大小
    返回值: 全部GET成功则跳到DS_CATCH后面,有一个GET失败则跳到DS_CATCH里面<br />

    1.6.6. 数据库操作类

    1.6.6.1. OpenDatabaseSessions

    函数原型: int OpenDatabaseSessions();
    函数描述: 打开数据库
    函数说明:
    返回值: 成功则返回0,失败则返回非0

    1.6.6.2. CloseDatabaseSessions

    函数原型: int CloseDatabaseSessions();
    函数描述: 关闭数据库
    函数说明:
    返回值: 成功则返回0,失败则返回非0

    1.6.6.3. BeginDatabaseTransaction

    函数原型: int BeginDatabaseTransaction();
    函数描述: 开始数据库事务
    函数说明:
    返回值: 成功则返回0,失败则返回非0

    1.6.6.4. CommitDatabaseTransaction

    函数原型: int CommitDatabaseTransaction();
    函数描述: 提交数据库事务
    函数说明:
    返回值: 成功则返回0,失败则返回非0

    1.6.6.5. RollbackDatabaseTransaction

    函数原型: int RollbackDatabaseTransaction();
    函数描述: 提交回滚数据库事务
    函数说明:

    2. 代码示例

    2.1. 公共API

    2.1.1. 创建临时文件

        char        filename[ IBP_MAXLEN_FILENAME + 1 ] ;
        FILE        *fp = NULL ;
        
        fp = IBPCreateTempFile( "id" , filename , NULL , "w" ) ;
        if( fp == NULL )
        {
            printf( " IBPCreateTempFile failed , errno[%d]\n" , errno );
            return -1;
        }
        ...
        fclose( fp );
        
        nret = IBASPutResponseFile( addon_files , filename ) ;
        if( nret )
        {
            printf( " IBASPutResponseFile failed , errno[%d]\n" , errno );
            return -1;
        }
    

    2.2. 通讯客户端API

    2.2.1. 发起通讯请求(中层)

    test/test_ibpclient/ibp_test_echo/ibp_test_echo.c

    #include "ibac_api.h"
    
    int ibp_test_echo_IBACRequester( char *node , char *app , char *msg )
    {
        struct IbacEnv      *p_env = NULL ;
        
        char            *p_msg = NULL ;
        int         msg_len ;
        
        int         nret = 0 ;
        
        /* 创建通讯客户端环境 */
        p_env = IBACCreateEnvirment( NULL ) ;
        if( p_env == NULL )
        {
            printf( "IBACCreateEnvirment failed , errno[%d]\n" , errno );
            return -1;
        }
        else
        {
            printf( "IBACCreateEnvirment ok\n" );
        }
        
        /* 连接通讯服务端,发送请求,接收响应,断开通讯服务端 */
        /* 向节点node发起交易app,p_msg指向请求报文,交易完成后,响应报文存放在通讯客户端环境中,p_msg指向它 */
        p_msg = msg ;
        msg_len = strlen(msg) ;
        nret = IBACRequester( p_env , node , app , & p_msg , & msg_len , NULL , NULL ) ;
        if( nret )
        {
            printf( "IBACRequester failed[%d] , errno[%d]\n" , nret , errno );
            return -1;
        }
        else
        {
            printf( "IBACRequester ok , msg[%.*s]\n" , msg_len , p_msg );
        }
        
        /* 销毁通讯客户端环境 */
        IBACDestroyEnvirment( p_env );
        printf( "IBACDestroyEnvirment ok\n" );
        
        return 0;
    }
    
    static void usage()
    {
        printf( "USAGE : ibp_test_echo node app msg\n" );
        return;
    }
    
    int main( int argc , char *argv[] )
    {
        int     nret = 0 ;
        
        if( argc == 1 + 3 )
        {
            IBPInitLogEnv( "" , "ibp_test_echo" , "file::log/event.log" , LOG_LEVEL_DEBUG , "file::log/ibp_test_echo.log" );
            nret = ibp_test_echo_IBACRequester( argv[1] , argv[2] , argv[3] ) ;
            IBPCleanLogEnv();
            return -nret;
        }
        else
        {
            usage();
            exit(7);
        }
    }
    

    test/test_ibpclient/ibp_test_echo/makefile

    # 此文件由makeobj.sh自动生成
    ############################################################
    # 项目名 : 
    # 模块名 : 
    # 备  注 : 
    ############################################################
    
    ###### 源文件配置区
    #@ c_FILE
    c_FILE      =   \
                ibp_test_echo.c \
    
    ###### 目标文件、安装目录配置区
    include makeinstall
    BIN     =   ibp_test_echo
    BININST     =   $(_BININST)
    
    ###### 编译选项
    CFLAGS      =   $(_CFLAGS) \
                -std=gnu99 \
                -I$(HOME)/include/ibp \
    
    ###### 链接选项
    LFLAGS      =   $(_LFLAGS) \
                -rdynamic \
                -L$(HOME)/lib \
                -libac_api
    
    ###### 额外宏定义区
    CLEAN_ADDITION  =
    
    ###### 加载mktpl模板库
    #@ make_all
    #@ make_clean
    #@ make_install
    #@ make_install_BININST
    #@ make_install_DFTHDERINST
    #@ make_uninstall
    #@ make_uninstall_BININST
    #@ make_uninstall_DFTHDERINST
    include $(MKTPLDIR)/makeobj_$(MKTPLOS).inc
    
    ###### 目标文件依赖关系
    ibp_test_echo       :   $(c_FILE_o)
        $(CC) -o $@ $(c_FILE_o) $(LFLAGS)
    

    2.2.2. 发起通讯请求(中层)(附带文件)

    test/test_ibpclient/ibp_test_file/ibp_test_file.c

    #include "ibac_api.h"
    
    static int ibp_test_file( char *node , char *msg )
    {
        struct IbacEnv      *p_env = NULL ;
        FILE            *fp = NULL ;
        char            tmp_req_filename1[ IBP_MAXLEN_FILENAME + 1 ] ;
        char            tmp_req_filename2[ IBP_MAXLEN_FILENAME + 1 ] ;
        char            tmp_req_filename3[ IBP_MAXLEN_FILENAME + 1 ] ;
        char            tmp_req_filename4[ IBP_MAXLEN_FILENAME + 1 ] ;
        char            tmp_rsp_filename1[ IBP_MAXLEN_FILENAME + 1 ] ;
        char            tmp_rsp_filename2[ IBP_MAXLEN_FILENAME + 1 ] ;
        char            tmp_rsp_filename3[ IBP_MAXLEN_FILENAME + 1 ] ;
        char            tmp_rsp_filename4[ IBP_MAXLEN_FILENAME + 1 ] ;
        char            *p_msg = NULL ;
        int         msg_len ;
        
        int         nret = 0 ;
        
        /* 创建通讯客户端环境 */
        p_env = IBACCreateEnvirment( NULL ) ;
        if( p_env == NULL )
        {
            printf( "IBACCreateEnvirment failed , errno[%d]\n" , errno );
            return -1;
        }
        else
        {
            printf( "IBACCreateEnvirment ok\n" );
        }
        
        /* 创建请求临时文件1 */
        /* 是个空文件 */
        memset( tmp_req_filename1 , 0x00 , sizeof(tmp_req_filename1) );
        fp = IBPCreateTempFile( "AFILE" , tmp_req_filename1 , NULL , "wb" ) ;
        if( fp == NULL )
        {
            printf( "IBPCreateTempFile failed , errno[%d]\n" , errno );
            return -1;
        }
        else
        {
            printf( "IBPCreateTempFile ok , tmp_req_filename1[%s]\n" , tmp_req_filename1 );
            fclose( fp );
        }
        
        /* 创建请求临时文件2 */
        /* 文件大小为1个字节 */
        memset( tmp_req_filename2 , 0x00 , sizeof(tmp_req_filename2) );
        fp = IBPCreateTempFile( "BFILE" , tmp_req_filename2 , NULL , "wb" ) ;
        if( fp == NULL )
        {
            printf( "IBPCreateTempFile failed , errno[%d]\n" , errno );
            return -1;
        }
        else
        {
            printf( "IBPCreateTempFile ok , tmp_req_filename2[%s]\n" , tmp_req_filename2 );
            fprintf( fp , "2\n" );
            fclose( fp );
        }
        
        /* 创建请求临时文件3 */
        /* 文件大小为1024个字节 */
        memset( tmp_req_filename3 , 0x00 , sizeof(tmp_req_filename3) );
        fp = IBPCreateTempFile( "CFILE" , tmp_req_filename3 , NULL , "wb" ) ;
        if( fp == NULL )
        {
            printf( "IBPCreateTempFile failed , errno[%d]\n" , errno );
            return -1;
        }
        else
        {
            char    buf[ 1023 ] ;
            printf( "IBPCreateTempFile ok , tmp_req_filename3[%s]\n" , tmp_req_filename3 );
            memset( buf , '3' , sizeof(buf) );
            fwrite( buf , sizeof(buf) , 1 , fp );
            fclose( fp );
        }
        
        /* 创建请求临时文件4 */
        /* 文件大小为1024*1024个字节 */
        memset( tmp_req_filename4 , 0x00 , sizeof(tmp_req_filename4) );
        fp = IBPCreateTempFile( "DFILE" , tmp_req_filename4 , NULL , "wb" ) ;
        if( fp == NULL )
        {
            printf( "IBPCreateTempFile failed , errno[%d]\n" , errno );
            return -1;
        }
        else
        {
            char    buf[ 1025 ] ;
            int i ;
            printf( "IBPCreateTempFile ok , tmp_req_filename4[%s]\n" , tmp_req_filename4 );
            memset( buf , '4' , sizeof(buf) );
            for( i = 0 ; i < 1025 ; i++ )
                fwrite( buf , sizeof(buf) , 1 , fp );
            fclose( fp );
        }
        
        /* 初始化响应临时文件名缓冲区,如果有响应临时文件回来就会往里面放 */
        memset( tmp_rsp_filename1 , 0x00 , sizeof(tmp_rsp_filename1) );
        memset( tmp_rsp_filename2 , 0x00 , sizeof(tmp_rsp_filename2) );
        memset( tmp_rsp_filename3 , 0x00 , sizeof(tmp_rsp_filename3) );
        memset( tmp_rsp_filename4 , 0x00 , sizeof(tmp_rsp_filename4) );
        
        /* 连接通讯服务端,发送请求,接收响应,断开通讯服务端 */
        /* 向节点node发起交易app,p_msg指向请求报文,交易完成后,响应报文存放在通讯客户端环境中,p_msg指向它 */
        p_msg = msg ;
        msg_len = strlen(msg) ;
        nret = IBACRequester( p_env , node , "ibp_test_file" , & p_msg , & msg_len , tmp_req_filename1 , tmp_req_filename2 , tmp_req_filename3 , tmp_req_filename4 , NULL , tmp_rsp_filename1 , tmp_rsp_filename2 , tmp_rsp_filename3 , tmp_rsp_filename4 , NULL ) ;
        if( nret )
        {
            printf( "IBACRequester failed[%d] , errno[%d]\n" , nret , errno );
            return -1;
        }
        else
        {
            printf( "IBACRequester ok , msg[%.*s]\n" , msg_len , p_msg );
            printf( "tmp_rsp_filename1[%s]\n" , tmp_rsp_filename1 );
            printf( "tmp_rsp_filename2[%s]\n" , tmp_rsp_filename2 );
            printf( "tmp_rsp_filename3[%s]\n" , tmp_rsp_filename3 );
            printf( "tmp_rsp_filename4[%s]\n" , tmp_rsp_filename4 );
        }
        
        /* 销毁通讯客户端环境 */
        IBACDestroyEnvirment( p_env );
        printf( "IBACDestroyEnvirment ok\n" );
        
        return 0;
    }
    
    static void usage()
    {
        printf( "USAGE : ibp_test_file node msg\n" );
        return;
    }
    
    int main( int argc , char *argv[] )
    {
        int     nret = 0 ;
        
        if( argc == 1 + 2 )
        {
            IBPInitLogEnv( "" , "ibp_test_file" , "file::log/event.log" , LOG_LEVEL_DEBUG , "file::log/ibp_test_file.log" );
            nret = ibp_test_file( argv[1] , argv[2] ) ;
            IBPCleanLogEnv();
            return -nret;
        }
        else
        {
            usage();
            exit(7);
        }
    }
    

    2.2.3. 发起通讯请求(低层)

    test/test_ibpclient/ibp_test_echo/ibp_test_echo.c

    #include "ibac_api.h"
    
    int ibp_test_echo_IBACSendRequestAndReceiveResponse( char *node , char *app , char *msg )
    {
        struct IbacEnv      *p_env = NULL ;
        
        char            *p_msg = NULL ;
        int         msg_len ;
        
        int         nret = 0 ;
        
        /* 创建通讯客户端环境 */
        p_env = IBACCreateEnvirment( NULL ) ;
        if( p_env == NULL )
        {
            printf( "IBACCreateEnvirment failed , errno[%d]\n" , errno );
            return -1;
        }
        else
        {
            printf( "IBACCreateEnvirment ok\n" );
        }
        
        /* 连接通讯服务端 */
        nret = IBACConnect( p_env , node ) ;
        if( nret )
        {
            printf( "IBACConnect failed , errno[%d]\n" , errno );
            return -1;
        }
        else
        {
            printf( "IBACConnect ok\n" );
        }
        
        /* 发送请求,接收响应 */
        /* 向节点node发起交易app,p_msg指向请求报文,交易完成后,响应报文存放在通讯客户端环境中,p_msg指向它 */
        p_msg = msg ;
        msg_len = strlen(msg) ;
        nret = IBACSendRequestAndReceiveResponse( p_env , app , & p_msg , & msg_len , NULL , NULL ) ;
        if( nret )
        {
            printf( "IBACSendRequestAndReceiveResponse failed[%d] , errno[%d]\n" , nret , errno );
            return -1;
        }
        else
        {
            printf( "IBACSendRequestAndReceiveResponse ok , msg[%.*s]\n" , msg_len , p_msg );
        }
        
        /* 断开通讯服务端 */
        IBACDisconnect( p_env );
        printf( "IBACDisconnect ok\n" );
        
        /* 销毁通讯客户端环境 */
        IBACDestroyEnvirment( p_env );
        printf( "IBACDestroyEnvirment ok\n" );
        
        return 0;
    }
    
    static void usage()
    {
        printf( "USAGE : ibp_test_echo node app msg\n" );
        return;
    }
    
    int main( int argc , char *argv[] )
    {
        int     nret = 0 ;
        
        if( argc == 1 + 3 )
        {
            IBPInitLogEnv( "" , "ibp_test_echo" , "file::log/event.log" , LOG_LEVEL_DEBUG , "file::log/ibp_test_echo.log" );
            nret = ibp_test_echo_IBACSendRequestAndReceiveResponse ( argv[1] , argv[2] , argv[3] ) ;
            IBPCleanLogEnv();
            return -nret;
        }
        else
        {
            usage();
            exit(7);
        }
    }
    

    2.3. 通讯服务端API

    2.3.1. 回射服务

    test/test_ibpserver/ibp_test_echo/ibp_test_echo.c

    #include "ibas_api.h"
    
    funcIbasSomain somain ;
    int somain( struct HttpBuffer *req_body , struct HttpBuffer *rsp_body , struct IbasAddonFiles *addon_files )
    {
        char            *msg = NULL ;
        int         msg_len ;
        
        int         nret = 0 ;
        
        INFOLOGSG( "ENTER ibp_test_echo" );
        
        /* 回射请求报文 */
        msg = GetHttpBufferBase( req_body , & msg_len ) ;
        nret = MemcatHttpBuffer( rsp_body , msg , msg_len ) ;
        if( nret )
        {
            ERRORLOGG( "MemcatHttpBuffer failed[%d] , errno[%d]" , nret , errno );
            return -1;
        }
        else
        {
            INFOLOGG( "msg[%.*s]" , msg_len , msg );
        }
        
        INFOLOGSG( "LEAVE ibp_test_echo" );
        
        return nret;
    }
    

    test/test_ibpserver/ibp_test_echo/makefile

    # 此文件由makeobj.sh自动生成
    ############################################################
    # 项目名 : 
    # 模块名 : 
    # 备  注 : 
    ############################################################
    
    ###### 源文件配置区
    #@ c_FILE
    c_FILE      =   \
                ibp_test_echo.c \
    
    ###### 目标文件、安装目录配置区
    include makeinstall
    LIB     =   ibp_test_echo.so
    LIBINST     =   $(_LIBINST)
    
    ###### 编译选项
    CFLAGS      =   $(_CFLAGS) \
                -std=gnu99 \
                -I$(HOME)/include/ibp \
    
    ###### 链接选项
    LFLAGS      =   $(_LFLAGS) \
                -rdynamic \
                -L$(HOME)/lib \
                -libas_api \
    
    ###### 额外宏定义区
    CLEAN_ADDITION  =
    
    ###### 加载mktpl模板库
    #@ make_all
    #@ make_clean
    #@ make_install
    #@ make_install_LIBINST
    #@ make_install_DFTHDERINST
    #@ make_uninstall
    #@ make_uninstall_LIBINST
    #@ make_uninstall_DFTHDERINST
    include $(MKTPLDIR)/makeobj_$(MKTPLOS).inc
    
    ###### 目标文件依赖关系
    ibp_test_echo.so        :   $(c_FILE_o)
        $(CC) -o $@ $(c_FILE_o) $(SOFLAGS) $(LFLAGS)
        ibpcheckso $@ -r
    

    2.3.2. 回射服务(附带文件)

    test/test_ibpserver/ibp_test_file/ibp_test_file.c

    #include "ibas_api.h"
    
    funcIbasSomain somain ;
    int somain( struct HttpBuffer *req_body , struct HttpBuffer *rsp_body , struct IbasAddonFiles *addon_files )
    {
        char            *msg = NULL ;
        int         msg_len ;
        
        int         i ;
        int         count ;
        char            *p_filename = NULL ;
        
        int         nret = 0 ;
        
        INFOLOGSG( "ENTER ibp_test_file" );
        
        /* 回射请求报文 */
        msg = GetHttpBufferBase( req_body , & msg_len ) ;
        nret = MemcatHttpBuffer( rsp_body , msg , msg_len ) ;
        if( nret )
        {
            ERRORLOGG( "MemcatHttpBuffer failed[%d] , errno[%d]" , nret , errno );
            return -1;
        }
        else
        {
            INFOHEXLOGG( msg , msg_len , "msg [%d]bytes" , msg_len );
        }
        
        /* 按文件ID取请求文件名 */
        p_filename = IBASGetRequestFileById( addon_files , "BFILE" ) ;
        if( p_filename )
        {
            INFOLOGG( "IBASGetRequestFile ok , [%s]" , p_filename );
        }
        
        /* 回射所有请求文件 */
        count = IBASGetRequestFileCount( addon_files ) ;
        for( i = 0 ; i < count ; i++ )
        {
            p_filename = IBASGetRequestFile( addon_files , i ) ;
            INFOLOGG( "FILE[%s] " , p_filename );
            
            nret = IBASPutResponseFile( addon_files , p_filename ) ;
            if( nret )
            {
                ERRORLOGG( "IBASPutResponseFile failed[%d]" , nret );
                return -2;
            }
        }
        
        INFOLOGSG( "LEAVE ibp_test_file" );
        
        return 0;
    }
    

    2.4. 报文转换API

    test/test_ibpclient/ibp_test_ts1/ibp_test_ts1.c

    #include "ibmsgv_api.h"
    
    #include "IDL_test_ibpts1_request.dsc.h"
    #include "IDL_test_ibpts1_response.dsc.h"
    
    static int ibp_test_ts1( char *node )
    {
        test_ibpts1_request req_msg ;
        test_ibpts1_response    rsp_msg ;
        
        int         nret = 0 ;
        
        memset( & req_msg , 0x00 , sizeof(test_ibpts1_request) );
        strcpy( req_msg.test_request_header.trans_code , "ibp_test_ts1" );
        strcpy( req_msg.test_ibpts1.account_no , "603367123412341234" );
        memset( & rsp_msg , 0x00 , sizeof(test_ibpts1_response) );
        nret = IBMSGVCall_JSON( NULL , node , "ibp_test_ts1" , (void*) & req_msg , & DSCSERIALIZE_JSON_DUP_test_ibpts1_request_V , (void*) & rsp_msg , & DSCDESERIALIZE_JSON_test_ibpts1_response_V , NULL , NULL ) ;
        if( nret )
        {
            printf( "IBMSGVCall failed[%d] , errno[%d]\n" , nret , errno );
            return -1;
        }
        else
        {
            printf( "IBMSGVCall ok\n" );
        }
        
        printf( "response_code[%s] response_desc[%s] - account_no[%s] balance[%.2lf]\n"
            , rsp_msg.test_response_header.response_code , rsp_msg.test_response_header.response_desc
            , rsp_msg.test_ibpts1.account_no , rsp_msg.test_ibpts1.balance );
        
        return 0;
    }
    
    static void usage()
    {
        printf( "USAGE : ibp_test_ts1 node\n" );
        return;
    }
    
    int main( int argc , char *argv[] )
    {
        int     nret = 0 ;
        
        if( argc == 1 + 1 )
        {
            IBPInitLogEnv( "" , "ibp_test_ts1" , "file::log/event.log" , LOG_LEVEL_DEBUG , "file::log/ibp_test_ts1.log" );
            nret = ibp_test_ts1( argv[1] ) ;
            IBPCleanLogEnv();
            return -nret;
        }
        else
        {
            usage();
            exit(7);
        }
    }
    

    test/test_ibpclient/ibp_test_ts1/makefile

    # 此文件由makeobj.sh自动生成
    ############################################################
    # 项目名 : 
    # 模块名 : 
    # 备  注 : 
    ############################################################
    
    ###### 源文件配置区
    #@ c_FILE
    c_FILE      =   \
                ibp_test_ts1.c \
    
    ###### 目标文件、安装目录配置区
    include makeinstall
    BIN     =   ibp_test_ts1
    BININST     =   $(_BININST)
    
    ###### 编译选项
    CFLAGS      =   $(_CFLAGS) \
                -std=gnu99 \
                -I$(HOME)/include/ibp \
                -I../../test_ibpserver/ibp_test_ts1 \
    
    ###### 链接选项
    LFLAGS      =   $(_LFLAGS) \
                -rdynamic \
                -L$(HOME)/lib \
                -libmsgv_api \
    
    ###### 额外宏定义区
    CLEAN_ADDITION  =
    
    ###### 加载mktpl模板库
    #@ make_all
    #@ make_clean
    #@ make_install
    #@ make_install_BININST
    #@ make_install_DFTHDERINST
    #@ make_uninstall
    #@ make_uninstall_BININST
    #@ make_uninstall_DFTHDERINST
    include $(MKTPLDIR)/makeobj_$(MKTPLOS).inc
    
    ###### 目标文件依赖关系
    ibp_test_ts1        :   $(c_FILE_o) IDL_test_ibpts1_request.dsc.o IDL_test_ibpts1_response.dsc.o
        $(CC) -o $@ $(c_FILE_o) IDL_test_ibpts1_request.dsc.o IDL_test_ibpts1_response.dsc.o $(LFLAGS)
    

    2.5. 动态结构容器

    src/ibtm/test.c

    /*
     * IBP - Technology architecture for real-time transaction
     * author   : calvin
     * email    : calvinwilliams@163.com
     *
     * Licensed under the LGPL v2.1, see the file LICENSE in base directory.
     */
    
    #include "ibtm_in.h"
    
    struct DS_infunc
    {
        char    ch ;
        short   s ;
        int i ;
        long    l ;
        float   f ;
        double  d ;
        char    buf[ 64 + 1 ] ;
    } ;
    
    int test_DS_infunc( DS *ds )
    {
        struct DS_infunc    infunc ;
        
        DS_TRY(ds)
        {
            DS_GET( ds , char , char_field , & (infunc.ch) )
            DS_GET( ds , short , short_field , & (infunc.s) )
            DS_GET( ds , int , int_field , & (infunc.i) )
            DS_GET( ds , long , long_field , & (infunc.l) )
            DS_GET( ds , float , float_field , & (infunc.f) )
            DS_GET( ds , double , double_field , & (infunc.d) )
            DS_GET( ds , char* , string_field , infunc.buf , sizeof(infunc.buf) )
        }
        DS_CATCH(ds)
        {
            printf( "DS_GET failed , LINE[%d] FIELD_NAME[%s] ERROR[%d]\n" , DSGetLastSourceLine(ds) , DSGetFieldName(ds) , DSGetLastError(ds) );
            return -1;
        }
        
        printf( "--- infunc ---\n" );
        printf( "infunc.ch [%c]\n" , infunc.ch );
        printf( "infunc.s  [%hd]\n" , infunc.s );
        printf( "infunc.i  [%d]\n" , infunc.i );
        printf( "infunc.l  [%ld]\n" , infunc.l );
        printf( "infunc.f  [%f]\n" , infunc.f );
        printf( "infunc.d  [%lf]\n" , infunc.d );
        printf( "infunc.buf[%s]\n" , infunc.buf );
        
        DS_TRY(ds)
        {
            DS_SET( ds , char , char_field , 'Z' )
            DS_SET( ds , short , short_field , 9 )
            DS_SET( ds , int , int_field , 87 )
            DS_SET( ds , long , long_field , 654321 )
            DS_SET( ds , float , float_field , 9.8 )
            DS_SET( ds , double , double_field , 7654.3210 )
            DS_SET( ds , char* , string_field , "world" )
        }
        DS_CATCH(ds)
        {
            printf( "DS_SET failed , LINE[%d] FIELD_NAME[%s] ERROR[%d]\n" , DSGetLastSourceLine(ds) , DSGetFieldName(ds) , DSGetLastError(ds) );
            return -1;
        }
        
        return 0;
    }
    
    struct DS_caller
    {
        char    ch ;
        short   s ;
        int i ;
        long    l ;
        float   f ;
        double  d ;
        char    buf[ 64 + 1 ] ;
    } ;
    
    int test_DS_caller()
    {
        struct DS_caller    caller ;
        DS          *ds = DS_NEW( "struct_name" ) ;
        
        if( ds == NULL )
        {
            printf( "DS_NEW failed , errno[%d]\n" , errno );
            return -1;
        }
        
        memset( & caller , 0x00 , sizeof(struct DS_caller) );
        caller.ch = 'A' ;
        caller.s = 1 ;
        caller.i = 23 ;
        caller.l = 456789 ;
        caller.f = 1.2 ;
        caller.d = 3456.7890 ;
        strcpy( caller.buf , "hello" );
        
        DS_TRY(ds)
        {
            DS_ADD( ds , char , char_field , caller.ch )
            DS_ADD( ds , short , short_field , caller.s )
            DS_ADD( ds , int , int_field , caller.i )
            DS_ADD( ds , long , long_field , caller.l )
            DS_ADD( ds , float , float_field , caller.f )
            DS_ADD( ds , double , double_field , caller.d )
            DS_ADD( ds , char* , string_field , caller.buf )
        }
        DS_CATCH(ds)
        {
            printf( "DS_ADD failed , LINE[%d] FIELD_NAME[%s] ERROR[%d]\n" , DSGetLastSourceLine(ds) , DSGetFieldName(ds) , DSGetLastError(ds) );
            DS_DELETE( ds )
            return -1;
        }
        
        test_DS_infunc( ds );
        
        memset( & caller , 0x00 , sizeof(struct DS_caller) );
        
        DS_TRY(ds)
        {
            DS_GET( ds , char , char_field , & (caller.ch) )
            DS_GET( ds , short , short_field , & (caller.s) )
            DS_GET( ds , int , int_field , & (caller.i) )
            DS_GET( ds , long , long_field , & (caller.l) )
            DS_GET( ds , float , float_field , & (caller.f) )
            DS_GET( ds , double , double_field , & (caller.d) )
            DS_GET( ds , char* , string_field , caller.buf , sizeof(caller.buf) )
        }
        DS_CATCH(ds)
        {
            printf( "DS_GET failed , LINE[%d] FIELD_NAME[%s] ERROR[%d]\n" , DSGetLastSourceLine(ds) , DSGetFieldName(ds) , DSGetLastError(ds) );
            DS_DELETE( ds )
            return -1;
        }
        
        printf( "--- caller ---\n" );
        printf( "caller.ch [%c]\n" , caller.ch );
        printf( "caller.s  [%hd]\n" , caller.s );
        printf( "caller.i  [%d]\n" , caller.i );
        printf( "caller.l  [%ld]\n" , caller.l );
        printf( "caller.f  [%f]\n" , caller.f );
        printf( "caller.d  [%lf]\n" , caller.d );
        printf( "caller.buf[%s]\n" , caller.buf );
        
        DS_DELETE( ds )
        
        return 0;
    }
    
    int main()
    {
        return -test_DS_caller();
    }
    

    2.6. 分阶段管理层API

    test/test_ibpserver/ibp_test_ts1/IDL_test_ibpts1_request.dsc

    STRUCT  test_ibpts1_request         # 余额查询 请求
    {
        INCLUDE IDL_test_request_header.dsc
        
        STRUCT  test_ibpts1
        {
            STRING  40  account_no  # 账号
            STRING  16  password    # 密码
        }
    }
    

    test/test_ibpserver/ibp_test_ts1/IDL_test_ibpts1_response.dsc

    STRUCT  test_ibpts1_response        # 余额查询 响应
    {
        INCLUDE IDL_test_response_header.dsc
        
        STRUCT  test_ibpts1
        {
            STRING  40  account_no      # 账号
            NUMERIC 16,2    balance         # 余额
        }
    }
        test/test_ibpserver/ibp_test_ts1/IDL_test_request_header.dsc
        STRUCT  test_request_header     # 请求公共头
        {
            STRING 10   sender_date # 发起方日期
            STRING 8    sender_time # 发起方时间
            STRING 20   sender_trans_no # 发起方流水号
            STRING 6    channel_code    # 交易渠道
            STRING 10   branch_no   # 交易网点
            STRING 12   oper_no     # 交易柜员
            STRING 32   login_session   # 签到会话
            STRING 20   trans_code  # 交易码
        }
        test/test_ibpserver/ibp_test_ts1/IDL_test_response_header.dsc
        STRUCT  test_response_header            # 响应公共头
        {
            STRING 10   sender_date     # 发起方日期
            STRING 8    sender_time     # 发起方时间
            STRING 20   sender_trans_no     # 发起方流水号
            STRING 10   receiver_date       # 接收方日期
            STRING 8    receiver_time       # 接收方时间
            STRING 20   receiver_trans_no   # 接收方流水号
            STRING 10   response_code       # 交易结果
            STRING 128  response_desc       # 交易结果描述
            STRING 128  response_message    # 额外信息
        }
    

    test/test_ibpserver/ibp_test_ts1/somain.c

    #include "ibmsgv_api.h"
    
    #include "IDL_test_ibpts1_request.dsc.h"
    #include "IDL_test_ibpts1_response.dsc.h"
    
    funcIbmsgvTransmain transmain ;
    
    funcIbasSomain somain ;
    int somain( struct HttpBuffer *req_body , struct HttpBuffer *rsp_body , struct IbasAddonFiles *addon_files )
    {
        test_ibpts1_request req_st ;
        test_ibpts1_response    rsp_st ;
        
        int         nret = 0 ;
        
        INFOLOGG( "ENTER TESTTPS1" );
        
        memset( & req_st , 0x00 , sizeof(test_ibpts1_request) );
        memset( & rsp_st , 0x00 , sizeof(test_ibpts1_response) );
        nret = IBMSGVReceiver_JSON( req_body , & DSCDESERIALIZE_JSON_test_ibpts1_request_V , & req_st
                    , rsp_body , & DSCSERIALIZE_JSON_DUP_test_ibpts1_response_V , & rsp_st
                    , & transmain , addon_files ) ;
        if( nret )
        {
            ERRORLOGG( "IBMSGVReceiver_JSON failed[%d]" , nret );
        }
        else
        {
            INFOLOGG( "IBMSGVReceiver_JSON ok" );
        }
        
        INFOLOGG( "LEAVE TESTTPS1" );
        
        return nret;
    }
    

    test/test_ibpserver/ibp_test_ts1/transmain.c

    #include "ibts_api.h"
    
    #include "IDL_test_ibpts1_request.dsc.h"
    #include "IDL_test_ibpts1_response.dsc.h"
    
    #include "TF_BT.c"
    #include "TF_PC.c"
    #include "TF_BC.c"
    #include "TF_BP.c"
    #include "TF_AP.c"
    #include "TF_AT.c"
    
    struct TransFuncArray   TFA_BT_TESTTPS1[] =
        {
            FUNC( "交易前处理1" , TF_BT_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_PC_CH_TESTTPS1[] =
        {
            FUNC( "渠道公共检查" , TF_PC_CH_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_PC_OP_TESTTPS1[] =
        {
            FUNC( "操作员公共检查" , TF_PC_OP_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_PC_OG_TESTTPS1[] =
        {
            FUNC( "机构公共检查" , TF_PC_OG_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_BC_MD_TESTTPS1[] =
        {
            FUNC( "介质层业务检查" , TF_BC_MD_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_BC_AT_TESTTPS1[] =
        {
            FUNC( "账户层业务检查" , TF_BC_AT_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_BC_CT_TESTTPS1[] =
        {
            FUNC( "客户层业务检查" , TF_BC_CT_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_BC_BS_TESTTPS1[] =
        {
            FUNC( "业务层检查函数1" , TF_BC_BS_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_BP_MD_TESTTPS1[] =
        {
            FUNC( "介质层业务处理" , TF_BP_MD_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_BP_AT_TESTTPS1[] =
        {
            FUNC( "账户层业务处理" , TF_BP_AT_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_BP_CT_TESTTPS1[] =
        {
            FUNC( "客户层业务处理" , TF_BP_CT_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_BP_BS_TESTTPS1[] =
        {
            FUNC( "业务处理函数1" , TF_BP_BS_TESTTPS1_F1 )
            FUNCARRAY( "业务处理函数数组2" , TFA_BP_TESTTPS1_FA2 )
            IF_IN_TRANSCODES_THEN_FUNC( "业务处理函数数组3" , "TESTTPS1" , TF_BP_BS_TESTTPS1_F3 )
            IF_NOTIN_TRANSCODES_THEN_FUNCARRAY( "业务处理函数数组0" , "TESTTPS1" , TFA_BP_BS_TESTTPS1_FA0 )
            IF_FUNC_THEN( "业务处理函数4" , TF_BP_BS_TESTTPS1_F4 )
                FUNC( "业务处理函数5" , TF_BP_BS_TESTTPS1_F5 )
            ELSE
                FUNC( "业务处理函数0" , TF_BP_BS_TESTTPS1_F0 )
            ENDIF
            IF_FUNCARRAY_THEN( "业务处理函数数组6" , TFA_BP_BS_TESTTPS1_FA6 )
                FUNC( "业务处理函数0" , TF_BP_BS_TESTTPS1_F0 )
            ELSE
                FUNC( "业务处理函数7" , TF_BP_BS_TESTTPS1_F7 )
            ENDIF
            FUNC( "业务处理函数8" , TF_BP_BS_TESTTPS1_F8 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_AP_TESTTPS1[] =
        {
            FUNC( "账务处理" , TF_AP_TESTTPS1 )
            RETURN
        } ;
    
    struct TransFuncArray   TFA_AT_TESTTPS1[] =
        {
            FUNC( "交易后处理" , TF_AT_TESTTPS1 )
            RETURN
        } ;
    
    struct TransSchedule_BT_PC_BP_AP_AT TS_TESTTPS1 =
        {
            "交易前处理" , TFA_BT_TESTTPS1 ,
            {
                "渠道公共检查" , TFA_PC_CH_TESTTPS1 ,
                "操作员公共检查" , TFA_PC_OP_TESTTPS1 ,
                "机构公共检查" , TFA_PC_OG_TESTTPS1 ,
                "其它公共检查" , NULL
            } ,
            {
                "介质层业务检查" , TFA_BC_MD_TESTTPS1 ,
                "账户层业务检查" , TFA_BC_AT_TESTTPS1 ,
                "客户层业务检查" , TFA_BC_CT_TESTTPS1 ,
                "业务层业务检查" , TFA_BC_BS_TESTTPS1 ,
                "其它业务检查" , NULL
            } ,
            {
                "介质层业务处理" , TFA_BP_MD_TESTTPS1 ,
                "账户层业务处理" , TFA_BP_AT_TESTTPS1 ,
                "客户层业务处理" , TFA_BP_CT_TESTTPS1 ,
                "业务层业务处理" , TFA_BP_BS_TESTTPS1 ,
                "其它业务处理" , NULL
            } ,
            "账务处理" , TFA_AP_TESTTPS1 ,
            "交易后处理" , TFA_AT_TESTTPS1
        } ;
    
    funcIbmsgvTransmain transmain ;
    int transmain( void *pv_req_st , void *pv_rsp_st , struct IbasAddonFiles *addon_files )
    {
        test_ibpts1_request *p_req_st = (test_ibpts1_request *) pv_req_st ;
        test_ibpts1_response    *p_rsp_st = (test_ibpts1_response *) pv_rsp_st ;
        
        int         nret = 0 ;
        
        nret = IBTSExecuteSchedule_BT_PC_BP_AP_AT( "test_ibpts1_request" , sizeof(test_ibpts1_request) , pv_req_st
                            , "test_ibpts1_response" , sizeof(test_ibpts1_response) , pv_rsp_st
                            , addon_files
                            , p_req_st->test_request_header.trans_code
                            , p_rsp_st->test_response_header.response_code , sizeof(p_rsp_st->test_response_header.response_code)
                            , p_rsp_st->test_response_header.response_desc , sizeof(p_rsp_st->test_response_header.response_desc)
                            , & TS_TESTTPS1 ) ;
        if( nret )
        {
            ERRORLOGG( "IBTSExecuteSchedule_BT_PC_BP_AP_AT failed[%d]" , nret );
        }
        else
        {
            INFOLOGG( "IBTSExecuteSchedule_BT_PC_BP_AP_AT ok" );
        }
        
        return nret;
    }
    

    test/test_ibpserver/ibp_test_ts1/TF_BT.c

    #include "ibtm_api.h"
    
    TransFunc TF_BT_TESTTPS1 ;
    int TF_BT_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
        test/test_ibpserver/ibp_test_ts1/TF_PC.c
    #include "ibtm_api.h"
    
    TransFunc TF_PC_CH_TESTTPS1 ;
    int TF_PC_CH_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_PC_OP_TESTTPS1 ;
    int TF_PC_OP_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_PC_OG_TESTTPS1 ;
    int TF_PC_OG_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
        test/test_ibpserver/ibp_test_ts1/TF_BC.c
    #include "ibtm_api.h"
    
    TransFunc TF_BC_MD_TESTTPS1 ;
    int TF_BC_MD_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        /*
        return IBTMFormatResponseInfo( p_te , -1 , "无此卡号[%s]" , "603367123412341234" );
        */
        return 0;
    }
    
    TransFunc TF_BC_AT_TESTTPS1 ;
    int TF_BC_AT_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_BC_CT_TESTTPS1 ;
    int TF_BC_CT_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_BC_BS_TESTTPS1 ;
    int TF_BC_BS_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
        test/test_ibpserver/ibp_test_ts1/TF_BP.c
    #include "ibtm_api.h"
    
    TransFunc TF_BP_MD_TESTTPS1 ;
    int TF_BP_MD_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_BP_AT_TESTTPS1 ;
    int TF_BP_AT_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_BP_CT_TESTTPS1 ;
    int TF_BP_CT_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_BP_BS_TESTTPS1_F0 ;
    int TF_BP_BS_TESTTPS1_F0( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    struct TransFuncArray   TFA_BP_BS_TESTTPS1_FA0[] =
        {
            FUNC( "业务层业务处理0" , TF_BP_BS_TESTTPS1_F0 )
            RETURN
        } ;
    
    TransFunc TF_BP_BS_TESTTPS1_F1 ;
    int TF_BP_BS_TESTTPS1_F1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_BP_BS_TESTTPS1_F2 ;
    int TF_BP_BS_TESTTPS1_F2( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    struct TransFuncArray   TFA_BP_TESTTPS1_FA2[] =
        {
            FUNC( "业务层业务处理2" , TF_BP_BS_TESTTPS1_F2 )
            RETURN
        } ;
    
    TransFunc TF_BP_BS_TESTTPS1_F3 ;
    int TF_BP_BS_TESTTPS1_F3( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_BP_BS_TESTTPS1_F4 ;
    int TF_BP_BS_TESTTPS1_F4( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_BP_BS_TESTTPS1_F5 ;
    int TF_BP_BS_TESTTPS1_F5( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    TransFunc TF_BP_BS_TESTTPS1_F6 ;
    int TF_BP_BS_TESTTPS1_F6( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 1;
    }
    
    struct TransFuncArray   TFA_BP_BS_TESTTPS1_FA6[] =
        {
            FUNC( "业务层业务处理6" , TF_BP_BS_TESTTPS1_F6 )
            RETURN
        } ;
    
    TransFunc TF_BP_BS_TESTTPS1_F7 ;
    int TF_BP_BS_TESTTPS1_F7( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    
    void do_coredump( struct TransEnv *p_te )
    {
    #if 0
        char    *p = NULL ;
        strcpy( p , "let's core" );
    #endif
        
        return;
    }
    
    TransFunc TF_BP_BS_TESTTPS1_F8 ;
    int TF_BP_BS_TESTTPS1_F8( struct TransEnv *p_te )
    {
        test_ibpts1_request *p_req_msg = NULL ;
        test_ibpts1_response    *p_rsp_msg = NULL ;
        
        int         nret = 0 ;
        
        nret = IBTMGetStructBlock( p_te , "test_ibpts1_request" , sizeof(test_ibpts1_request) , (void**) & p_req_msg ) ;
        if( nret )
        {
            ERRORLOGG( "IBTMGetStructBlock failed[%d]" , nret );
            return 1;
        }
        
        nret = IBTMGetStructBlock( p_te , "test_ibpts1_response" , sizeof(test_ibpts1_response) , (void**) & p_rsp_msg ) ;
        if( nret )
        {
            ERRORLOGG( "IBTMGetStructBlock failed[%d]" , nret );
            return 1;
        }
        
        do_coredump( p_te );
        
        strcpy( p_rsp_msg->test_ibpts1.account_no , p_req_msg->test_ibpts1.account_no );
        p_rsp_msg->test_ibpts1.balance = 1000.00 ;
        
        return 0;
    }
        test/test_ibpserver/ibp_test_ts1/TF_AP.c
    #include "ibtm_api.h"
    
    TransFunc TF_AP_TESTTPS1 ;
    int TF_AP_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
        test/test_ibpserver/ibp_test_ts1/TF_AT.c
    #include "ibtm_api.h"
    
    TransFunc TF_AT_TESTTPS1 ;
    int TF_AT_TESTTPS1( struct TransEnv *p_te )
    {
        INFOLOGG( "..." );
        
        return 0;
    }
    

    test/test_ibpserver/ibp_test_ts1/makefile

    # 此文件由makeobj.sh自动生成
    ############################################################
    # 项目名 : 
    # 模块名 : 
    # 备  注 : 
    ############################################################
    
    ###### 源文件配置区
    #@ c_FILE
    c_FILE      =   \
                IDL_test_ibpts1_request.dsc.c \
                IDL_test_ibpts1_response.dsc.c \
                somain.c \
                transmain.c \
    
    ###### 目标文件、安装目录配置区
    include makeinstall
    LIB     =   ibp_test_ts1.so
    LIBINST     =   $(_LIBINST)
    
    ###### 编译选项
    CFLAGS      =   $(_CFLAGS) \
                -std=gnu99 \
                -I$(HOME)/include/ibp \
    
    ###### 链接选项
    LFLAGS      =   $(_LFLAGS) \
                -rdynamic \
                -L$(HOME)/lib \
                -libmsgv_api \
                -libtm_api \
                -libts_api \
    
    ###### 额外宏定义区
    CLEAN_ADDITION  =
    
    ###### 加载mktpl模板库
    #@ make_all
    #@ make_clean
    #@ make_install
    #@ make_install_LIBINST
    #@ make_install_DFTHDERINST
    #@ make_uninstall
    #@ make_uninstall_LIBINST
    #@ make_uninstall_DFTHDERINST
    include $(MKTPLDIR)/makeobj_$(MKTPLOS).inc
    
    ###### 目标文件依赖关系
    ibp_test_ts1.so     :   $(c_FILE_o)
        $(CC) -o $@ $(c_FILE_o) $(SOFLAGS) $(LFLAGS)
        ibpcheckso $@ -r
    

    相关文章

      网友评论

          本文标题:分布式联机服务技术框架(IBP)设计与实战(六、开发接口参考)

          本文链接:https://www.haomeiwen.com/subject/luuzaxtx.html