undrop for innodb c_parser 源码分析
一,主函数功能:
1,分析命令行参数,保存在全局变量中;
2,打开文件,加载表定义sql,调用分析函数开始处理;
3,打印导入数据的sql语句;
二,文件处理函数,void process_ibfile(int fn):
1循环读每一页面,调用分析页面函数去去处理,process_ibpage(page);
其中会检测如果只恢复删除记录时,删除记录要有效
三,处理页面的函数,process_ibpage(page_t *page) :
1,打印转储文件中当前页面的信息,包括页面ID,格式,记录表是否有效,预期的记录数;
-- Page id: 8, Format: REDUNDANT, Records list: Valid, Expected records: (21 21)
2,中间过程有点乱,基本原理就是定位每条记录,调用记录分析函数去分析打印每条记录;其中会利用页面是否有效,当前记录是否有效来决定下一记录的位置计算方法;
这其它关系到几个重要的函数,
页面是否有效,表示记录链表可用,
is_page_valid = check_page(page, &expected_records);
记录是否有效,表示当前移位位置是一个正确的记录;
// Check if origin points to a valid record
if (check_for_a_record(page, origin, table, offsets) && check_constraints(origin, table, offsets))
当链表有效时会根据记录中的下一记录指针来定位下一记录,
当链表无效时,如果当前是有条有效记录,会从下一个可能的位置开始搜索记录,如果当前记录不是有效记录时,偏移地址加1,再检测;
记录检测函数需要表定义参数;
3,打印转储文件当前面提取结果信息,包括,页ID,发现记录数,是否丢失记录,是否叶子页;
-- Page id: 8, Found records: 21, Lost records: NO, Leaf page: YES
四,记录分析打印函数,ulint process_ibrec(page_t *page, rec_t *rec, table_def_t *table, ulint *offsets):
参数:page,好象没用到,页面指针;参数:rec,记录指针;table:表定义;offsets:?
函数表定义,打印每个字段值,