这是前两天做的数据库实验,模拟DBMS的数据操作,实现File Manager、Buffer Manager、Storage Manager三个模块的功能。
总的来说是File Manager接受应用程序传递来的元组,并以Frame形式交给Buffer Manager,后者通过替换算法,将Frame转换为Block(Page)形式,转交给Storage Manager,最后由Storage Manager负责数据库文件的读写操作。
用到的主要的C/C++函数是关于内存拷贝的:
/**/
/*
* @ Smart Wong USTC SSE
* 下面这段代码是查找可用Frame时缓冲区满用到的
* 函数形式: int Buffer_Manager::GetAvailFrame(int needsize, Frame& fr)
*/
// 最后一页大小不够了,要创建新的
// 创建新的
// create a new block in buffer
PageHead ph;
ph.tuplenum = 0 ;
memcpy(data_buffer, & ph, sizeof (PageHead));
// create new frame
fr.free_flag = true ;
fr = blk_info_table[ 0 ];
fr.page_id = m_str.GetNewPageID();
fr.dirty = 0 ;
fr.frame_id = blk_info_table.size() + 1 ;
fr.free_size = _BLOCK_SIZE - sizeof (PageHead);
fr.used_size = 0 ;
fr.size = sizeof (Frame);
fr.record_num = 0 ;
fr.data = data_buffer + _BLOCK_SIZE;
Frag frag;
frag.size = _BLOCK_SIZE - sizeof (PageHead);
frag.fr_offset = _BLOCK_SIZE; // =================== 相对偏移量
fr.free_frag_table.clear();
fr.free_frag_table.push_back(frag);
fr.r_offsetTable.clear();
// create a new page in DBFile
m_str.IncreasePages();
* @ Smart Wong USTC SSE
* 下面这段代码是查找可用Frame时缓冲区满用到的
* 函数形式: int Buffer_Manager::GetAvailFrame(int needsize, Frame& fr)
*/
// 最后一页大小不够了,要创建新的
// 创建新的
// create a new block in buffer
PageHead ph;
ph.tuplenum = 0 ;
memcpy(data_buffer, & ph, sizeof (PageHead));
// create new frame
fr.free_flag = true ;
fr = blk_info_table[ 0 ];
fr.page_id = m_str.GetNewPageID();
fr.dirty = 0 ;
fr.frame_id = blk_info_table.size() + 1 ;
fr.free_size = _BLOCK_SIZE - sizeof (PageHead);
fr.used_size = 0 ;
fr.size = sizeof (Frame);
fr.record_num = 0 ;
fr.data = data_buffer + _BLOCK_SIZE;
Frag frag;
frag.size = _BLOCK_SIZE - sizeof (PageHead);
frag.fr_offset = _BLOCK_SIZE; // =================== 相对偏移量
fr.free_frag_table.clear();
fr.free_frag_table.push_back(frag);
fr.r_offsetTable.clear();
// create a new page in DBFile
m_str.IncreasePages();
先写这么多吧!以后再补。