暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【手写数据库内核miniToadb】第42天 在文件页面中存储行记录

开源无限 2025-02-13
46


作者在数据库内核设计从业十余年;设计开发分布式数据内核;编写从零手写数据库教程;现在将过去的数据库内核经验一一分享,有兴趣的朋友加个关注。

一、概述 


当行记录数据拼接完成后,需要将它存储到数据页面中,然后持久化存储到磁盘,才算数据插入成功。

在数据页面当中,行记录数据分为两部分,第一部分为行记录信息,它存储于页面头部之后;另一部分为行记录数据部分,它从页面的尾部向前存储。

二、写入文件页面 


在页面数据头信息中,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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论