miniob——建表邏輯的源碼解析

創(chuàng)建表的邏輯

1.ExecuteStage::handle_request函數(shù)處理一個request請求,通過sql解析,發(fā)現(xiàn)這是一個創(chuàng)建表的sql語句,進入do_create_table函數(shù)

2.do_create_table函數(shù)

定義一個CreateTable變量,通過輸入的sql語句得到創(chuàng)建表的名字、字段數(shù)量、字段類型數(shù)據(jù)。

獲取sql語句的SessionEvent變量

獲取當(dāng)前的數(shù)據(jù)庫類型(Db)

進入db->create_table函數(shù),傳入創(chuàng)建表的名字、字段數(shù)量、字段類型

3.db->create_table函數(shù)

參數(shù)檢查,判斷數(shù)據(jù)表名字是否重復(fù)

獲取當(dāng)前數(shù)據(jù)庫存放的位置,構(gòu)造出新創(chuàng)建表的元數(shù)據(jù)存儲路徑

建立一個新的table變量

調(diào)用table->create函數(shù),傳入元數(shù)據(jù)存儲路徑,數(shù)據(jù)表名字,數(shù)據(jù)庫的路徑,字段數(shù)和字段類型

函數(shù)結(jié)束之后,將當(dāng)前表名加入到記錄已打開數(shù)據(jù)表的映射中

4.table->create函數(shù)

(1)再次進行參數(shù)檢查,檢查數(shù)據(jù)表名字,檢查字段數(shù),字段類型

(2)調(diào)用

int fd = ::open(path, O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC, 0600);

打開元數(shù)據(jù)存儲路徑,

O_WRONLY 只寫模式

O_CREAT 如果指定文件不存在,則創(chuàng)建這個文件

O_EXCL 如果要創(chuàng)建的文件已存在,則返回 -1,并且修改 errno 的值

O_CLOEXEC,當(dāng)調(diào)用exec成功后,文件會自動關(guān)閉

0600表示創(chuàng)建的文件可讀可寫。

所以實際的意思是,根據(jù)傳入的元數(shù)據(jù)存儲位置,創(chuàng)建一個可讀可寫的文件(如果已存在,返回-1)

(3)調(diào)用

table_meta_.init(name, attribute_count, attributes))

首先進行參數(shù)檢查

如果sys_fields_為空的話,初始化sys_fields_

fields進行拓展,拓展到sys_fields_的長度加上當(dāng)前創(chuàng)建表的字段數(shù)量,然后將前面sys_fields_中的變量賦值到fields_中,調(diào)用

fields_[i + sys_fields_.size()].init(attr_info.name, attr_info.type, field_offset, attr_info.length, true);

將新創(chuàng)建表的字段屬性進行初始化加入到fields_中

增加偏移量field_offset

設(shè)置record_size_ = field_offset;

(4)調(diào)用

std::fstream fs;
fs.open(path, std::ios_base::out | std::ios_base::binary);

打開元數(shù)據(jù)文件,并且通過二進制的方式進行寫操作

(5)調(diào)用

table_meta_.serialize(fs);

將元數(shù)據(jù)進行序列化然后寫入文件

(6)

通過數(shù)據(jù)庫存放位置和數(shù)據(jù)表名,獲得當(dāng)前數(shù)據(jù)表文件存放位置

實例化一個BufferPoolManager變量,然后調(diào)用create_file函數(shù),創(chuàng)建數(shù)據(jù)表文件。

(7)調(diào)用

BufferPoolManager::create_file(const char *file_name)

create_file函數(shù),首先根據(jù)路徑打開數(shù)據(jù)表文件

fd = open(file_name, O_RDWR | O_CREAT | O_EXCL, S_IREAD | S_IWRITE);

O_RDWR 讀寫模式

O_CREAT 如果指定文件不存在,則創(chuàng)建這個文件

O_EXCL 如果要創(chuàng)建的文件已存在,則返回 -1,并且修改 errno 的值

S_IREAD 所有者擁有讀權(quán)限

S_IWRITE 所有者擁有寫權(quán)限

以讀寫的方式創(chuàng)建一個新文件,新文件所有者擁有讀寫權(quán)限

然后以讀寫方式打開這個文件,創(chuàng)建Page文件,并且初始化為全0

將page.data中的前面部分轉(zhuǎn)化成BPFileHeader變量指針,設(shè)置分配的頁面為1,總頁面為1,設(shè)置bitmap

調(diào)用lseek(fd, 0, SEEK_SET),將打開文件的指針移到文件開頭

調(diào)用writen(fd, (char *)&page, sizeof(Page)),將剛才創(chuàng)建的Page變量寫入文件

(8)

init_record_handler(base_dir);

初始化record_handler變量,設(shè)置table類中的base_dir_為當(dāng)前數(shù)據(jù)庫的存儲位置

返回SUCCESS

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容