当前位置

网站首页> 程序设计 > 程序资讯 > 软件更新资讯 > 浏览文章

DirectStruct 更新至 v1.1.2,代码自动生成工具

作者:小梦 来源: 网络 时间: 2024-04-19 阅读:

第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.dscSTRUCT	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;}...


可以在你的代码中直接调用这些函数,而不用手工编码了。

热点阅读

网友最爱