第29期OSC源创会#南京#开始报名,AngularJS、Netty 等
ver 1.1.2 2014-10-10 calvin
* ESQL新增自动生成SQLACTION代码
* 修正了XML、JSON序列化/反序列化函数中的一个BUG
ver 1.1.1 2014-10-07 calvin
* 新增综合示例 test_client,test_server
* 新增综合示例 test_db2json
----------------------------------------------
DirectStruct是一个强有力的代码自动生成工具,它可以自动生成C结构体与XML、JSON、二进制(带压缩)等报文之间的转换代码,还能自动生成ESQL代码片段,在应用中直接使用自动化代码以提高开发效率,避免开发冗余和手工编码风险。
DirectStruct生成了哪些自动化代码?
* C结构体定义
* 批量初始化缺省值函数
* 网络/主机字节序化函数
* 二进制序列化/反序列化函数(可带压缩)
* XML序列化/反序列化函数(依赖开源库fasterxml[url]http://git.oschina.net/calvinwilliams/fasterxml[/url])
* JSON序列化/反序列化函数(依赖开源库fasterjson[url]http://git.oschina.net/calvinwilliams/fasterjson[/url])
* 嵌入式SQL代码片段以及一些嵌入式SQL函数
* 打印结构体内所有字段值函数
用DirectStruct自动生成的代码能干什么?
* 直接C结构体通讯交换 : 在特定平台之间直接把C结构体变量通过TCP扔给对方是一个很诱人的想法,阻碍我们的主要是整型字段的字节序问题,手工编码是一件冗余的事情,DirectStruct可以帮助你自动化这一过程。解决了字节序问题后就可以直接交换报文,避免了通讯发送前的打包和通讯接收后的解包,所以速度非常快,是某些追求极端性能的场景中的首选报文格式。
* 结构体序列化/反序列化 : 使用DirectStruct自动生成的序列化/反序列化函数,可以将C结构体打包成二进制报文或XML报文或JSON报文等,以及反向解包,是的,打包解包函数自动生成,省却了你不少麻烦吧。二进制报文如果启用了压缩选项,压缩后的二进制数据块大幅缩小,更便于通讯高效交换。
* 基于嵌入式SQL的数据库映射接口的代码自动化生成
* 快速打印结构体内所有字段值 : 对于一个大结构,编写他的打印所有字段值的函数是一件很无聊的事情,你可以用DirectStruct帮助你自动生成日志函数,输出到屏幕,或你自己的日志流中。
* ( 新主意增加中 ... 把你的需求告诉我吧 )
为什么使用DirectStruct?
* 灵活的报文定义语法 : 命令行工具dsc读入定义文件,生成自动化代码,支持子结构嵌套、子结构数组、定义文件包含等灵活配置方式。
* 跨平台:DirectStruct支持WINDOWS、Linux、AIX等主流操作系统,尤其是多平台中不同的表达方法,如64位整型,相同的IDL定义文件将生成不同平台的标准。
----------------------------------------------
在dsc文件中还可以使用SQLACTION指令自动生成一些ESQL函数,语法如下:
SQLACTION "SELECT ... FROM 表名 [ WHERE ... ]"
SQLACTION "INSERT INTO 表名"
SQLACTION "UPDATE 表名 SET ... [ WHERE ... ]"
SQLACTION "DELETE FROM 表名 [ WHERE ... ]"
SQLACTION "CURSOR 游标名 SELECT ... FROM 表名 [ WHERE ... ] [ ORDER BY ... [DESC|ASC] ]"
示例如下:
$ cat IDL_userinfo.dsc STRUCT userinfo { INT 4 user_id DEFAULT 1 NOTNULL STRING 16 user_name DEFAULT '0000' STRING 128 email NULL CREATE_SQL "CREATE UNIQUE INDEX userinfo_idx1 ON userinfo ( user_id ) ;" DROP_SQL "DROP INDEX testable_idx1 ;" SQLACTION "SELECT user_name,email FROM userinfo WHERE user_id =" SQLACTION "SELECT * FROM userinfo WHERE user_id = AND user_name =" SQLACTION "INSERT INTO userinfo" SQLACTION "UPDATE userinfo SET * WHERE user_id =" SQLACTION "UPDATE userinfo SET email" SQLACTION "DELETE FROM userinfo WHERE user_id >=" SQLACTION "DELETE FROM userinfo" SQLACTION "CURSOR mycursor SELECT * FROM userinfo" SQLACTION "CURSOR mycursor1 SELECT user_name FROM userinfo WHERE user_id >=" SQLACTION "CURSOR mycursor2 SELECT user_name,email FROM userinfo ORDER BY user_id ASC" SQLACTION "CURSOR mycursor3 SELECT * FROM userinfo WHERE user_id >= ORDER BY user_id ASC" } $ dsc -f IDL_userinfo.dsc -sql -ec-pqsql ... $ cat IDL_userinfo.dsc.ESQL.ec ... void DSCSQLACTION_SELECT_user_name_email_FROM_userinfo_WHERE_user_id_E( userinfo *pst ) { DSCSTOV_userinfo( pst ); EXEC SQL SELECT user_name,email INTO :userinfo_user_name :userinfo_user_name_id , :userinfo_email :userinfo_email_id FROM userinfo WHERE user_id = :userinfo_user_id ; if( SQLCODE ) return; DSCVTOS_userinfo( pst ); return; } void DSCSQLACTION_SELECT_A_FROM_userinfo_WHERE_user_id_E_AND_user_name_E( userinfo *pst ) { DSCSTOV_userinfo( pst ); EXEC SQL SELECT * INTO DBVLLIST_userinfo FROM userinfo WHERE user_id = :userinfo_user_id AND user_name = :userinfo_user_name ; if( SQLCODE ) return; DSCVTOS_userinfo( pst ); return; } void DSCSQLACTION_INSERT_INTO_userinfo( userinfo *pst ) { DSCSTOV_userinfo( pst ); EXEC SQL INSERT INTO userinfo VALUES ( DBVLLIST_userinfo ) ; return; } void DSCSQLACTION_UPDATE_userinfo_SET_A_WHERE_user_id_E( userinfo *pst ) { DSCSTOV_userinfo( pst ); EXEC SQL UPDATE userinfo SET ( TFLIST_userinfo ) = ( DBVLIST_userinfo ) WHERE user_id = :userinfo_user_id ; return; } void DSCSQLACTION_UPDATE_userinfo_SET_email( userinfo *pst ) { DSCSTOV_userinfo( pst ); EXEC SQL UPDATE userinfo SET email = :userinfo_email ; return; } void DSCSQLACTION_DELETE_FROM_userinfo_WHERE_user_id_GE( userinfo *pst ) { DSCSTOV_userinfo( pst ); EXEC SQL DELETE FROM userinfo WHERE user_id >= :userinfo_user_id ; return; } void DSCSQLACTION_DELETE_FROM_userinfo( userinfo *pst ) { DSCSTOV_userinfo( pst ); EXEC SQL DELETE FROM userinfo ; return; } void DSCSQLACTION_OPEN_CURSOR_mycursor_SELECT_A_FROM_userinfo( userinfo *pst ) { EXEC SQL DECLARE userinfo_mycursor CURSOR FOR SELECT * FROM userinfo ; if( SQLCODE ) return; EXEC SQL OPEN userinfo_mycursor ; if( SQLCODE ) return; return; } void DSCSQLACTION_FETCH_CURSOR_mycursor( userinfo *pst ) { EXEC SQL FETCH userinfo_mycursor INTO DBVLLIST_userinfo ; if( SQLCODE ) return; DSCVTOS_userinfo( pst ); return; } void DSCSQLACTION_CLOSE_CURSOR_mycursor() { EXEC SQL CLOSE userinfo_mycursor ; return; } void DSCSQLACTION_OPEN_CURSOR_mycursor1_SELECT_user_name_FROM_userinfo_WHERE_user_id_GE( userinfo *pst ) { EXEC SQL DECLARE userinfo_mycursor1 CURSOR FOR SELECT user_name FROM userinfo WHERE user_id >= :userinfo_user_id ; if( SQLCODE ) return; EXEC SQL OPEN userinfo_mycursor1 ; if( SQLCODE ) return; return; } void DSCSQLACTION_FETCH_CURSOR_mycursor1( userinfo *pst ) { EXEC SQL FETCH userinfo_mycursor1 INTO :userinfo_user_name :userinfo_user_name_id ; if( SQLCODE ) return; DSCVTOS_userinfo( pst ); return; } void DSCSQLACTION_CLOSE_CURSOR_mycursor1() { EXEC SQL CLOSE userinfo_mycursor1 ; return; } void DSCSQLACTION_OPEN_CURSOR_mycursor2_SELECT_user_name_email_FROM_userinfo_ORDER_BY_user_id_ASC( userinfo *pst ) { EXEC SQL DECLARE userinfo_mycursor2 CURSOR FOR SELECT user_name,email FROM userinfo ORDER BY user_id ASC ; if( SQLCODE ) return; EXEC SQL OPEN userinfo_mycursor2 ; if( SQLCODE ) return; return; } void DSCSQLACTION_FETCH_CURSOR_mycursor2( userinfo *pst ) { EXEC SQL FETCH userinfo_mycursor2 INTO :userinfo_user_name :userinfo_user_name_id, :userinfo_email :userinfo_email_id ; if( SQLCODE ) return; DSCVTOS_userinfo( pst ); return; } void DSCSQLACTION_CLOSE_CURSOR_mycursor2() { EXEC SQL CLOSE userinfo_mycursor2 ; return; } void DSCSQLACTION_OPEN_CURSOR_mycursor3_SELECT_A_FROM_userinfo_WHERE_user_id_GE_ORDER_BY_user_id_ASC( userinfo *pst ) { EXEC SQL DECLARE userinfo_mycursor3 CURSOR FOR SELECT * FROM userinfo WHERE user_id >= :userinfo_user_id ORDER BY user_id ASC ; if( SQLCODE ) return; EXEC SQL OPEN userinfo_mycursor3 ; if( SQLCODE ) return; return; } void DSCSQLACTION_FETCH_CURSOR_mycursor3( userinfo *pst ) { EXEC SQL FETCH userinfo_mycursor3 INTO DBVLLIST_userinfo ; if( SQLCODE ) return; DSCVTOS_userinfo( pst ); return; } void DSCSQLACTION_CLOSE_CURSOR_mycursor3() { EXEC SQL CLOSE userinfo_mycursor3 ; return; } ...
可以在你的代码中直接调用这些函数,而不用手工编码了。