# Buffer Manager 设计笔记
## 构想
(灰色的构想表示待定)
- 放弃为每个块指定唯一的标识符id,id将仅用于内存中块的管理,不写入文件。文件中仅保存文件头和数据。块id从1开始。
- 使用大数据区保存块的数据,数据区IO通过memcpy实现,如此一来便可以实现定长存储与块整体传输。具体地,通过偏移量定位元组槽,通过memcpy将int, float, char[]数据以二进制形式逐字节拷贝到大数据区,或者反过来将数据区中的内容取出。Record和Index需要Catalog返回表的中的属性信息来实现上一操作。大数据区使用void*来指向。IndexBlock直接操作内存的复杂度较高,设计一个解析函数,将数据保存在int和T数组中返回;为提高效率,RecordBlock不设计解析函数,直接返回数据区指针。
![](https://www.writebug.com/myres/static/uploads/2022/2/24/3d3e9df1f6d88a7746702cd32ff9ab5f.writebug)
- 每条数据仍然保留一个数据位,用于指示该条记录是否被删除。删除标记位于每条元组的起始位置。约定用int表示存在情况,0表示元组槽空闲,1表示元组槽有记录。
- 为了降低实现难度,内存中的字符串操作以string为主,但在涉及元组时应以char*为主。
- 将ID也写入char*数组,然后写入文件,如此一来可以继续沿用基于ID的实现方法。可以在char数组中保留一部分作为ID的预留位。
- 数据文件的文件名为“<table>.data”,索引文件的文件名为“<table> - <attribute>.index”。
- 一些函数分为了record和index两个版本,实际实现时可能会合并参数表不同的对称函数,使之成为重载函数。
- Index文件相比Record文件具有特殊性,即一张表可能有多个属性建立了索引。为了避免引入二级映射而在openedFiles中直接保存文件名。为了减少在写文件时可能出现的错误,直接使用带有后缀名的文件名。
- 文件直接产生在.cpp源文件的同级目录下,因为C++无权创建新的目录。
- 不为RecordFile类和IndexFile类设计析构函数,由程序保证释放句柄时文件所持有的所有块都已被释放。
- 数据文件使用一个空元组位的偏移量的集合来近似freelist,起节省空间的作用。在删除索引时可能涉及到删除块的操作,为了节省空间,为索引文件也涉及一个空块偏移量的集合。建立新块时,优先在这些位置上建立。数据文件的freelist文件命名为”<table>.freelist”,索引文件的freelist命名为” <table> - <attribute>.freelist”。
## 行为
### 建表
**行为**:新建一个数据文件句柄,如果有索引,需要新建索引文件句柄。
**相关函数**:
- bool createRecordFile (string tableName, int recordLen);
Manager类外部函数
行为:函数先判断表是否存在,若不存在则抛出异常。其次判断文件是否已打开,或是否文件未打开但已存在。以上两种情况下直接返回true。若以上检查均通过,则新建一个文件句柄,将句柄加入openedRecordFiles映射,但暂时不为其分配块。blockNum,blocksInMemory,freeSlotOffsets将置为默认值。为避免写文件时出现问题,此函数将建立空的数据与freelist文件。
外部依赖:函数依赖Catalog告知表是否存在。
注意:函数默认recordLen是在不带数据位的情况下计算得到的。为避免创造不存在的表的文件,Manager自身不得调用此函数。
- bool createIndexFile (string tableName, string attriName, int type, int keyLen);
Manager类外部函数
行为与外部依赖与createRecordFile类似。
- bool openRecordFile (string tableName);
Manager类内部函数
行为:函数先检查表的存在性以及是否已经打开。函数建立一个RecordFile对象,初始化其成员,并将对象加入openedRecordFiles映射。
外部依赖:依赖Catalog告知表是否存在。
- bool openIndexFile (string tableName, string attriName);
Manager类内部函数
行为及外部依赖与openRecordFile类似。函数还需检查属性的存在性。
- bool closeRecordFile (string fileName);
Manager类内部函数,由shutdown函数调用,该函数保证传入文件的句柄一定已经存在。
行为:利用blocksInMemory集合逐个检查当前文件在内存中持有的块,用freeRecordBlock逐个释放(当有块释放失败时,文件关闭失败,函数返回false)。之后函数向文件写入文件头的一些信息,并向另一个单独的文件写入freelist信息。最后函数将对象从openedRecordFiles映射移除并释放文件句柄。
注意:要求传入完整文件名。
- bool closeIndexFile (string fileName);
Manager类内部函数,由shutdown函数调用,该函数保证传入文件的句柄一定已经存在。
行为类似closeRecordFile。
### 删除表
**行为**:使用没有记录的文件代替原文件(包括数据文件、索引文件和freeList),随后释放内存中的块和句柄。
**相关函数**:
- bool dropTable (string tableName);
Manager类外部函数
行为:函数先检查表是否存在,不存在将返回false。若表存在,调用clearFile用有文件头但没有实际数据的文件替换原文件,clearFile同时会释放块和句柄。函数将检查clearFile的返回值。删除成功将返回true。
外部依赖:依赖于Catalog告知表是否存在,并返回表上的索引信息来决定需要删除哪些索引。具体地,Catalog需要返回一个string类型(或其他可行类型)的数组,存储建立了索引的属性的名称。
注意:删除表有可能失败,这可能是块未解锁导致的。忽略dropTable返回值可能会导致严重后果。
- bool clearRecordFile (string fileName);
Manager类内部函数,由dropTable调用,该函数保证文件存在。
行为:先调用forceFreeRecordBlock逐个释放文件在内存中所持的块,文件不在内存中时跳过此步。函数检查forceFreeRecordBlock的返回值,如果有某次调用返回false,则文件删除失败,函数返回false。之后用有文件头但没有实际数据的文件替换原数据文件。最后将文件对象从openedRecordFiles映射中移除并释放文件句柄(如果已打开)。
- bool clearIndexFile (string fileName);
Manager类内部函数,由dropTable调用,该函数保证文件存在。
行为类似clearRecordFile。
- bool forceFreeRecordBlock (int id);
Manager类内部函数,由clearRecordFile调用,该函数保证块在内存中。
行为:无视块是否是脏块,强制将其释放,但仍然受到锁限制。函数首先检查块是否加锁,加锁的块直接返回false。上述检查通过后,释放srcData数据区,将id从recordBlocksHeld映射移除,令num_BlocksHeld自减,从usedTime链表移除id,将id加入freeIDs集合,并将块指针从文件对象的blocksInMemory集合移除。成功释放后返回true。
- bool forceFreeIndexBlock (int id);
Manager类内部函数,由clearRecordFile调用,该函数保证块在内存中。
行为类似forceFreeRecordBlock。
### 插入记录
**行为**: Record会要求Buffer Manager返回空闲块以存入记录。当freeSlotOffsets尚有元素时,取出一个元素,计算它所属块的偏移量,利用块链与每个块的offset成员检查块是否已在内存中,如果有则返回,否则从文件中取出块。当freeSlotOffsets没有元素时,需要为文件新建一个块。
取出块或分配块时,首先检查freeIDs向量中是否有空闲的标识符。
- 如有,利用标识符新建一个块,初始化后从文件读取信息或直接返回。
- 如没有,检查当前持有块量是否达到最大值。
- 若没有,新分配一个块ID,跳至1)。
-
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
实现功能: 1.建表、删表功能。数据类型支持int, float与char(n). 支持主码、unique约束。系统自动为主码建立索引。 2.建立、删除索引功能。允许在主码、unique属性上建立B+树索引。 3.选择、插入、删除记录功能。支持在where后的谓词中放入最多两个条件,用and或or连接。 4.执行SQL脚本文件。
资源推荐
资源详情
资源评论
收起资源包目录
100012438-基于C++实现一个精简的DBMS.zip (60个子文件)
minisql
Development Documents
BufferManager 更新日志.txt 1KB
Buffer Manager 设计笔记.docx 64KB
LICENSE 11KB
Project
大程
大程.vcxproj 8KB
大程.vcxproj.filters 2KB
Warning.cpp 2KB
IndexManager.cpp 41KB
Interpreter.cpp 21KB
IndexManager.h 2KB
BufferManager.h 20KB
x64
Debug
vc141.pdb 1.18MB
vc141.idb 459KB
vc142.idb 307KB
vc142.pdb 1.07MB
CatalogManager.obj 1.44MB
catalogmanager.obj.enc 1.24MB
Warning.obj 172KB
RecordManager.obj 1.01MB
interpreter.obj.enc 764KB
BufferManager.obj 3.59MB
Interpreter.obj 776KB
大程.tlog
CL.write.1.tlog 3KB
CL.command.1.tlog 16KB
大程.lastbuildstate 223B
link.command.1.tlog 8KB
link.read.1.tlog 4KB
link.write.1.tlog 1KB
CL.read.1.tlog 100KB
recordmanager.new.obj.enc 741KB
IndexManager.obj 371KB
大程.log 4KB
大程.vcxproj.user 162B
CatalogManager.h 4KB
RecordManager.cpp 16KB
BufferManager.cpp 44KB
Interpreter.h 2KB
Debug
vc141.pdb 1.07MB
vc141.idb 387KB
CatalogManager.obj 887KB
catalogmanager.obj.enc 888KB
Warning.obj 125KB
interpreter.obj.enc 532KB
BufferManager.obj 2.39MB
Interpreter.obj 532KB
大程.tlog
CL.write.1.tlog 2KB
CL.command.1.tlog 6KB
大程.lastbuildstate 206B
link.command.1.tlog 3KB
link.read.1.tlog 4KB
link.write.1.tlog 642B
CL.read.1.tlog 65KB
大程.log 1KB
Warning.h 1KB
CatalogManager.cpp 23KB
RecordManager.h 1003B
x64
Debug
大程.ilk 3.65MB
大程.pdb 2.73MB
大程.exe 958KB
大程.sln 1KB
README.md 21KB
共 60 条
- 1
资源评论
神仙别闹
- 粉丝: 2687
- 资源: 7649
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功