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代碼片斷

$ 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      '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 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" : "calvinwilliams.c@gmail.com"
       }
}
是否是很方便?歡迎使用DirectStruct,若是你使用中碰到了問題或者有更酷的想法請告訴我,謝謝 ^_^ 首頁傳送門 : [url]http://git.oschina.net/calvinwilliams/DirectStruct[/url] 做者郵箱   : calvinwilliams.c@gmail.com
相關文章
相關標籤/搜索