作者在数据库内核设计从业十余年;设计开发分布式数据内核;编写从零手写数据库教程;现在将过去的数据库内核经验一一分享,有兴趣的朋友加个关注。
一、概述
当行记录数据拼接完成后,需要将它存储到数据页面中,然后持久化存储到磁盘,才算数据插入成功。
在数据页面当中,行记录数据分为两部分,第一部分为行记录信息,它存储于页面头部之后;另一部分为行记录数据部分,它从页面的尾部向前存储。
二、写入文件页面
在页面数据头信息中,dataStartOffset成员记录了页面尾部数据存储的位置,它的起始值为页面大小,也就是距离页面尾部的偏移为0;itemEndOffset成员记录了行记录信息存储的位置,它的起始值为页面数据头部的大小,也就是紧随页面头部顺序存储。
在行记录信息结构中,要记录行记录数据存储的位置,也就是页面内的偏移,即此时的dataStartOffset成员值,同时也要记录行记录数据的大小。
然后将行记录数据拷贝到页面对应的位置,再将行记录信息也复制到对应位置,至此一行记录数据写入了表文件的页面。
void PutTupleToPage(PageDataHeader *page, ItemData *item, TupleHeader *tup)
{
page->dataStartOffset -= item->len;
memcpy((char *)page + page->dataStartOffset, tup, item->len);
item->offset = page->dataStartOffset;
memcpy((char *)page + page->itemEndOffset, item, sizeof(ItemData));
page->itemEndOffset += sizeof(ItemData);
return;
}
三、总结
代码位于pages.c文件,在exam_31目录下。
文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




