当前位置:Gxlcms > 数据库问题 > 从零开始实现一个最简单的数据库_Step3:Record

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

时间:2021-07-01 10:21:17 帮助过:5人阅读

模式(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);	// 反序列化
};

  

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

标签:

人气教程排行