热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

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

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


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


推荐阅读
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文介绍如何从JSON格式的文件中提取数据并将其分配给Bash脚本中的变量。我们将探讨具体的命令和工具,帮助你高效地完成这一任务。 ... [详细]
  • 本文详细介绍了 Python 中的条件语句和循环结构。主要内容包括:1. 分支语句(if...elif...else);2. 循环语句(for, while 及嵌套循环);3. 控制循环的语句(break, continue, else)。通过具体示例,帮助读者更好地理解和应用这些语句。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 基于Node.js、Express、MongoDB和Socket.io的实时聊天应用开发
    本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 在安装 SQL Server 时,选择混合验证模式可以提供更高的灵活性和管理便利性。如果您已经安装了 SQL Server 并使用单一的 Windows 身份验证模式,可以通过以下步骤将其更改为混合验证模式。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
手机用户2602926791
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有