C结构体工具DirectStruct(综合示例二)
生活随笔
收集整理的這篇文章主要介紹了
C结构体工具DirectStruct(综合示例二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
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_idSTRING 16 user_nameSTRING 128 emailCREATE_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 userinfoINT 4 user_idSTRING 16 user_nameSTRING 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
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 SQLCONNECT TO 'calvin@127.0.0.1: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 SQLSELECT *INTO DBVLLIST_userinfoFROM userinfoWHERE user_id = 101 ;if( SQLCODE ){printf( "SELECT failed[%ld][%s]\n" , SQLCODE , SQLSTATE );EXEC SQLDISCONNECT ;return 1;}else{printf( "SELECT ok\n" );}EXEC SQLDISCONNECT ;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 CONNECT ok SELECT ok DISCONNECT ok $ cat test_db2json.json {"userinfo" :{"user_id" : 101 ,"user_name" : "calvin" ,"email" : "calvinwilliams.c@gmail.com"} }
首頁傳送門 : [url]http://git.oschina.net/calvinwilliams/DirectStruct[/url]
作者郵箱?? : calvinwilliams.c@gmail.com
轉載于:https://my.oschina.net/u/988092/blog/325073
總結
以上是生活随笔為你收集整理的C结构体工具DirectStruct(综合示例二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leveldb demo
- 下一篇: Nagios配置文件上传