摘要
DBMS(Database Management System)在当前的信息系统开发中处于主导位置,LiuDBMS是一个小型的,单机版,微内核的DBMS开发包,可以通过定制这个开发包来满足中小规模信息系统的应用。
本文主要论述了LiuDBMS这一微内核的数据库管理系统的开发过程,本文主要包括LiuDBMS系统分析,系统设计,系统实现,系统使用与部署,系统的扩展与DBMS系统未来的发展趋势。
关键字:DBMS,LiuDBMS
前言
想开发自己的数据库管理系统已经有很长时间了,到今天2008年5月6日,对我来讲具有历史意义的一天大概有三年半了吧,从最早的2004年 12月份我开始立项。
回想起当时立项时,自己想用大学期间的时间完成一个WEB服务器和DBMS,自己毕业设计时用自己的WEB服务器,配上自己的DBMS,跑自己的WEB应用系统,可是到了毕业的时候,确实发布了自己的LiuServer(WEB服务器),但当时由于LiuDBMS还不是很完善,所以只好用了自己做的一个基于XML的文件数据管理程序,跑起来自己的WEB应用程序。
开发DBMS说起来有一段典故,记得当时对PHP,MySql,还有Tomcat这些东西很着迷,在用的时候不断地发现原来这些开源的项目,几乎都是个人因为兴趣与爱好而做出来,当然这些都是老外做出来的。这一点让我感到很不服气,因为当前国内有很多优秀的程序员,从水平上他们也具备完成这些内容的能力,但是比较遗憾的当前中国程序员团队对于开源社区的贡献仍然微不如道。
我们大部分情况下习惯使用别人的思想,在别人的想法上做开发,在很多时候满足并陶醉于这种成果。
我本人不想这么干,我觉得要改变这种现状,程序员同志们,在空闲的时候为什么不能为自己的兴趣而做点事情呢,我知道,我们都面临着现实的压力,面临着如何用自己手中的技术换钱,但是生活的幸福感有时候并不是因为钱的多寡,我们可以做很多有意义的事情,人生不意味着赚钱,有可能你一生就做好了这么一个项目,我觉得也值的。因为你为整个社区贡献了自己的力量,并且这种力量会产生很多正面的影响,何乐而不为!
第一章 系统介绍
1.1 项目背景
DBMS全称是数据库管理系统,是信息社会的基础,当前流行的DBMS系统是基于关系型。
LiuDBMS是向桌面应用程序与嵌入式环境提供一套标准而又通用的开发包,LiuDBMS支持SQL92语法,能够面向各个平台进行定制。
LiuDBMS历经多个版本,从2004年底最初的一个小型的面向控制台的数据库管理程序,到2005年开始进行的前期设计工作,在设计中也经历了多次变化,这种变化是实验不同的存储结构,这里面的基于纯XML的,也有基于纯二进制的。2006年中下旬,利用自己每天晚上的一个小时开始陆陆续续从事LiuXMLDBMS原型机的开发工作。2008年4月12日在经过一番思考后,在一个网友的交流与鼓励下,决定结束这个旷日持久的工作。2008年5月6号,经过近一个月的努力,总算是完成LiuDBMS Ver 1.0版本的开发,为项目的发展起到了一个立程碑式的作用。
1.2 总体介绍
作为一个DBMS项目,LiuDBMS当前支持15个命令,涵盖对数据库的操作,对表的操作,对记录的操作以及其他专用命令。
LiuDBMS中默认的数据库均放在与可执行文件同级的Data目录内,打开Data目录会看到一个configsys.dcy的文件,这个文件中记录了当前所有数据库的相关信息,可以通过show databases命令查看当前的此文件。
LiuDBMS中创建一个数据库就是在Data目录下创建一个用这个新数据库名命名的目录,创建完毕后,将创建的些数据库信息以一条记录的方式插入到configsys.dcy文件中。
LiuDBMS删除一个数据库对应的是相反的操作,首先将删除这个数据库所在目录的所有数据文件与配置文件,然后删除掉该数据库目录,最后将此数据库中的信息从configsys.dcy文件中删除。
LiuDBMS创建一张表,在执行建表任务前,首先要确保使用USE命令进行选择要操作的数据库。建表操作是首先解析SQL语句,从SQL语句中分析出所建数据表的表名,字段信息名,字段属性,是否为空,是否为主键。LiuDBMS中必须有一个主键,若用户在创建时,则默认第一个字段为主键。对上一步所分析出来的数据以一种LiuDBMS能理解的数据结构,执行建表操作。
建表操作第一步是创建三个文件xxx.lst,xxx.lid,xxx.ltd(xxx假设为要创建的数据表),其中xxx.lst文件主要存储表的结构,xxx.lid用于存储索引信息,xxx.ltd用于存储数据文件。
建表操作第二步是将当前数据库中配置文件table.list加入一条记录。table.list文件是在创建一个数据库时自动创建,主要用于存储当前数据库中的表信息。当选中要操作的数据库时,可以用show tables命令来查看数据表。
LiuDBMS删除一张表,类比于删除数据库,首先还是要保证当前有选中的数据库,删除表所对应的三个文件,同时删除table.list中该表所对应的文件。
LiuDBMS插入一条记录,首先保证在选中的数据库,分析插入命令,主要找出要操作的表名,以及字段列表和要插入的数据值。形成系统能识别的数据格式,然后执行插入操作,同时更新索引文件。
LiuDBMS删除一条记录,分析删除命令,首先通过Where语句中的条件判断从索引中找到该记录,然后执行索引删除,注意只是将此记录从索引中删除。
LiuDBMS查找记录,分析Where命令,从索引中找出符合条件的记录集,然后通过索引找出真实记录值,同时将结果集更新到返回结果集里。
LiuDBMS更新记录,找出符合条件的记录,得到该记录的原有值,同时通过Set命令进行字段值的更新,同时删除此记录,再执行插入。
LiuDBMS是基于命令进行驱动执行,所以通常工作模式是二阶段的。第一阶段是SQL语句解析,将用户输入的SQL语句解析成能进行操作数据结构,第二阶段是执行阶段,用上一阶段所获得的数据结构作为参数,执行相关命令。
1.3 项目意义
在从事LiuDBMS项目时,面临最多的困难是质疑它的可用性与内在的价值,每当有新的项目要立项时,首先要中止的是LiuDBMS,所以提起这个项目是我心里一个痛处,曾经我仔细想过这个项目的未来与前景,但最终还是决彻底放弃,有一天收到了一封邮件,是一个网友说看到了我从前写的一篇文章,专门介绍DBMS的。这封邮件唤起来我心里久围的感动与激情,在同这位网友仔细讨论了相关的内容,我决定不惜一切搞出来,在技术选型是上个月也面临一些选择,是做纯XML的DBMS还是做从前更成熟的文本存储方式,但经过衡量后,发现XML格式是自已定义的文本格式的一个变种,未来可以轻松升级到XML格式。
LiuDBMS项目带给我的好处是让我真正认识到了有志者事竟成,在很多时候,犹豫与讨价还价的时间远远超过了真正解决问题的时间。
另外LiuDBMS项目的完成,能够很快的集成未来多用户版本,当然未来的功能也会更强大,更高效。
1.1 总结
本章主要介绍了LiuDBMS的一些背景知识,期间也重点介绍了LiuDBMS的各个功能的实现原理。
相信读到这里,应该会对LiuDBMS有一个比较感性的认识了。
第二章 系统总体分析
本章主要分析了LiuDBMS项目整个设计结构,模块划分以及主要的设计思想。
2.1总体分析
LiuDBMS的设计是基于命令驱动,从其整个设计流程是比较简单的,基于三阶段式的处理过程:
阶段一:SQL词法分析阶段,将输入的字符流,转化为以单词为结点的一种线性结构。
阶段二:SQL语法分析阶段,将上一阶段中的线性表式的SQL命令,进行语法分析,本阶段主要进行验证输入的正确性,识别其含义,本阶段产生的输出是相应命令的一间能够处理的中间结构。
阶段三:SQL执行阶段,本阶段是用上一阶段所生成的数据结构作为输入,调用相关命令的执行过程进行真正的操作执行。
三阶段流程图,见图2-1
SQL语法与语义分析
|
SQL命令执行 |
SQL词法分析 |
图2-1
2.2 命令集合
LiuDBMS当前支持15种命令,每一种命令对应一个相对独立的子模块,每一个了子模块一般对应三阶段操作。
下表2-2列出了LiuDBMS当前所支持的命令集合。
表2-2 命令集合
编号 | 使用语法 | 作用 |
1 | create database XXX | 创建一个数据库 |
2 | drop database XX | 删除一个数据库 |
3 | create table XXX | 创建一张表,详细命令见SQL92定义 |
4 | drop table XXX | 删除一张存的表 |
5 | insert into XXX | 要指定的表插入一条记录 |
6 | select * from XXX | 从指定的表中读取一条记录 |
7 | update XXX set | 修改符合条件的记录 |
8 | delete from XXX | 删除符合条件的记录 |
9 | use XXX | 使用指定的数据库 |
10 | getcwd | 获得当前数据库名 |
11 | show databases | 显示当前的数据库列表 |
编号 | 使用语法 | 作用 |
12 | show tables | 显示当前的数据库中数据表列表 |
13 | help | 输出帮助 |
14 | desc XXX | 查看指定的表结构 |
15 | exit | 安全退出应用程序 |
2.3 词法分析阶段的设计思想
2.3.1 词法分析
词法分析阶段是将用户输入的字符流,转换成可分析的单词流,本阶段可理解为采用分词技术,将符合SQL语法规范的输入符拆分或组合成一个个单词。词法分析阶段是以全局的方式为所用命令的第一步操作所共享,在LiuDBMS中专门定义了函数:
bool SplitCommand(char *pStrCommand,vector<string> &pCommandField)
其中输入参数一是指从终端获取到有字符流;输入参数二是生成的单词集合。
2.3.2 实现算法
词法分析的主要实现算法是(具体的实现请参看相关代码):
1.创建一个string类型的变量,用于存放当前待分析的单词结点,记做strValue。
2.从缓存区中顺次读取每一个字符,判断当前读入的字符值,若当前值为'/t', ' '则,转向3;若当前值为'(',')',','则转向4;其他则转向5;若为'/0'则退出
3.若当前的单词结点的长度不为空,则将strValue加入单词序列结果集合,同时将strValue置为空,转向2
4.若当前单词结点不为空,则将strValue加入结果集合;同时将当前输入的字符作为一个结点加入结果集,strValue置空,转向2
5.将当前分析的字符加入到strValue,转向2
2.4 语法与语义分析阶段的设计思想
语法与语义分析阶段主要是利用词法分析阶段中的结点集合,通过各个SQL命令不同的语法结构,进行语法检查与语义分析,最后生成可供第三阶段执行的输入参数。
由于本阶段的主要工作是将由下一章重点介绍。
2.5 库操作的设计思想
2.5.1 原理结构
LiuDBMS中的数据库对应是对应一个目录,LiuDBMS默认的数据库存放目录入在可执行文件当前的data目录中。
在Data目录中文件configsys.dcy,主要进行存放数据库的配置文件。
2.5.2 库创建设计思想
LiuDBMS中库的创建操作流程:
1.解析SQL词法,主要是解析命令create database XXX,同时检查用户输入是否符合格式,若检查通过,则转向2,否则报错
2.得到数据库名,同时从configsys.dcy中分析当前数据库是否存在,若存在则转向3,否则报错退出
3.在data目录中创建以XXX命名的目录,同时在configsys.dcy文件中添加一条记录,同时在新创建XXX目录中创建table.list文件
2.5.3 库删除设计思想
LiuDBMS中删除数据库的操作流程:
1.解析SQL词法,主要是解析drop database XXX,同时检查是否符合SQL语法,获得要操作的数据库名,同时转向2,否则报错退出
2.从configsys.dcy中分析当前要删除的数据库是否存在,如果存在,则转向3,否则出错
3.依次删除XXX目录中的所有文件
2.5.4 显示库设计思想
LiuDBMS中显示数据库的操作流程:
1.解析命令show databases,若通过则转向2,否则出错
2.从configsys.dcy中分析当前的记录集,显示记录集到终端
2.5.5 使用库设计思想
LiuDBMS中使用数据库的操作流程:
1.解析use XXX命令,获得数据库名,若无错则转向2,否则退出
2.从configsys.dcy中分析当前是否存在要操作的数据库名,若存在,则将公共变量strCurrentDBName,置为数据库名,若出错,则退出
2.5.6 获得当前库设计思想
LiuDBMS中获得当前数据库的操作流程:
1.检查命令getcwd,若不符合规则,则出错退出;否则转向2
2.检查strCurrentDBName是否为空,若不为空,则打印strCurrentDBName
2.6 表操作的设计思想
2.6.1 原理结构
在LiuDBMS系统中,针对表的操作是三个文件,分别是XXX.lst、XXX.lid、XXX.ltd三个文件,分别对应表结构文件、表索引文件、表数据文件。
在LiuDBMS中默认每张表都会有一个主键,如果在SQL语句中没有指定则默认第一个字段为主键。
2.6.2 创建表设计思想
在LiuDBMS系统中创建表的流程:
1.解析SQL语句,create table XXX (fieldname fieldtype not null),进行词法分析,同时进行语法分析,若成功则转向2,否则出错退出
2.得到XXX表名,通过检查table.list文件,分析当前当前表名是否合法,是否已经定义,若成功则转向3,否则退出
3.将定义了结构体struct TableNode用于存在表信息,面向每个数据库中的表配置文件;定义了struct FieldNode用于存放字段信息结点,同时将形成字段信息列表,若成功则转向4,否则退出
4.创建XXX.lst文件,将字段列表写入XXX.lst文件中;同时创建文件XXX.lid与XXX.ltd文件
2.6.3 删除表设计思想
在LiuDBMS系统中删除表的流程:
1.解析SQL词法drop table XXX命令,若语法检查成功,则转向2 ,否则出错退出
2.获得表名,检查XXX表名,若当前表存在,则删除XXX.lst、XXX.lid、XXX.ltd这三个文件;否则出错退出
2.6.4 显示表结构设计思想
在LiuDBMS系统中显示表结构的流程:
1.解析desc XXX命令,若不符合,则出错,否则转向2
2.获得XXX,判断表是否存在,若不存在则退出;否则读取XXX.lst文件,同时将这个结构文件,显示到终端
2.6.5 显示表列表设计思想
在LiuDBMS系统中显示表的流程:
1.解析show tables命令,若不符合语法规则,则退出;否则转向2
2.读取文件table.list文件,将当前的表列表显示到终端
2.7 记录操作的设计思想
2.7.1 原理结构
在LiuDBMS系统中,针对表的操作是三个文件,分别是XXX.lst、XXX.lid、XXX.ltd三个文件,分别对应表结构文件、表索引文件、表数据文件。
在LiuDBMS中默认每张表都会有一个主键,如果在SQL语句中没有指定则默认第一个字段为主键。
LiuDBMS中所采用的数据存储方式是基于文本格式,具体说来,每一张表对应XXX.lid与XXX.ltd两张文件,其中XXX.ltd文件中所对应的字段存储方式是基于记录格式,每一条记录的起始对应开始符&&,后面跟着每个字段的值,字段与字段之间以&作为间隔,若输入的字符有&,则存储/&,对于转义字符/是用//。
XXX.lid是索引表文件,索引表是基于主键字段,每一个记录也是以&&做为开始符,后跟字段值,后跟&存储每一条记录所在XXX.ltd的偏移量。
2.7.2 插入记录设计思想
在LiuDBMS系统中插入记录的流程:
1.解析SQL中的插入语句,若符合规则,则转向2 ,否则报错退出
2.生成待插入的<字段名,字段值>列表,进行字段列表分析,检查当前字段是否存在要操作的表结构,同时检查要插入的值是否符合字段属性。若成功,则转向3,否则报错退出
3.将待插入的字段列表格式化成数据表中存储格式插入到XXX.ltd表中,同时获得当前记录的偏移量与索引值,将这一记录添加到XXX.lid
2.7.3 删除记录设计思想
在LiuDBMS系统中删除记录的流程:
1.解析SQL语句,若符合规则,则转向2,否则报错退出
2.获得条件语句(参照查询操作),同时依照条件语句通过索引进行查找符合条件的记录,每找到一个记录,从索引中删除此记录,最后统一重写XXX.lid文件
2.7.4 更新记录设计思想
在LiuDBMS系统中更新记录的流程:
1.解析SQL语句,若符合规则,则转向2,否则报错退出
2.获得条件语句(参照查询操作),同时依照条件语句通过索引进行查找符合条件的记录,每找到一个记录,从索引中更新此记录,然后将生成新的记录插入到XXX.ltd文件中,最后将新索引统一重写XXX.lid文件
2.7.5 查询记录设计思想
在LiuDBMS系统中查询记录的流程:
1.解析SQL语句,若符合规则,则转向2,否则报错退出
2.获得条件语句,从索引中读取满足符合条件的记录,生成索引结果集,通过索引结果集,得到要查询的数据集,并理新到struct RecordNodeSet结果集
2.8 本章小节
本章主要介绍LiuDBMS系统的整体设计思想与相关的技术原理,从库操作、表操作、记录操作三种层次进行介绍,LiuDBMS系统中的具体实现将在下一章中详细介绍。
第三章 系统设计与实现
本章将主要分模块介绍系统中各个功能的具体实现,包括数据库创建,删除;数据表的创建,删除;记录集的插入,删除,更新与查询。同时也简要介绍了系统的其他命令实现过程。
3.1 公共模块的实现
公共模块主要是定义一些公共的操作函数集,公共的宏,以及公共的数据类型与值。此意义是抽象出来一批能相互之间重用的代码,这样能够简化具体功能的实现。
公共模块包括四个全局变量,分别是
(1) char ActionList[ACTION_ROW][2][MAX_BUF] ,这里面存储了命令信息,即固化LiuDBMS支持的命令集,主要用在SQL命令解析时。
(2) char KeyList[KEY_ROW][MAX_BUF],这里面存储了程序所用到的符号流,既有数据类型符号,也有间隔符。
(3) extern char g_strUserName[50] = "anonymous",这里面存储的是当前的数据库的使用者,默认为匿名。
(4) extern char g_strCurrentDBName[200] = "",用来保存当前选中的数据库名。
公共模块主要有一些公共操作组成,有词法分析部分,对待分析的字符流进行按照相应的格式进行分词,将所得到的结果以单词为结点放到自定义的格式里。
3.2 创建数据库的实现
本模块主要用于实现创建数据库功能。
本模块主要用到的数据类型是struct DataBase。
struct DataBase
{
char strDBName[200];//数据库名
char strAuthor[50];//创建者
char strCreateTime[29];//创建的时间,字符串格式
long lCreatTime;//表示创建的时间
};
建库操作过程中流程是:
1.检查SQL语法的正确性,建库操作当前支持的语法比较简单,create database XXX,其中(XXX是数据库名),分析此语法是否符合格式格式,若不符合则报错
2.检查表名是否合法,调用专用函数完成此操作
3.通过读取configsys.dcy文件,获得当前的数据库名是否存在,若发现数据库名存在,则报错退出,否则进行数据库创建操作
4.生成DataBase结点类型,同时将DataBase作为一条记录添加到configsys.dcy文件中,同时创建XXX目录在data目录中,最后在新建的录中生成table.list文件
3.3 删除数据库的实现
本模块主要是用于删除一个已经存在的数据库,其语法结构是drop database XXX
无
LiuDBMS中删除数据库的流程:
1.解析SQL词法,主要是解析drop database XXX,同时检查是否符合SQL语法,获得要操作的数据库名,同时转向2,否则报错退出
2.从configsys.dcy中分析当前要删除的数据库是否存在,如果存在,则转向3,否则出错
3.依次删除XXX目录中的所有文件
3.4 创建表的实现
本模块主要是用于创建一张表,其具体语法为create table (fieldname fieldtype not null ….)
在LiuDBMS系统中每一张表对应三个文件
本模块用到的主要数据结构是字段结点结构
struct FieldNode
{
char strFieldName[200]; //字段名
int iFieldType; //字段类型
bool bIsAllowNull; //是否允许为空
int iValueLength; //若为字符串,其长度
bool bIsPrimaryKey; //是否为主键,若为主键则会为其创建索引文件,若不指定,则默认第一个字段为主键
bool bIsCheck; //对于值是否进行检查,即取值范围
long lStartValue; //上限
long IEndValue; //下限
};
在LiuDBMS系统中创建表的流程:
1.解析SQL语句,create table XXX (fieldname fieldtype not null),进行词法分析,同时进行语法分析,若成功则转向2,否则出错退出
2.得到XXX表名,通过检查table.list文件,分析当前当前表名是否合法,是否已经定义,若成功则转向3,否则退出
3.将定义了结构体struct TableNode用于存在表信息,面向每个数据库中的表配置文件;定义了struct FieldNode用于存放字段信息结点,同时将形成字段信息列表,若成功则转向4,否则退出
4.创建XXX.lst文件,将字段列表写入XXX.lst文件中;同时创建文件XXX.lid与XXX.ltd文件
3.5 删除表的实现
本模块主要是用于删除表,所用到的语法是drop table XXX
无
在LiuDBMS系统中删除表的流程:
1.解析SQL词法drop table XXX命令,若语法检查成功,则转向2 ,否则出错退出
2.获得表名,检查XXX表名,若当前表存在,则删除XXX.lst、XXX.lid、XXX.ltd这三个文件;否则出错退出
3.6 插入记录的实现
本模块主要是用于操作插入记录,语法为insert into XXX values (…)
struct IndexData
{
string strValue;//索引中的值
string strPosition;//在数据文件中的真正的位置
bool bFlag; //用于标识位
IndexData()
{
bFlag = false;
}
long GetPosition()
{
if(strPosition.size() <= 0)
{
return -1;
}
return atol(strPosition.c_str());
}
};3.6.3 主要流程
在LiuDBMS系统中插入记录的流程:
1.解析SQL中的插入语句,若符合规则,则转向2 ,否则报错退出
2.生成待插入的<字段名,字段值>列表,进行字段列表分析,检查当前字段是否存在要操作的表结构,同时检查要插入的值是否符合字段属性。若成功,则转向3,否则报错退出
3.将待插入的字段列表格式化成数据表中存储格式插入到XXX.ltd表
3.7 查询记录集的实现
本模块主要是用于查询记录集,其语法是select * from XXX where condition
查询后的结果集合
struct RecordNode
{
vector<string> vStrValue;
};
struct RecordNodeSet
{
vector<RecordNode> vRecordList;
vector<FieldNode> vFieldNode; //当前信息表的字段信息
vector<string> vSelectField;//当前请求的字段信息
long lCount; //总记录数
int iIndex; //当前的游标位置
bool bIsAllField;//当前是否选择了全部的字段,true为是
//下面是操作函数
RecordNodeSet()
{
lCount = 0;
iIndex = 0;
bIsAllField = true;
}
int GetCurrentIndex()
{
return iIndex;
}
long GetRecordSetCount()
{
return lCount;
}
bool Next() //指向下一条记录
{
if(iIndex++ >= lCount)
{
return false;
}
return true;
}
bool First()//指向首记录
{
if(lCount > 0)
{
iIndex = 0;
return true;
}
return false;
}
bool End()//指向最后一个记录
{
if(lCount > 0)
{
iIndex = lCount - 1;
return true;
}
return false;
}
const char* GetStrValue(int iNum)
{
if(iIndex < lCount)
return vRecordList[iIndex].vStrValue[iNum].c_str();
return NULL;
}
int GetIntValue(int iNum)
{
string strValue;
strValue = GetStrValue(iNum);
return atoi(strValue.c_str());
}
int GetLongValue(int iNum)
{
string strValue;
strValue = GetStrValue(iNum);
return atol(strValue.c_str());
}
void AddRecord(RecordNode &pRecord)
{
vRecordList.push_back(pRecord);
}
};
在LiuDBMS系统中查询记录的流程:
1.解析SQL语句,若符合规则,则转向2,否则报错退出
2.获得条件语句,从索引中读取满足符合条件的记录,生成索引结果集,通过索引结果集,得到要查询的数据集,并理新到struct RecordNodeSet结果集
3.8 更新记录的实现
本模块主要是用于更新记录模块,其语法为update XXX set fieldname = fieldvalue where condition
struct UpdateField
{
string strFieldName;
string strUpdateValue;
int iPosition;//相对于字段中的位置
bool isPrimary ;// 是否为主键
UpdateField()
{
iPosition = 0;
isPrimary = false;
}
};
在LiuDBMS系统中更新记录的流程:
1.解析SQL语句,若符合规则,则转向2,否则报错退出
2.获得条件语句(参照查询操作),同时依照条件语句通过索引进行查找符合条件的记录,每找到一个记录,从索引中更新此记录,然后将生成新的记录插入到XXX.ltd文件中,最后将新索引统一重写XXX.lid文件
3.9 删除记录的实现
本模块主要是用于删除记录,其语法结构是delete from XXX where condition
无
在LiuDBMS系统中删除记录的流程:
1.解析SQL语句,若符合规则,则转向2,否则报错退出
2.获得条件语句(参照查询操作),同时依照条件语句通过索引进行查找符合条件的记录,每找到一个记录,从索引中删除此记录,最后统一重写XXX.lid文件
3.10 USE命令的实现
本模块主要是用于使用一个已经存在库的操作,具体语法是use XXX
无
LiuDBMS中使用数据库的操作流程:
1.解析use XXX命令,获得数据库名,若无错则转向2,否则退出
2.从configsys.dcy中分析当前是否存在要操作的数据库名,若存在,则将公共变量strCurrentDBName,置为数据库名,若出错,则退出
3.11 show databases命令的实现
本模块主要是用于显示当前所存在数据库,具体语法是show databases
无
LiuDBMS中显示数据库的操作流程:
1.解析命令show databases,若通过则转向2,否则出错
2.从configsys.dcy中分析当前的记录集,显示记录集到终端
3.12 show tables命令的实现
本模块主要是用于显示指定数据库中表信息,具体的语法是show tables
无
在LiuDBMS系统中显示表的流程:
1.解析show tables命令,若不符合语法规则,则退出;否则转向2
2.读取文件table.list文件,将当前的表列表显示到终端
3.13 desc命令的实现
本模块主要是用于显示指定表的结构,具体操作语法是desc XXX
无
在LiuDBMS系统中显示表结构的流程:
1.解析desc XXX命令,若不符合,则出错,否则转向2
2.获得XXX,判断表是否存在,若不存在则退出;否则读取XXX.lst文件,同时将这个结构文件,显示到终端
3.14 getcwd命令的实现
本模块主要是用于获得当前操作的库,语法是getcwd
无
LiuDBMS中获得当前数据库的操作流程:
1.检查命令getcwd,若不符合规则,则出错退出;否则转向2
2.检查strCurrentDBName是否为空,若不为空,则打印strCurrentDBName
第四章 系统应用与部署
4.1 系统应用
系统可以提供一个开发包的形式进行应用,对处提供了一个接口程序,可以通过调用三个函数来完成操作。
对外接口函数有三个,分别是:
函数原型 | bool OpenLiuDBMS(const char *pStrDBName,const char *pUsername) |
返回值 | 若执行成功,则返回true,否则返回false |
意义 | 打开一个存在数据库,同时指定操作用户名 |
头文件 | common.h |
版本号 | ver1.0 |
函数原型 | void CloseLiuDBMS(); |
返回值 | 无 |
意义 | 关闭一个已经打开的连接 |
头文件 | common.h |
版本号 | ver1.0 |
函数原型 | bool ExecSQL(char *pSQL,RecordNodeSet *pRecordSet = NULL) |
返回值 | 若执行成功,则返回true,否则返回false |
意义 | 具体执行SQL语句,若为select语句,则pRecordSet指定返回的结果集 |
头文件 | common.h |
版本号 | ver1.0 |
4.2 如何开发并部署一个简单的应用程序
用一个例子讲解一下如何在自己的C/C++程序中应用与部署自己的DBMS应用程序。
第一步:新建一个VC工程,可以选择控制台应用程序
第二步:将stafx.h,common.h,common.cpp加入到自己的应用程序中
第三步:编写自己的main函数,同时包含头文件common.h。编写相应的应用程序,可以输入如下代码:
RecordNodeSet pRecord;
if(ExecSQL("create database test1",NULL))
{
printf("数据库创建成功/n");
}
OpenLiuDBMS("test1","liubing");
if(ExecSQL("create table test (name varchar(20) not null , age int ",NULL))
{
printf("表创建成功/n");
}
if(ExecSQL("insert into test values ('liubing',23)",NULL))
{
printf("操作成功/n");
}
if(ExecSQL("select * from test",&pRecord))
{
printf("共找到%d条记录/n",pRecord.lCount);
}
CloseLiuDBMS();
第四步:在可执行文件当前所运行的目录创建一个data目录,同时调试应用程序。
具体源程序详见TestLiuDBMS项目
第五章 总结
本章主要的内容将用于系统总结LiuDBMS项目在开发过程中的得与失,同时在本章中做出一些对于未来LiuDBMS版本的开发方向。
5.1 不足之处
LiuDBMS在开发过程中大体发现了如下的不足之外:
1.SQL语法分析上存在不足,使得当前的支持的命令太少,目前所采用的分析方法仍然存在不科学与不合理的地方,未来要重点扩充是条件查询,要支持多表查询,以及多关键字查询
2.索引存储仍然不科学,事实证明纯线性的存储将会为查询与分析带来很大的困难,当前流行的索引方式有B树方式,未来要考虑采用这种索引方式
3.执行性能上存在瓶颈,这也是未来要开发中要考虑的问题,由于出于进度的考虑,使得在一些实现时采用了折中的技巧,这也会系统的性能带来了影响
4.系统在设计上有一些成功的地方,但是在局部接口定义仍不是很合理,有的是同样的功能没能实现良好的复用性,有的是过份的强调可复用性,而带来了接口的实现难度与复杂度的线性增长
5.当前还没充分考虑多用户的分布式环境如何运行,对于事务,视图,大数据量存储仍是一些问题
5.1 一些心得
LiuDBMS中成功的经验:
1.实现一个DBMS总能给人以成就感和自信心,虽然功能比较弱小,成功经验之一是未来的开发工作中要少犹豫,少动摇,因为时间当你在仿惶是已经浪费了,还不如今天做一点明天做一点,积少成多
2.一个良好的底层架构对于一个项目的成功起到很重要的作用,在近一个月的开发中,充分采用了快速原型法,大量的测试了底层的操作API,丰富而又可靠的微操作,为上层开发提供了极大的便利,在一定程度上组合的模式要重视起来,未来的同样规模的程序中应充分考虑多组合,当然这也为底层API的可扩展性提出了更高的要求
3.心态上要放平,同样的人,同样的事,不同的心态,结果也不一样,在一个心平气和,积极向上的环境中才能成就一些事,当然人要还有自己的理想,要有自己的个性
5.1 未来发展趋势
LiuDBMS中未来发展趋势:
1.XML在当前业界的发展,使得纯XML的DBMS系统成为可能,LiuDBMS未来的开发方向之一是采用纯XML格式的DBMS
2.嵌入式产品的发展与应用,使得未来基于嵌入式的DBMS得到大规模应用,嵌入式DBMS与当前的桌面和企业级应用当前有一个不同之处,在于在嵌入式平台上应提供的是一个DBMS开发包,当然当前所发布的LiuDBMS是面向嵌入式平台的,目的也是提供一组操作API
3.面向移动计算的DBMS也将是未来的发展趋势之一