你的位置:首页 > 数据库

[数据库]从零开始实现一个最简单的数据库_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);	// 反序列化};