从零开始实现一个最简单的数据库_Step3:Record

模式(Schema)做好后,接下来就是实际的数据了。也就是表(Table)和记录(Record)。先从记录开始吧。

记录,也就是表中的一行数据。这里有个难点,就是表的模式是不定的,其属性的个数、值类型都是动态的,所以怎么样能在记录中保存[数量、类型不定的值]呢?这里我用的是保存指针的方法,也就是:Record中实际保存的是指针的列表,然后这些指针指向了实际要保存的数值;同时,这些指针在保存时都以DWORD*的类型保存,而Record中提供了GetPrptyType(int nPrptyIndex)函数用以获得该指针的实际类型。

下面上代码吧。

// LzjTable中的一行
// 对于可变长度的属性(如LString),自动以4字节对齐方式进行填充
class LzjRecord{
public:
	LzjSchema	*m_pSchema;	// 本LzjRecord所用的模式。外生变量:即,直接复制调用方的对象指针到本对象的相应成员变量中,由调用方维护本对象(此处为m_pSchema)的生命周期
//	DWORD	*m_pdwData;
//	LList<DWORD*>	m_pPrptyList;	// 本LzjRecord的属性
	LPDWORD	*m_pValueList;	// [本数组中的每个元素]均指向一个属性。因为属性的类型不同,所以只能以LPDWORD来作为属性的指针,然后通过GetPrptyType()来获得该属性的具体类型。内生变量:即,将调用方的对象复制到本对象的相应成员变量中,由本父对象(此处为LzjRecord)维护本对象(此处为m_pValueList[])的生命周期
public:
	LzjRecord();
	LzjRecord(LzjSchema *pSchema);
	~LzjRecord();

	void	Init(LzjSchema *pSchema);	// 由pSchema初始化:m_pSchema和m_pValueList
	void	SetPrpty(int nPrptyIndex, DWORD *pdwValue);	// 设置第nPrptyIndex(从0起)个参数的值。生成内生变量
	LPDWORD	GetPrpty(int nPrptyIndex);
	LzjProperty::LP_ValueType	GetPrptyType(int nPrptyIndex);	// 获得属性类型
	void	ConsoleOut(std::ostream *pCout);

	DWORD	Serialize(LFile *pFile);	// 序列化
	DWORD	Unserialize(LFile *pFile);	// 反序列化
};

  

时间: 2024-10-24 14:42:11

从零开始实现一个最简单的数据库_Step3:Record的相关文章

从零开始实现一个最简单的数据库_Step2:Schema

属性(Property)做好后,就到了模式(Schema)了.其实模式仅仅是属性的封装,属性写的稳健的话,模式做起来会轻松很多. 因为我是一点点的写的代码,写之前也没有做太多架构方面的东西(毕竟小程序),所以经常会有修改.基本上从周一改到了今天,接口方面改的还不是特别的多,但实现方面确实几经周折. 我在写模式的时候,考虑最多的也就,2件事情:1,在设计层面,模式应该包含哪些内容(当然主要是属性),又有哪些类需要用到模式(以及怎么使用它):2,模式在内存.硬盘中都是以何种方式进行存储的.最早的时候

从零开始实现一个最简单的数据库_Step4:Table

记录(Record)做好后,表(Table)就简单了. 基本上表要做的工作就是对记录的管理,增删改查那一套. 到了这里,基本上需要的功能都差不多了,目前能想到的就是这些.下一步打算是把代码优化一下,更稳健一些,毕竟里面大量使用了指针,很有可能在哪个角落里没有处理好对象的创建.删除,会导致后面程序的不健壮.然后就是把接口再优化一下,做一些Demo程序,来规范本数据库的使用.没问题了就可以考虑ERP了. 当然,在写ERP的时候肯定会对数据库提出各种各样的要求,到时候肯定会再回过头来修改这个数据库的.

从零开始,实现一个最简单的数据库:Property

因为自己对数据库了解不多,就只能走一步看一部了.先从模式(Schema)开始做起.但要做模式,就先要做属性(Property).所以先实现一个类Property. 我的Property很简单,只有3个比较重要的字段:属性名,取值类型(如整型.字符串),键类型(主键.外键). 在写这个类的时候,主要考虑2件事情:1,Property在内存中是怎么体现的,也就是这个类的字段:2,怎么保存到硬盘(metadata文件)中去. 下面仅把类的声明列出来,具体实现就算了,免得页面太凌乱.而且有凑字数之嫌.

PHP实现的一个简单的数据库操作类

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $username; private $password; public $default_db; public $link; // 声明构造函数 public f

PHP实现的一个简单的数据库操作类(修改版)

PHP实现的一个简单的数据库操作类 实现的功能: - 在实例化的时候能设置连接字符集 - 在实例化的时候能连接数据库 - 在实例化的时候能选择默认数据库 - 销毁对象时关闭数据库 代码如下: <?php // 数据库操作类MySQLDB class MySQLDB { // 声明属性 private $server; private $port; private $username; private $password; public $default_db; private $charset;

从零开始启动一个项目,需要哪些准备工作

原文链接这里 话题的由来 某天午饭前,项目组一同事挑起了这个话题,由于是马上要到饭点了,所以没有细聊,但公认的结论是,从零开始准备一个项目,花费的工作量不小. 由于最近我参与了一个全新的web项目,有切身的体验,所以记录下来. 主要的工作量包括如下几点: 代码开发环境准备 开源软件选择 版本管理软件 基础代码开发 问题处理 制度建设 代码开发环境准备 支持j2ee的eclipse,版本当然要最新的,插件则包括easyexplore.国际化资源编辑器: JDK1.8,注意不是JRE1.8,要附带源

手把手教你从零开始做一个好看的 APP

前言 从零开始,手把手带你实现一个「专注睡前的 APP」.睡觉之前如果能有一个 APP,能让我们写一写这一天的见闻或者心得,同时又能看一会段子.瞄一会好看的妹子,放松一下疲惫的身心那该多好,这也是我完成这个 APP 的原因.APP 的全部代码我已经分享到?Github?上了,需要的直接 点击这里,如果喜欢的话,麻烦给个 star,谢谢啦. 本文为这一系列文章的总述,如果觉得篇幅过长,请点击下面的连接 手把手教你从零开始做一个好看的 APP - Day one 手把手教你从零开始做一个好看的 AP

《从零开始做一个MEAN全栈项目》(1)

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 在本系列的开篇,我打算讲一下全栈项目开发的优势,以及MEAN项目各个模块的概览. 为什么选择全栈开发?     对于初学者来说,学习一门新的语言和技术的体验总是让人愉快的,也会满足于掌握了一些新的东西并且解决了一些实际问题.在一个小组中采用全栈开发时,你可以更加有效地把握项目全局概念,这也有利于让你了解项目中的不同模块以及它们之间是如何协同工作的.你会对你们的产品中他人的贡献更加清晰,你也就了解了这款产品如何

一个C#的XML数据库访问类

原文地址:http://hankjin.blog.163.com/blog/static/33731937200942915452244/ 程序中不可避免的要用到配置文件或数据,对于数据量比较小的程序,部署数据库花费的时间就显得浪费了,因此用XML来存储不妨为一个很好的办法,而且结合C#的DataSet,我们可以很轻易的封装出一个代码简单而功能强大的数据访问类XMLConfigconfig.xml<root>  <table1>    <rowName1>hello&l