⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pager_bak.c

📁 sourceforge历史版本完整下载: http://sourceforge.net/project/showfiles.php?group_id=202044 提供了基于b树索引算法的文件数据数据
💻 C
📖 第 1 页 / 共 3 页
字号:
//		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 + -