免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4518 | 回复: 10
打印 上一主题 下一主题

[C] C结构体工具DirectStruct(综合示例二) [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-08 21:32 |只看该作者 |倒序浏览
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2014-10-10 13:28 |只看该作者
本帖最后由 yulihua49 于 2014-10-10 13:34 编辑
BetonArmEE 发表于 2014-10-08 21:32
C结构体工具DirectStruct(综合示例二)

1.编写定义文件,用工具dsc处理之,自动生成XML转换代码和ESQL代 ...

$> unldasc.sh -dJ pattern_col
{ "tab_name": "BIZ_STATION_MODE", "col_name": "UPDATE_TIME", "col_type": "CH_TIME     ", "col_len": "8", "col_format": "YYYYMMDDHH24MISS", "pseudo_name": "" }
{ "tab_name": "V_CD_PARAM_VER", "col_name": "MAKE_DATE", "col_type": "CH_DATE     ", "col_len": "15", "col_format": "YYYYMMDDHH24MISS", "pseudo_name": "" }
{ "tab_name": "V_CD_PARAM_VER", "col_name": "VALID_DATE", "col_type": "CH_DATE     ", "col_len": "9", "col_format": "YYYYMMDD", "pseudo_name": "" }
{ "tab_name": "BIZ_PARAM_VER_INFO_SPEC", "col_name": "VALID_DATE", "col_type": "CH_DATE     ", "col_len": "9", "col_format": "YYYYMMDD", "pseudo_name": "" }
{ "tab_name": "CD_AFC_OPERATOR_INFO", "col_name": "VALID_DATE", "col_type": "CH_DATE     ", "col_len": "9", "col_format": "YYYYMMDD", "pseudo_name": "" }
{ "tab_name": "CD_AFC_OPERATOR_INFO", "col_name": "INVALID_DATE", "col_type": "CH_DATE     ", "col_len": "9", "col_format": "YYYYMMDD", "pseudo_name": "" }
{ "tab_name": "CD_AFC_OPERATOR_INFO", "col_name": "ASSWORD_INVALID_DATE", "col_type": "CH_DATE     ", "col_len": "9", "col_format": "YYYYMMDD", "pseudo_name": "" }
{ "tab_name": "CD_AFC_OPERATOR_INFO", "col_name": "UPD_DATE", "col_type": "CH_DATE     ", "col_len": "9", "col_format": "YYYYMMDD", "pseudo_name": "" }
。。。。。。。。。。。
表结构:
  1. -- usage: db2 -tvf mkpatt.sql
  2. -- /* 模板生成器用,列修改信息 */
  3. DROP TABLE PATTERN_COL ;
  4. CREATE TABLE PATTERN_COL (
  5.         TAB_NAME                VARCHAR(128) NOT NULL, -- 表名
  6.         COL_NAME                VARCHAR(128) NOT NULL, -- 列名
  7.         COL_TYPE                CHAR(12) , -- 列类型,为SDBC类型,DELETE表示该列不生成模板。
  8.         COL_LEN                 INTEGER , -- 列长度,按SDBC模板要求
  9.         COL_FORMAT              VARCHAR(36) ,
  10.         PSEUDO_NAME             VARCHAR(128) ,
  11.         PRIMARY KEY (TAB_NAME,COL_NAME)
  12. );
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2014-10-11 17:59 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
4 [报告]
发表于 2014-10-13 13:25 |只看该作者
本帖最后由 yulihua49 于 2014-10-13 13:53 编辑
BetonArmEE 发表于 2014-10-11 17:59
回复 2# yulihua49

yes,面对相同的问题,采用各自的方法,交流一下。
“ 你的定义源放数据库,面向的是数据库应用,DirectStruct定义源是配置文件,面向的是协议处理和代码简化,如果是非数据库应用,总不能为了定义数据集合而特意装个数据库吧。”
定义源可以是元数据文件,跟你的dsc类似。也可以直接手写。就是说,支持多种定义方法。当你只需要序列化/反序列化时,用其他方法定义模板。

pattern_col是数据库的列定义修改表,按照数据库的缺省定义,不能满足需求时,可以利用这个表改变某列的定义。因为数据库是单层的,所以这个表是单层的。

但是模板可以多层,就是说,支持结构套结构,但是不允许指针嵌套。
  1. #include <pack.h>
  2. #include <json_pack.h>

  3. #include "meta/st.tpl"
  4. #include "meta/st.stu"

  5. main()
  6. {
  7. ss_stu ss;
  8. char buf[512];
  9. JSON_OBJECT json=json_object_new_object();

  10.    ss.c=1;
  11.    ss.s.c=3;
  12.    ss.s.bi=123456789012345;
  13.    ss.i=12345;
  14.         stu_to_json(json,&ss,ss_tpl,0,0);//json序列化
  15.         printf("json ss=%s\n",json_object_to_json_string(json));
  16.         net_pack(buf,&ss,ss_tpl);//Struct序列化
  17.         printf("ss=%s\n",buf);

  18.    json_object_put(json);
  19.    return 0;
  20. }
复制代码
>cat meta/st.tpl

T_PkgType st_tpl[]={
        {CH_TINY,1,"c",0,-1},
        {CH_INT64,sizeof(INT64),"bi"},
        {-1,0,0,0}
};

T_PkgType ss_tpl[]={
        {CH_TINY,1,"c",0,-1},
        {CH_STRUCT,0,"s",(const char *)st_tpl},
        {CH_INT,sizeof(int),"i"},
        {-1,0,0,0}
};
<db2sdbc@~/demo/mkpatt>cat meta/st.stu

extern T_PkgType st_tpl[];
typedef struct {
        char c;
        INT64 bi;
} st_stu;

extern T_PkgType ss_tpl[];
typedef struct {
        char c;
        st_stu s;//这里套结构
        int i;
} ss_stu;

执行结果:
./t_struct
json ss={ "c": "1", "s": { "c": "3", "bi": "123456789012345" }, "i": "12345" }
ss=1|3|123456789012345|12345|

元数据文件:
>cat st.meta
TEMPLATE st 2
c:=CH_TINY
bi:=CH_INT64

a>cat t_str.meta
TEMPLATE ss 3
c:=CH_TINY
s:=CH_STRUCT st
i:=CH_INT

>cat st.txt   #组包文件
st.meta
t_str.meta

#生成模板文件:
mktpl st <st.txt

就产生了st.tpl,st.stu

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2014-10-13 14:01 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
6 [报告]
发表于 2014-10-13 15:20 |只看该作者
本帖最后由 yulihua49 于 2014-10-13 15:42 编辑
BetonArmEE 发表于 2014-10-13 14:01
回复 4# yulihua49

这就是JAVA里为什么会有ibatis和Hibernate两种ORM。这两批粉丝有时吵的不可开交,实际没必要,各有生存空间而已,我们也可以在不同场合选择不同工具。
ESQL是INFORMIX的吗?

就咱们俩聊?别人怎么不吱声?这话题有点阳春白雪了。

用SDBC做了几个项目了,感觉培训还是比较容易的。最近最有价值的是,项目从ORACLE移植到DB2,整个开发组完全不用学习CLI,很简单就平移过来了。
工作流程是,OCI改SDBC——ORACLE,调试通过后,修改Makefile,-ldb2,更换一个SDBC的.so,make 就完事了。结果,这个应用软件就是双平台的了。

当然,我承认,ESQL跨平台也是比较容易的。就是多线程操作,比较费事。几年前跟你讨论过多线程问题,不赘述。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
7 [报告]
发表于 2014-10-13 16:42 |只看该作者
本帖最后由 yulihua49 于 2014-10-13 16:51 编辑
BetonArmEE 发表于 2014-10-13 16:32
回复 6# yulihua49

明白了。

ESQL可以做多线程,但是往往多线程伴随多连接,ESQL的多连接是通过多个‘语义环境’ 实现的,这在处理连接池时会有一点麻烦。
另外,ESQL处理泛型也有问题,4种模式的describe,都不能满足泛型的需要。当初没有采用PROC的主要原因倒不是性能问题,而是泛型问题。

一个一个数据库的封装,真是个麻烦事,现在想封装ODBC,可能解决点问题。
几种常用的,要求高效的,做特别的封装,其他的,ODBC,这样好一些。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2014-10-13 17:03 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2014-10-13 17:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
10 [报告]
发表于 2014-10-14 16:40 |只看该作者
BetonArmEE 发表于 2014-10-08 21:32
C结构体工具DirectStruct(综合示例二)

1.编写定义文件,用工具dsc处理之,自动生成XML转换代码和ESQL代 ...

   EXEC SQL

31.                SELECT  *

32.                INTO    DBVLLIST_userinfo

33.                FROM    userinfo

34.                WHERE   user_id = 101 ;

INTO    DBVLLIST_userinfo,是个结构吗?ORACLE不可以这样。
它虽然可以into 结构体,但是不是普通的结构体,而是以PROC变量类型建立的结构体。
这样的可移植性也是有问题的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP