C结构体工具DirectStruct(综合示例二)

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

2.编写应用代码

3.编译运行

------------------------------------------------------------

DirectStruct是一个强有力的代码自动生成工具,它可以自动生成C结构体与XML、JSON、二进制(带压缩)等报文之间的转换代码,还能自动生成ESQL代码片段,在应用中直接使用自动化代码以提高开发效率,避免开发冗余和手工编码风险。

综合示例二演示了应用从数据库表里读出一条记录,用DirectStruct自动生成的JSON转换函数打包成JSON报文,写入磁盘文件。通过示例,你可以看到中间的绝大多数令人头痛的代码都可以通过DirectStruct自动生成,这使得实际要编写的应用代码变得简洁和高效。

本示例因为涉及到JSON,DirectStruct的XML处理依赖于开源库fasterjson。

完整示例代码放在test_demo目录里,你也可以自己运行观察。

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

$ cat IDL_userinfo.dsc
STRUCT  userinfo
{
       INT     4       user_id
       STRING  16      user_name
       STRING  128     email

       CREATE_SQL      "CREATE UNIQUE INDEX userinfo_idx1 ON userinfo ( user_id ) ;"
       DROP_SQL        "DROP INDEX testable_idx1 ;"
}
$ dsc -f IDL_userinfo.dsc -c-xml -sql -ec-pqsql -c-LOG
STRUCT userinfo
       INT 4 user_id
       STRING 16 user_name
       STRING 128 email
ok!
$ ls -1 IDL_userinfo.*
IDL_userinfo.dsc
IDL_userinfo.dsc.ESQL.ec
IDL_userinfo.dsc.ESQL.eh
IDL_userinfo.dsc.LOG.c
IDL_userinfo.dsc.c
IDL_userinfo.dsc.create.sql
IDL_userinfo.dsc.drop.sql
IDL_userinfo.dsc.h

IDL_userinfo.dsc.h里有userinfo结构定义。

JSON转换函数定义在IDL_userinfo.dsc.c,声明在IDL_userinfo.dsc.h。

ESQL代码片段定义在IDL_userinfo.dsc.ESQL.ec,声明在IDL_userinfo.dsc.ESQL.eh。

IDL_userinfo.dsc.LOG.c里有把userinfo结构体变量所有字段值输出到标准输出函数。

IDL_userinfo.dsc.create.sql为表userinfo建表SQL脚本,IDL_userinfo.dsc.drop.sql为销毁表SQL脚本。

2.编写应用代码

$ cat test_db2json.c
...
int test_client()
{
        userinfo                u ;

        char                    json_buffer[ 1024 + 1 ] ;
        int                     json_len ;

        FILE                    *fp = NULL ;

        int                     nret ;

        EXEC SQL
                CONNECT TO      ‘[email protected]:18432‘
                USER            ‘calvin‘
                IDENTIFIED BY   ‘calvin‘ ;
        if( SQLCODE )
        {
                printf( "CONNECT failed[%ld][%s]\n" , SQLCODE , SQLSTATE );
                return 1;
        }
        else
        {
                printf( "CONNECT ok\n" );
        }

        DSCINITV_userinfo();

        EXEC SQL
                SELECT  *
                INTO    DBVLLIST_userinfo
                FROM    userinfo
                WHERE   user_id = 101 ;
        if( SQLCODE )
        {
                printf( "SELECT failed[%ld][%s]\n" , SQLCODE , SQLSTATE );
                EXEC SQL
                        DISCONNECT ;
                return 1;
        }
        else
        {
                printf( "SELECT ok\n" );
        }

       EXEC SQL
               DISCONNECT ;
       if( SQLCODE )
       {
               printf( "DISCONNECT failed[%ld][%s]\n" , SQLCODE , SQLSTATE );
               return 1;
       }
       else
       {
               printf( "DISCONNECT ok\n" );
       }

       DSCVTOS_userinfo( & u );

       memset( json_buffer , 0x00 , sizeof(json_buffer) );
       nret = DSCSERIALIZE_JSON_userinfo( & u , "GBK" , json_buffer , & json_len ) ;
       if( nret )
       {
               printf( "DSCSERIALIZE_JSON_userinfo failed[%d] , errno[%d]\n" , nret , errno );
               return -1;
       }

       fp = fopen( "test_db2json.json" , "w" ) ;
       if( fp == NULL )
       {
               printf( "fopen failed , errno[%d]\n" , errno );
               return -1;
       }

       fwrite( json_buffer , 1 , json_len , fp );

       fclose( fp );

       return 0;
}
...

代码说明:

首先用ESQL读出userinfo表中的一条记录(综合示例一产生的)到C结构体userinfo变量u,用到了大量DirectStruct自动生成的ESQL代码片段,用自动生成的函数DSCLOG_userinfo打印整个结构到屏幕上。

然后用自动生成的函数DSCSERIALIZE_JSON_userinfo转换C结构体userinfo变量u到JSON报文。

最后把JSON报文写入磁盘文件。

3.编译运行

$ # 执行综合示例一,在表userinfo中产生一条记录
$ ...
$ make
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/root/local/postgresql/include -I/home/calvin/exinc/fasterxml -I/home/calvin/exinc/fasterjson -c IDL_userinfo.dsc.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/root/local/postgresql/include -I/home/calvin/exinc/fasterxml -I/home/calvin/exinc/fasterjson -E -x c test_db2json.ec > test_db2json.ecE
ecpg -h test_db2json.ecE -o test_db2json.c
sed -i ‘s/NULL/0/g‘ test_db2json.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/root/local/postgresql/include -I/home/calvin/exinc/fasterxml -I/home/calvin/exinc/fasterjson -c test_db2json.c
gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o test_db2json IDL_userinfo.dsc.o IDL_userinfo.dsc.ESQL.o test_db2json.o -L. -L/root/local/postgresql/lib-lecpg -L/home/calvin/exlib -lfasterxml -lfasterjson

执行test_db2json,显示如下

$ ./test_db2json
CONNECT ok
SELECT ok
DISCONNECT ok
$ cat test_db2json.json
{
       "userinfo" :
       {
               "user_id" : 101 ,
               "user_name" : "calvin" ,
               "email" : "[email protected]"
       }
}

是不是很方便?欢迎使用DirectStruct,如果你使用中碰到了问题或者有更酷的想法请告诉我,谢谢 ^_^

首页传送门 : [url]http://git.oschina.net/calvinwilliams/DirectStruct[/url]

作者邮箱   : [email protected]

时间: 2024-11-23 14:53:03

C结构体工具DirectStruct(综合示例二)的相关文章

结构体函数作用及示例

一.作用 1. 提高代码阅读性 2. 分类管理函数及部分属性 3. 偏向于c++的面向对象思维 二.使用方法: 1. 声明结构体函数 2. 初始化结构体函数 3. 调用结构体函数 三.示例 #include<stdio.h> #include<stdlib.h> /*structure declare*/ struct str_func{ int a; int b; int (*add)(int a, int b); int (*sub)(int a, int b); int (*

五、PTA结构体实验报告

五.PTA实验作业(结构体) 题目一:   1.本题PTA提交列表: 2.设计思路(包括流程图),主要描述题目算法 //设计思路,由题目可知 1.该题采用结构体,结构体内要定义一个数据域和一个指针域 2.定义两个变量max,和min用来标识最大最小值 3.在主函数中用动态内存来为数据分派配内存并且判断是否分配内存成功: 4.用for()循环来输入n个数据:先使最大最小值都为零,再通过for()循环用所有值一次判断是否都大于max,如果大于就max=i:同理min也是这么判断 5.最后要释放内存,

六、结构体

6.1 结构体概念 结构体(struct):是由一系列具有相同类型或不同类型的数据构成的数据集合. "结构"是一种构造类型,它是由若干"成员"组成的. 每一个成员可以是一个基本数据类型或者又是一个构造类型. 结构即是一种"构造"而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它. 6.2 C++语言中的结构体 6.2.1 结构体的声明和定义 声明一个结构体类型的一般形式为: struct 结构体名{ 成员列表; }: eg: str

0920,结构体

结构体:用户自定义数据类型,实际是变量组,可以一次存多个不同变量 结构体定义在main函数的外面 string 结构体名 { // 元素一  // 元素二 } //定义一个结构体 //struct student//student就是我们自己造的新数据类型 //{ //    public int code;//public修饰符 //    public string name;//结构体的成员 //    public decimal height; //} //static void Ma

C学习之结构体

结构体(struct) 结构体是由基本数据类型构成的.并用一个标识符来命名的各种变量的组合,结构体中可以使用不同的数据类型. 1. 结构体说明和结构体变量定义 在Turbo C中, 结构体也是一种数据类型, 可以使用结构体变量, 因此,  像其它类型的变量一样, 在使用结构体变量时要先对其定义. 定义结构体变量的一般格式为: struct 结构体名 { 类型  变量名; 类型  变量名; ... } 结构体变量; 结构体名是结构体的标识符不是变量名. 类型为第二节中所讲述的五种数据类型(整型.浮

go语言结构体

定义: 是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体. 成员: 每个值称为结构体的成员. 示例: 用结构体的经典案例处理公司的员工信息,每个员工信息包含一个唯一的员工编号.员工的名字.家庭住址.出生日期.工作岗位.薪资.上级领导等等.所有的这些信息都需要绑定到一个实体中,可以作为一个整体单元被复制,作为函数的参数或返回值,或者是被存储到数组中,等等. 定义结构体: type Employee struct { ID int Name string Address string D

20150920学习内容:结构体及题目:定义一个学生的结构体,学号,姓名,身高,输入学生信息,按身高排序输出

结构体:用户自定义数据类型,实际就是变量组,可以一次存多个不同变量 结构体定义在main函数的外面 Struck 结构体名 { // 元素一 // 元素二 } 题目:定义一个学生的结构体,学号,姓名,身高,输入学生信息,按身高排序输出

3.结构体与链表

转载请标明出处:http://blog.csdn.net/u012637501 一.结构体 struct Student *p:p是一个struct Student *类型的指针变量, 用于存放struct Student类型变量的地址 1.结构体:把一些基本类型数据组合在一起形参的一个新的复合数据类型,用来表示一些复杂的事物,即称为结构体. 2.定义结构体方法 (1)第一种方法:指定结构体名,不定义结构体变量 struct Student { int age; float score; cha

C语言(三)- 结构体

一.结构体 1.一般形式 不同类型数据组成的组合型数据结构,即结构体. 结构体类型的一般形式: 1 struct 结构体名{ 2 类型名 成员名1; 3 类型名 成员名2; 4 类型名 成员名3;5 ...... 6 }; 举个例子: 1 #include<stdio.h> 2 int main(void) 3 { 4 struct Date 5 { 6 int month; 7 int day; 8 int year; 9 }; 10 struct Student 11 { 12 int n