📄 pager_bak.c
字号:
// sizeof(unsigned int));
//
// /* 从尾部开始,循环读取每一页,依次搬动 */
// /* todo 以下为临界区,补充锁定文件的代码 */
// {
// unsigned int total_pages_count = pager_get_total_pages_count(pager);
// unsigned int i = total_pages_count;
// unsigned int truncate_pages = total_pages_count - total_free;
// for(current_index = 0; current_index < total_free && i > truncate_pages; i--)
// {
// pghd_t * pg = pager_get_page(pager, i);
// if(NULL == pg)
// {
// /* roll back and goto end*/
// need_rollback = 1;
// ret = -1;
// goto pager_truncate_free_page_end_;
// }
//
// /* 没有使用该页,不对该页做处理 */
// if(!*(pg->pg_buf_start + PAGER_PAGE_IN_USE_OFFSET))
// continue;
//
// /* 移动到页号最小的空闲页 */
// if(0 != pager_move_page(pager, pg, pgno_array[current_index]))
// {
// /* roll back and goto end*/
// need_rollback = 1;
// ret = -1;
// goto pager_truncate_free_page_end_;
// }
// current_index ++;
// }
//
// /* 完成移动之后,同步页缓存,将页进行栽减 */
// if(0 == pager_syn(pager))
// {
// need_rollback = 1;
// ret = -1;
// goto pager_truncate_free_page_end_;
// }
//
// if(0 == pager_file_truncate(pager, truncate_pages))
// {
// need_rollback = 1;
// ret = -1;
// goto pager_truncate_free_page_end_;
// }
// }
//
//pager_truncate_free_page_end_:
//
// if(need_rollback)
// pager_rollback(pager);
//
// if(pgno_array)
// MyMemPoolFree(pager->hm, pgno_array);
//
// if(pg_free)
// pager_release_page(pg_free);
//
// if(first_page)
// pager_release_page(first_page);
//
// return ret;
//}
///* 判断是否打开的自去除空闲页的机制 */
//if(0 == pager->used_rate)
// return 0;
///* 如果设置了自动truncate,此时判断是否达到了百分比,如果达到了,truncate开始执行. */
//{
// int need_truncate = 0;
// if(0 != pager_judge_need_truncate(pager, &need_truncate))
// return 0;
//
// if(need_truncate)
// pager_truncate_free_page(pager);
//}
///*
//* 将分界点添加至上层节点
//* 这里需要判断是否是根节点,如果是根节点,需要分配两个新页
//*/
//if(node->parent)
//{
// /* 非根节点,添加至上层节点即可 */
// unsigned int idx_in_parent = node->idx_in_parent_cellarray;
// if(node->parent->idx_changed)
// {
// unsigned int j = 0;
// btree_cellinfo temp_cell_info;
// /* 在parent节点里的数组里轮询,查找 */
// for(; j < node->parent->ncell; j ++)
// {
// get_2byte(&node->parent->read_buf[BTREE_CELL_PTR_OFFSET(node->parent) + j * BTREE_CELL_PTR_SIZE],
// BTREE_CELL_PTR_SIZE,
// cell_ptr);
// btree_mgr_parse_cellptr(node->parent, cell_ptr, &temp_cell_info);
// if(temp_cell_info.lchild_pgno != node->pg_no)
// continue;
// idx_in_parent = j;
// break;
// }
// /* 如果找不到,说明是最右边的那一个 */
// if(j == node->parent->ncell)
// {
// unsigned int right_most;
// get_2byte(&node->parent->read_buf[BTREE_HDR_MOST_RIGHT_CHILD_OFFSET],
// sizeof(unsigned int), right_most);
// assert(node->pg_no == right_most);
// idx_in_parent = node->parent->ncell;
// }
// }
// if(0 == btree_mgr_insert_cell(node->parent, idx_in_parent,
// cell_info.cell, cell_info.cell_sz))
// return -1;
// /* 将idx_div对应的cell从本节点中删除 */
//}
//else
//{
// /* 是根节点,需要分配一页出来,分界点留在原根节点当中,将idx之前的cell移动至新页 */
//}
///* 移动idx_div之后的cell至新的节点当中 */
//{
// unsigned int payload_sz = 0;
// unsigned int cell_sz = 0;
// const unsigned char * cell = cell_info->cell = &node->read_buf[cell_ptr];
// assert(PagePtrIsInpage(node->pg, cell));
//
// if(!(node->node_flag & e_btree_page_flag_leaf))
// {
// /* 如果是叶节点 */
// array_to_uint_as_big_endian(cell, sizeof(unsigned int), cell_info->lchild_pgno);
// cell_sz += sizeof(unsigned int);
// cell += sizeof(unsigned int);
// }
// if(node->node_flag & e_btree_page_flag_hasdata)
// {
// /* 如果节点含有数据域 */
// array_to_uint_as_big_endian(cell, sizeof(unsigned int), cell_info->data_sz);
// cell_sz += sizeof(unsigned int);
// cell += sizeof(unsigned int);
// payload_sz += cell_info->data_sz;
// }
// /* 解析key域 */
// array_to_uint_as_big_endian(cell, sizeof(unsigned int), cell_info->key_sz);
// cell_sz += sizeof(unsigned int);
// cell += cell_sz;
// /* 如果不是整形的key */
// if(!(node->node_flag & e_btree_page_flag_intkey))
// payload_sz += cell_info->key_sz;
// /* 根据payload_sz的值,判断当前cell是否是溢出的 */
// if(payload_sz > node->btree_mgr->max_local)
// {
// unsigned int surplus = payload_sz % (node->btree_mgr->pg_sz - BTREE_OVERFLOW_HDR_SZ);
// if(surplus <= node->btree_mgr->max_local)
// cell_info->local_sz = surplus;
// else
// cell_info->local_sz = node->btree_mgr->min_local;
// /* 查找overflow页号 */
// array_to_uint_as_big_endian(cell, sizeof(unsigned int), cell_info->overflow_pgno);
// cell_sz += sizeof(unsigned int);
// cell += sizeof(unsigned int);
// }
// else
// cell_info->local_sz = payload_sz;
//
// cell_info->head_sz = cell_sz;
// cell_sz += cell_info->local_sz;
// cell_info->payload_sz = payload_sz;
// cell_info->cell_sz = cell_sz;
//}
//return 0;
//unsigned int j = 0;
//btree_cellinfo temp_cell_info;
///* 在parent节点里的数组里轮询,查找 */
//for(; j < node->parent->ncell; j ++)
//{
// get_2byte(&node->parent->read_buf[BTREE_CELL_PTR_OFFSET + j * BTREE_CELL_PTR_SIZE],
// BTREE_CELL_PTR_SIZE,
// cell_ptr);
// btree_mgr_parse_cellptr(node->parent, cell_ptr, &temp_cell_info);
// if(temp_cell_info.lchild_pgno != node->pg_no)
// continue;
// idx_in_parent = j;
// break;
//}
///* 如果找不到,说明是最右边的那一个 */
//if(j == node->parent->ncell)
//{
// unsigned int right_most;
// get_2byte(&node->parent->read_buf[BTREE_HDR_MOST_RIGHT_CHILD_OFFSET],
// sizeof(unsigned int), right_most);
// assert(node->pg_no == right_most);
// idx_in_parent = node->parent->ncell;
//}
//unsigned int cell_parent_sz = 0;
//unsigned int together_fill_sz = 0;
//unsigned int lnode_rmost = 0;
//btree_cellinfo cell_info;
//btree_mgr_parse_idx(node->parent, idx_in_parent - 1, &cell_info);
//assert(node->node_flag == lnode->node_flag);
//cell_parent_sz = cell_info.cell_sz;
//if(node->node_flag & e_btree_page_flag_leaf)
// cell_parent_sz -= 4;
//cell_parent_sz = btree_mgr_cal_cell_real_fill_sz(cell_parent_sz);
//together_fill_sz = 2 * (btree_mgr->pg_sz - BTREE_HDR_SZ) - (lnode->nfree + node->nfree) + cell_parent_sz;
///* 将父节点的idx_in_parent - 1(以下简称pull down node)加入和node */
//if(0 != btree_mgr_insert_cell(node, 0, cell_info.cell, cell_info.cell_sz))
// goto btree_mgr_fill_node_end_;
//assert(!node->has_cell_ovfl && node->cell_ovfl.cell_buf);
///* pull down node的lchild更新为lnode的right most */
//btree_mgr_get_rmost(node->parent, lnode_rmost);
//if(0 != btree_mgr_update_idx_lchild(node, 0, lnode_rmost))
// goto btree_mgr_fill_node_end_;
//if(0 != btree_mgr_drop_cell(node->parent, idx_in_parent - 1, &cell_info))
// goto btree_mgr_fill_node_end_;
//if(together_fill_sz < (btree_mgr->pg_sz - BTREE_HDR_SZ))
//{
// /* 可以合并成一个节点 */
// unsigned int i;
// /* 将lnode的每个cell依次拷贝至node */
// for(i = lnode->ncell; i; i --)
// {
// btree_mgr_parse_idx(lnode, i - 1, &cell_info);
// if(0 != btree_mgr_insert_cell(node, 0, cell_info.cell, cell_info.cell_sz))
// goto btree_mgr_fill_node_end_;
// }
// assert(!node->has_cell_ovfl && node->cell_ovfl.cell_buf);
// /* 删除lnode节点 */
// if(0 != btree_mgr_delete_node(lnode))
// goto btree_mgr_fill_node_end_;
// return 0;
//}
//else
//{
// /* 需要均成两个节点 */
// unsigned int aver_fill_sz = together_fill_sz / 2;
// unsigned int div_fill_sz = 0;
// /* lnode中当填充满足aver_fill_sz的临界cell的索引 */
// unsigned int div_idx = 0;
// unsigned int j;
// assert(((btree_mgr->pg_sz - node->nfree) > btree_mgr->pg_min_fill_sz));
// for(j = 0; j < lnode->ncell; j ++)
// {
// btree_mgr_parse_idx(lnode, j, &cell_info);
// div_fill_sz += btree_mgr_cal_cell_real_fill_sz(cell_info.cell_sz);
// if(div_fill_sz < aver_fill_sz)
// continue;
// div_idx = j + 1;
// break;
// }
// /* 分界点必然在lnode里的某个cell */
// assert(div_idx < lnode->ncell);
// for(j = lnode->ncell - 1; j >= div_idx + 1 ; j ++)
// {
// btree_mgr_parse_idx(lnode, j, &cell_info);
// if(0 != btree_mgr_insert_cell(node, 0, cell_info.cell, cell_info.cell_sz))
// goto btree_mgr_fill_node_end_;
// if(0 != btree_mgr_drop_cell(lnode, j, &cell_info))
// goto btree_mgr_fill_node_end_;
// }
// btree_mgr_parse_idx(lnode, div_idx, &cell_info);
// /* 更新lnode的right most为div_idx的lchild */
// if(0 != btree_mgr_update_idx_lchild(lnode, lnode->ncell, cell_info.lchild_pgno))
// goto btree_mgr_fill_node_end_;
// /* 将div_idx对应的cell存入parent的idx_in_parent - 1这个位置 */
// if(0 != btree_mgr_insert_cell(node->parent, idx_in_parent - 1, cell_info.cell, cell_info.cell_sz))
// goto btree_mgr_fill_node_end_;
// /* 从lnode里去除div_dix这个cell */
// if(0 != btree_mgr_drop_cell(lnode, div_idx, &cell_info))
// goto btree_mgr_fill_node_end_;
// /* 更新parent里idx_in_parent - 1这个位置的lchild */
// if(0 != btree_mgr_update_idx_lchild(node->parent, idx_in_parent - 1, lnode->pg_no))
// goto btree_mgr_fill_node_end_;
// return 0;
//}
//{
// /*
// * btree page head define
// * OFFSET SIZE DESCRIPTION
// * 0 1 Flags. 1: intkey, 2: hasdata, 4: leaf
// * 1 1 记录碎片的大小
// * 2 2 byte offset to the first freeblock
// * 4 2 number of cells on this page
// * 6 2 first byte of the cell content area
// * 8 4 Right child (the Ptr(N+1) value). reserve on leaves.
// */
// unsigned int cell_content = 0;
// unsigned int free_buf = 0;
// const unsigned char * data = (unsigned char *)PageHeadMakeReadable(pg);
// assert(data);
//
// node->node_flag = data[BTREE_HDR_NODEFLAG_OFFSET];
// get_2byte(&(data[BTREE_HDR_NCELL_OFFSET]), BTREE_HDR_NCELL_SZ, node->ncell);
// get_2byte(&(data[BTREE_HDR_FIRST_CONTENT]), BTREE_CELL_PTR_SIZE, cell_content);
// if(0 == cell_content)
// {
// /* 说明这是个节点此时没有任何存储 */
// node->nfree = node->btree_mgr->pg_sz - BTREE_CELL_PTR_OFFSET;
// }
// else
// {
// /* 空闲存储空间大小 */
// node->nfree = cell_content - (2 * node->ncell + BTREE_CELL_PTR_OFFSET) +
// data[BTREE_HDR_NFRAG_OFFSET];
// get_2byte(&(data[BTREE_HDR_FIRST_FREE_OFFSET]), BTREE_CELL_PTR_SIZE, free_buf);
// /* 顺着空闲链表做统计 */
// while(free_buf)
// {
// unsigned int sz = 0;
// unsigned int next_free = 0;
// get_2byte(&(data[free_buf + BTREE_FREE_BLOCK_SZ_OFFSET]), sizeof(unsigned short), sz);
// node->nfree += sz;
// get_2byte(&(data[free_buf + BTREE_FREE_BLOCK_NEXT_OFFSET]), BTREE_CELL_PTR_SIZE, next_free);
// /* 空闲块按偏移的升序排列,并且不可能连续(释放时要处理合并连续空闲块的情况) */
// assert(next_free > free_buf + BTREE_FREE_BLOCK_MIN_SZ);
// free_buf = next_free;
// }
// }
//}
//if(idx_div == node->cell_ovfl.idx)
//{
// /*
// * 如果该cell恰巧为溢出cell,直接去除相应的cell ovfl信息即可
// * 并释放cell_ovfl
// */
// assert(node->has_cell_ovfl && idx_div != idx_ovfl && node->cell_ovfl.cell_buf);
// btree_mgr_clear_ovfl(node);
//}
//else
//{
// unsigned idx_mov = idx_div;
// /* 如果idx_div大于cell ovfl的索引,则在原始数组里,它实际的位置应为idx_div - 1 */
// if(idx_div > node->cell_ovfl.idx)
// idx_mov -= 1;
// /* idx_div从原始数组里删除, */
// if(0 != btree_mgr_drop_cell(node, idx_mov, &cell_info))
// {
// btree_mgr_delete_node(new_node);
// return -1;
// }
//}
//if(node->cell_ovfl.idx > idx_div)
//{
// unsigned int sz_temp = 0;
// unsigned char * pctemp = MyBufferGet(node->cell_ovfl.cell_buf, &sz_temp);
// ret = btree_mgr_insert_cell(new_node, node->cell_ovfl.idx, pctemp, sz_temp);
// btree_mgr_clear_ovfl(node);
//}
//else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -