热门标签 | 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;
}
...


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


推荐阅读
  • Composer Registry Manager:PHP的源切换管理工具
    本文介绍了一个用于Composer的源切换管理工具——Composer Registry Manager。该项目旨在简化Composer包源的管理和切换,避免与常见的CRM系统混淆,并提供了详细的安装和使用指南。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文由瀚高PG实验室撰写,详细介绍了如何在PostgreSQL中创建、管理和删除模式。文章涵盖了创建模式的基本命令、public模式的特性、权限设置以及通过角色对象简化操作的方法。 ... [详细]
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社区 版权所有