Chinaunix

标题: C结构体工具DirectStruct(综合示例二) [打印本页]

作者: BetonArmEE    时间: 2014-10-08 21:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: yulihua49    时间: 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. );
复制代码

作者: BetonArmEE    时间: 2014-10-11 17:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: yulihua49    时间: 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

作者: BetonArmEE    时间: 2014-10-13 14:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: yulihua49    时间: 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跨平台也是比较容易的。就是多线程操作,比较费事。几年前跟你讨论过多线程问题,不赘述。
作者: yulihua49    时间: 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,这样好一些。
作者: BetonArmEE    时间: 2014-10-13 17:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: BetonArmEE    时间: 2014-10-13 17:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: yulihua49    时间: 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变量类型建立的结构体。
这样的可移植性也是有问题的。
作者: BetonArmEE    时间: 2014-10-14 18:10
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2