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

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代码片段

1$ cat IDL_userinfo.dsc 2STRUCT userinfo 3{ 4 INT 4 user_id 5 STRING 16 user_name 6 STRING 128 email 7 8 CREATE_SQL "CREATE UNIQUE INDEX userinfo_idx1 ON userinfo ( user_id ) ;" 9 DROP_SQL "DROP INDEX testable_idx1 ;" 10} 11$ dsc -f IDL_userinfo.dsc -c-xml -sql -ec-pqsql -c-LOG 12STRUCT userinfo 13 INT 4 user_id 14 STRING 16 user_name 15 STRING 128 email 16ok! 17$ ls -1 IDL_userinfo.* 18IDL_userinfo.dsc 19IDL_userinfo.dsc.ESQL.ec 20IDL_userinfo.dsc.ESQL.eh 21IDL_userinfo.dsc.LOG.c 22IDL_userinfo.dsc.c 23IDL_userinfo.dsc.create.sql 24IDL_userinfo.dsc.drop.sql 25IDL_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.编写应用代码

1$ cat test_db2json.c 2... 3int test_client() 4{ 5 userinfo u ; 6 7 char json_buffer[ 1024 + 1 ] ; 8 int json_len ; 9 10 FILE *fp = NULL ; 11 12 int nret ; 13 14 EXEC SQL 15 CONNECT TO 'calvin@127.0.0.1:18432' 16 USER 'calvin' 17 IDENTIFIED BY 'calvin' ; 18 if( SQLCODE ) 19 { 20 printf( "CONNECT failed[%ld][%s]\n" , SQLCODE , SQLSTATE ); 21 return 1; 22 } 23 else 24 { 25 printf( "CONNECT ok\n" ); 26 } 27 28 DSCINITV_userinfo(); 29 30 EXEC SQL 31 SELECT * 32 INTO DBVLLIST_userinfo 33 FROM userinfo 34 WHERE user_id = 101 ; 35 if( SQLCODE ) 36 { 37 printf( "SELECT failed[%ld][%s]\n" , SQLCODE , SQLSTATE ); 38 EXEC SQL 39 DISCONNECT ; 40 return 1; 41 } 42 else 43 { 44 printf( "SELECT ok\n" ); 45 } 46 47 EXEC SQL 48 DISCONNECT ; 49 if( SQLCODE ) 50 { 51 printf( "DISCONNECT failed[%ld][%s]\n" , SQLCODE , SQLSTATE ); 52 return 1; 53 } 54 else 55 { 56 printf( "DISCONNECT ok\n" ); 57 } 58 59 DSCVTOS_userinfo( & u ); 60 61 memset( json_buffer , 0x00 , sizeof(json_buffer) ); 62 nret = DSCSERIALIZE_JSON_userinfo( & u , "GBK" , json_buffer , & json_len ) ; 63 if( nret ) 64 { 65 printf( "DSCSERIALIZE_JSON_userinfo failed[%d] , errno[%d]\n" , nret , errno ); 66 return -1; 67 } 68 69 fp = fopen( "test_db2json.json" , "w" ) ; 70 if( fp == NULL ) 71 { 72 printf( "fopen failed , errno[%d]\n" , errno ); 73 return -1; 74 } 75 76 fwrite( json_buffer , 1 , json_len , fp ); 77 78 fclose( fp ); 79 80 return 0; 81} 82...

代码说明:
首先用ESQL读出userinfo表中的一条记录(综合示例一产生的)到C结构体userinfo变量u,用到了大量DirectStruct自动生成的ESQL代码片段,用自动生成的函数DSCLOG_userinfo打印整个结构到屏幕上。
然后用自动生成的函数DSCSERIALIZE_JSON_userinfo转换C结构体userinfo变量u到JSON报文。
最后把JSON报文写入磁盘文件。

3.编译运行

1$ # 执行综合示例一,在表userinfo中产生一条记录 2$ ... 3$ make 4gcc -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 5gcc -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 6ecpg -h test_db2json.ecE -o test_db2json.c 7sed -i 's/NULL/0/g' test_db2json.c 8gcc -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 9gcc -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,显示如下

1$ ./test_db2json 2CONNECT ok 3SELECT ok 4DISCONNECT ok 5$ cat test_db2json.json 6{ 7 "userinfo" : 8 { 9 "user_id" : 101 , 10 "user_name" : "calvin" , 11 "email" : "calvinwilliams.c@gmail.com" 12 } 13}

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

首页传送门 : [url]http://git.oschina.net/calvinwilliams/DirectStruct\[/url\]
作者邮箱   : calvinwilliams.c@gmail.com

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang