你的位置:首页 > 数据库

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

属性(Property)做好后,就到了模式(Schema)了。其实模式仅仅是属性的封装,属性写的稳健的话,模式做起来会轻松很多。

因为我是一点点的写的代码,写之前也没有做太多架构方面的东西(毕竟小程序),所以经常会有修改。基本上从周一改到了今天,接口方面改的还不是特别的多,但实现方面确实几经周折。

我在写模式的时候,考虑最多的也就,2件事情:1,在设计层面,模式应该包含哪些内容(当然主要是属性),又有哪些类需要用到模式(以及怎么使用它);2,模式在内存、硬盘中都是以何种方式进行存储的。最早的时候我是设想的在内存里以List去维护模式中的属性,也就是动态大小,但这显然没必要,毕竟一个模式基本上是不允许修改属性个数的。所以后来干脆以数组来维护了。

另外就是如何设置属性了。最终的版本其实还是应该以传统的数据库指令的方式,如"Create Schema ..."的方式,但现在若是要去实现一个命令解析器则明显不显示,所以就用了一个临时的解决方案,即SetProperty(int nPrptyIndex, LzjProperty *pPrpty),来一个个的手工指定。

差不多就是这些了,看代码吧。

 

// 模式,元数据,即metadata/* 一个元数据在硬盘中的结构:	part1: m_strSchemaName	part2: 本metadata的字节数(为part1、part2、part3的加总),本Schema的属性数	part3: m_propertyList*/class LzjSchema{private://	void	Init(DWORD dwNumPrpty);public:	LString		m_strSchemaName;	// 本模式的名称//	LList<LzjProperty*>	m_propertyList;	// 该模式的属性。m_propertyList还是保存指针吧,至少不用处理【拷贝构造函数、operator=】之类的问题了。暂时以这种方式处理吧,后期还是要改为ParseCmd的	DWORD	m_dwNumPrpty;	// 本模式中的属性个数	Ptr_LzjProperty	*m_propertyArr;	// [本数组中的每个元素]均指向一个LzjPropertypublic:	LzjSchema();	LzjSchema(LString strSchemaName);	~LzjSchema();	// 删除本模式中的所有属性	void	ParseCmd(LString *pStrCmd);	// 后期还是要改为此一形式,即通过命令行来定义模式//	void	AddProperty(LzjProperty *pPrpty);	// 向本对象中添加属性	void	SetNumPrpty(DWORD dwNumPtpy);	// 设置本对象的属性个数	void	SetProperty(int nPrptyIndex, LzjProperty *pPrpty);	// 设置本对象的属性	LzjProperty::LP_ValueType	GetPrptyType(int nPrptyIndex);	DWORD	GetNumPrpty();	DWORD	Serialize(LFile *pFile);	// 序列化,即:将本对象保存在文件中	DWORD	Unserialize(LFile *pFile);	// 反序列化,即:从文件中恢复本对象	void	ConsoleOut(std::ostream *pCout);};