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

calvinwilliams
 calvinwilliams
发布于 2014年10月13日
收藏 28

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


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

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:DirectStruct 更新至 v1.1.2,代码自动生成工具
加载中
返回顶部
顶部