創(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