中标麒麟环境下基于Qt的神通数据库编程浅析
2017-05-12姜家文许荣胜胡振宇
姜家文+许荣胜+胡振宇
摘 要:随着国外各种信息安全事件频发,在国防等关键领域采用国外开发的闭源操作系统和软件可能引入未知后门,对国家信息安全带来潜在的隐患。本文采用中标麒麟为操作系统,以开源Qt为开发软件,对国产神通数据库进行操作编辑,实现需要数据库情景下的基本软件编程,为关键领域实现数据安全和自主可控提供了解决思路。
关键词:中标麒麟;神通数据库;Qt
中图分类号:TP311 文献标识码:A
Abstract:As information security incidents frequently happen in foreign countries,it may lead to unknown back doors and cause potential threats to national information security if foreign closed-source operating systems and software programs are applied in crucial areas,such as the national defense.In this paper,the study is conducted in the NeoKylin operating system and open-source Qt is applied as the development software.The domestic Shentong database is applied to implement the basic database programming,which provides solving ideas to guarantee security,independence and controllability of the information in crucial areas.
Keywords:NeoKylin;Shentong database;Qt
1 引言(Introduction)
近年來,国外各种信息安全事件频发,特别是“棱镜门”事件给各个国家敲响了信息安全的警钟。采用国外开发的闭源操作系统和软件可能引入未知后门,对政府、国防、金融、电力、机要、保密等领域的安全带来潜在的隐患[1-3]。2014年5月16日,中国政府采购网发布《关于进行信息类协议供货强制节能产品补充招标的通知》,其中明确要求计算机类产品不允许安装微软Windows 8操作系统。因此在信息安全要求高的领域,采用国产系统和开源软件为大势所趋。本文采用中标麒麟为操作系统,以开源Qt为开发软件,对国产神通数据库进行操作编辑,实现需要数据库情景下的软件基本编程,为关键领域实现数据安全和自主可控提供了解决思路。
2 编程环境 (Programming environment)
2.1 中标麒麟操作系统
中标麒麟是中标软件有限公司研制推出的国内首款自主可控、高安全等级可信操作系统,全称为中标麒麟可信操作系统软件。结合可信计算机技术和操作系统安全技术,中标麒麟通过信任链的建立及传递实现对平台软硬件的完整性度量;提供基于三权分立机制的多项安全功能和统一的安全控制中心;全面支持国内外可信计算规范(TCM/TPCM、TPM2.0);兼容主流的软硬件和自主CPU平台,如飞腾、龙芯、申威。文中所用的软件版本为Neoky Lin3.2。现阶段麒麟系统安装已友好化,可全程傻瓜式安装,但中途注意不要忘记勾选安装所需要的开发环境和工具包。
2.2 Qt5.5开源开发工具
Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架[4]。它既可以开发GUI程序,也可用于开发非GUI程序。Qt是面向对象的框架,使用特殊的代码生成扩展以及一些宏,易于扩展,允许组件编程。选择Qt作为开发工具不仅因为其开发功能强大,许多著名软件如Opera浏览器、Skype、Google地球等都由Qt开发而来。更主要是有开源版本的同时支持跨平台运行,一次开发可以几乎不需要改动的情况下,在Windows和麒麟下编译运行,为程序过度创造条件。文中使用Linux Red-hat开源版Qt5.5,采用可视化编程模式。网络上可下载到两种安装包,一种是源代码版,安装前需要自己编译,好处是可以根据需要进行适当的设置,另一种是已编译好可直接安装,但安装过程不可编辑,建议对Linux系统不熟悉的用户使用后者。另Qt5相对于Qt4,改进较大,Qt4运行Qt5代码会出错,而Qt4中部分代码Qt5也不再支持,因此团队开发时应注意使用同一版本的Qt。
2.3 神通数据库
神通数据库是一款国产的计算机数据库,提供大型关系型数据库通用的功能。其具有丰富的数据类型、多种索引类型、存储过程、触发器、内置函数、视图、Package、行级锁、完整性约束、多种隔离级别、在线备份、支持事务处理等通用特性。系统支持SQL通用数据库查询语言,提供多种标准数据访问接口;便于开发编程,另外兼容Oracle数据库,便于移植。文中使用版本为神通数据库管理系统7.0。在安装时注意给予root权限,否则在创建数据库时会出错。
3 Qt与神通数据库的连接(Connection between Qt and Shentong datebase )
数据库提供标准的ODBC、JDBC、OLEDB/ADO、.NET Framework和ACI等多种数据访问接口[5]。其中OLEDB/ADO和.NET Framework是用于Windows系统,其他三种兼容Windows系统和麒麟系统,但是ODBC、JDBC在使用前均需要在麒麟系统上配置相应驱动。ACI接口使用C语言或C++语言通过SQL来访问神通数据库。在使用神通ACI 接口编程时,仅需要引入头文件aci.h,不需要其他配置操作。ACI接口采用兼容Oracle数据库OCI接口方式,使得应用能够快速的从Oracle数据库迁移到神通数据库上,极大的减少了应用开发移植的时间和成本。神通数据库自带SQL交互工具,为用户提供友好的图形化界面使用SQL语言,操作数据库对象和更新数据。因此使用ACI接口的方式也使得程序检验变得简单。综上,文中采用ACI接口方式建立数据库和Qt的连接。
使用ACI的方式建立Qt与神通数据库的连接主要经历几个步骤。第一步,初始化神通ACI接口的运行环境。第二步,分配环境句柄、语句句柄、服务器句柄、会话句柄等数据结构。这两步基本每次操作都一样,是默认必须有的。第三步,建立与神通数据库的连接及创建用户会话。建立连接需要给程序提供神通数据库服务器地址,用户名和密码。如果是在本机开发调试,连接自身安装数据库,服务器地址可直接输入localhost。第四步,通过SQL语句与神通数据库服务器交互,然后对获取的数据进行处理。这一步包含几个步骤。首先需要准备SQL语句,告诉数据库需要执行的操作,如查询(SELECT)、插入(INSERT)、更新(UPDATE)等。然后按位置绑定所操作表中的数据,告诉数据库每个数据的类型,如整形(SQLT_INT),字符串类型(SQLT_STR),字符大对象型(SQLT_CLOB)等。这是关键的一步,因为少绑、没绑、或者错绑均得不到正确的结果。最后执行SQL语句,该步中的执行分为有结果显示和没有结果显示两种。前者比如查询类,执行SQL语句后仅将结果放置在内存中,需要加循环输出显示语句。后者比如插入类,并不需要反馈结果。第五步,结束用户会话,断开ACI接口与神通数据库的连接,并释放在程序中所分配的各类句柄和资源。这一步很重要,在对有很多数据的大型数据库进行操作时,会占用系统大量的内存和CPU资源。如果每次操作后,不及时释放资源,会使服务器负荷越来越重,最后瘫痪,造成不可估计的后果。ACI接口有错误句柄,可以在程序中利用其收集错误信息,方便程序排错。以上操作和使用函数简明显示如图1所示。
4 神通数据库编程实例(Programming examples of Shentong database)
本節使用Qt和神通数据库,在麒麟操作系统下通过ACI接口编写一个实例的小程序,主要实现数据的存储、读取和删除。
4.1 例子背景
建立一个学生花名册,要求可视化界面录入、显示或者删除学生的信息。其中每个学生包含的信息包括学号(唯一标识)、姓名、年龄、性别和家庭住址共五项内容。
4.2 设计思路
编程主要包括两个部分,可视化界面和后台程序处理。按照例子背景要求,主界面上应该有录入学生信息的五个输入框、录入按钮、显示花名册按钮、显示控件及删除按钮。利用Qt做出主界面,展示如图2所示。
后台程序主要实现学生信息数据的存储、读取及显示、删除三种功能。每一种都离不开数据库的操作,这都可以利用ACI接口实现。在数据库中建立学生信息表,以学号为主键,共建5列,分别为学号、姓名、性别、年龄和家庭住址,即每行代表一名学生的所有信息。特别值得一提的是姓名、性别和家庭住址在进行数据库中录入需要记录中文,此时数据绑定应该选择字符大对象(CLOB)类型。误操作处理也是需要考虑的。比如学号唯一,当录入相同学号学生信息时应提示错误;学生信息录入不全时,点击录入按钮,应该有提示;删除前应该有确认提示,删除或者录入成功时也应有提示等等。
4.3 关键代码展示
篇幅所限,为了尽可能展示Qt和神通数据交互编程过程,以学生信息数据显示为例,给出关键代码和注释。
ACI通过SQL来访问神通数据库,因此为了程序能正确运行,首先必须保证SQL语句不出错,能在神通数据库SQL插件中正常运行。学生信息数据SQL查询语句为“select * from test.roster order by NUM”。其中test为表空间,roster才是具体表。
可以建立存储单个学生的结构体,便于后面综合信息处理。其代码如下:
typedef struct{ int ID; char NAME[50]; char SEX[10]; int AGE; char AD[200];}Record;
初始化接口环境,登录数据库,准备SQL语句,再按位置进行数据绑定。前面提到这步的重要性,排序位置要正确,同时数据类型不能出错,共五个录入数据,因此需要绑定五次,其绑定代码如下:
r=ACIDefineByPos(m_pStmt,&m_Def,m_pErr,1,(void*)&rec.ID,sizeof(rec.ID),SQLT_INT,0,0,0,ACI_DEFAULT);
r=ACIDefineByPos(m_pStmt,&m_Def,m_pErr,2,(void*)&rec.NAME,sizeof(rec.NAME),SQLT_CLOB,0,0,0,ACI_DEFAULT);
r=ACIDefineByPos(m_pStmt,&m_Def,m_pErr,3,(void*)&rec.SEX,sizeof(rec.SEX),SQLT_CLOB,0,0,0,ACI_DEFAULT);
r=ACIDefineByPos(m_pStmt,&m_Def,m_pErr,1,(void*)&rec.AGE,sizeof(rec.AGE),SQLT_INT,0,0,0,ACI_DEFAULT);
r=ACIDefineByPos(m_pStmt,&m_Def,m_pErr,3,(void*)&rec.AD,sizeof(rec.AD),SQLT_CLOB,0,0,0,ACI_DEFAULT);
数据绑定完毕后即可执行SQL语句,如果是在数据库中插入数据,到这里就可以断开连接和释放句柄。但是这里是查询数据,SQL语句执行完毕后,仅把数据读入到内存中,还需要循环取出,经过处理最后展示到显示控件上。这里仅将学号和年龄合并写入一个M数组,便于主函数读取处理,其代码如下:
最后断开与数据库的连接,并释放句柄,整个查询过程就算结束了。本小节仅给出部分Qt与神通数据库互联的代码,对于执行查询过程本身自然还有工作需要做,比如需要利用Qt转到槽功能将查询按钮与上面的查询函数关联起来,略过不提。
5 结论(Conclusion)
文中使用中标麒麟操作系统,以开源Qt为开发工具,对国产神通数据库进行操作。介绍了利用神通数据库自带的ACI接口,用Qt连接操作数据库的方法,并给出一个相应编程实例,展示关键代码。在例子中实现了简单的数据存储和读取,为数据安全和自主可控要求高的区域提供了可行编程思路,是未来关键领域数据开发的可行之道。
参考文献(References)
[1] Pierson G,DeHaan J.Network Security and Fraud Detection System and Method[P].U.S.Patent.
[2] Yan J,He H,Sun Y.Integrated Security Analysis on Cascading Failure in Complex Networks[J].IEEE Transactions on Information Forensics and Security,2014,9(3):451-463.
[3] Chen Z,et al.Cloud computing-Based Forensic Analysis for Collaborative Network Security Management System[J].Tsinghua Science and Technology,2013,18(1):40-50.
[4] 陆文周.Qt5开发及实例[M].北京:电子工业出版社,2014.
[5] 何清法,王澍丰,顾云苏.国产神通数据库教程[M].西安:西安交通大学出版社,2012.
作者简介:
姜家文(1991-),男,硕士,助理工程师.研究领域:软件开发.
许荣胜(1984-),男,本科,助理工程师.研究领域:软件开发.
胡振宇(1990-),男,本科,助理工程师.研究领域:软件开发.