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

📄 construct_idx.c

📁 数据库系统实现
💻 C
📖 第 1 页 / 共 2 页
字号:
									}
								
									if(yeah == 0)
									{
										fp = fopen("hash_table.idx", "rb+");
										get_blk(fp);
										fclose(fp);
										length++;
										buk_over_buf[m].buk.blk_no = length - 1;
										buk_over_buf[m].change_flag = 1;
										bucket = buk_over_buf[m];
										write_idx("hash_table.idx", bucket.from_blk_no);
										read_idx("hash_table.idx",buk_buf[m].nth_bucket, length - 1);
										bucket.buk.blk_no = -1;
										bucket.buk.rcd_no = 1;
										bucket.buk.hk_addr[0].hkey = dat_buf[i].key[j];
										dat_buf[i].key[j] = -1;
										bucket.buk.hk_addr[0].to_rcd.blk_no = dat_buf[i].from_blk_no;
										bucket.buk.hk_addr[0].to_rcd.offset = sizeof(long) * j;						
										buk_over_buf[m] = bucket;
										buk_over_buf[m].change_flag = 1;
									}
								}
							}
							
							else
							{
								fp = fopen("hash_table.idx", "rb+");
								get_blk(fp);
								fclose(fp);
								length++;
								buk_buf[m].buk.blk_no = length - 1;
								buk_buf[m].change_flag = 1;
								read_idx("hash_table.idx",buk_buf[m].nth_bucket, length - 1);
								bucket.buk.blk_no = -1;
								bucket.buk.rcd_no = 1;
								bucket.buk.hk_addr[0].hkey = dat_buf[i].key[j];
								dat_buf[i].key[j] = -1;
								bucket.buk.hk_addr[0].to_rcd.blk_no = dat_buf[i].from_blk_no;
								bucket.buk.hk_addr[0].to_rcd.offset = sizeof(long) * j;						
								buk_over_buf[m] = bucket;
								buk_over_buf[m].change_flag = 1;
							}
						}
					}
					m++;
				}
			}
			L: j++;
		}
		i++;
	}

	i = 0;
	m = 0;
	n = 0;
	p = 0;
	flag = 0;
	found = 0;
	found_over = 0;
	yeah = 0;
	while( i < hash_info.rcd_no )//将temp中的数据放入相应的桶~ 有可能要增加溢出桶~
	{
		if(temp[i].hkey != -1)
		{
			add_in = add_in_which(temp[i].hkey, hash_info.hkey_i);
			if( add_in < hash_info.bucket_no)
				flag = add_in;
			else
				flag = add_in - power;

			m = 0;
			while( m < BUCKET_BUFFER_SIZE )
			{
				if(flag == buk_buf[m].nth_bucket)
				{
					found = 0;
					while(flag == buk_buf[m].nth_bucket)
					{
						n = 0;
						while( n < HASH_SPACE )
						{
							if(buk_buf[m].buk.hk_addr[n].hkey == -1)
							{
								buk_buf[m].buk.hk_addr[n] = temp[i];
								temp[i].hkey = -1;
								buk_buf[m].change_flag = 1;
								buk_buf[m].buk.rcd_no++;
								found = 1;
								goto N;
							}
							n++;
						}
						m++;
					}
					if(found == 0)
					{
						m--;
						if(buk_over_buf[m].from_blk_no != -1)
						{
							if( buk_over_buf[m].buk.blk_no != -1)
							{
								bucket = buk_over_buf[m];
								found_over = 0;
								while(bucket.buk.blk_no != -1)
								{
									read_idx("hash_table.idx", buk_buf[m].nth_bucket, bucket.buk.blk_no);
									p = 0;
									while( p < HASH_SPACE )
									{
										if(bucket.buk.hk_addr[p].hkey == -1)
										{
											bucket.buk.hk_addr[p] = temp[i];
											temp[i].hkey = -1;
											bucket.buk.rcd_no++;
											buk_over_buf[m] = bucket;
											buk_over_buf[m].change_flag = 1;
											found_over = 1;
											goto YY;
										}
										p++;
									}
								}
								YY: ;
								if( found_over == 0)
								{
									fp = fopen("hash_table.idx", "rb+");
									get_blk(fp);
									fclose(fp);
									length++;
									buk_over_buf[m].buk.blk_no = length - 1;
									buk_over_buf[m].change_flag = 1;
									bucket = buk_over_buf[m];
									write_idx("hash_table.idx", bucket.from_blk_no);
									read_idx("hash_table.idx",buk_buf[m].nth_bucket, length - 1);
									bucket.buk.blk_no = -1;
									bucket.buk.rcd_no = 1;
									bucket.buk.hk_addr[0] = temp[i];
									temp[i].hkey = -1;								
									buk_over_buf[m] = bucket;
									buk_over_buf[m].change_flag = 1;
								}
							}
							else
							{
								for( p = 0; p < HASH_SPACE; p++ )
								{
									if(buk_over_buf[m].buk.hk_addr[p].hkey == -1)
									{
										buk_over_buf[m].buk.hk_addr[p] = temp[i];
										temp[i].hkey = -1;
										buk_over_buf[m].buk.rcd_no++;	
										buk_over_buf[m].change_flag = 1;
										yeah = 1;
										break;
									}
								}
								
								if(yeah == 0)
								{
									fp = fopen("hash_table.idx", "rb+");
									get_blk(fp);
									fclose(fp);
									length++;
									buk_over_buf[m].buk.blk_no = length - 1;
									buk_over_buf[m].change_flag = 1;
									bucket = buk_over_buf[m];
									write_idx("hash_table.idx", bucket.from_blk_no);
									read_idx("hash_table.idx",buk_buf[m].nth_bucket, length - 1);
									bucket.buk.blk_no = -1;
									bucket.buk.rcd_no = 1;
									bucket.buk.hk_addr[0] = temp[i];
									temp[i].hkey = -1;
									buk_over_buf[m] = bucket;
									buk_over_buf[m].change_flag = 1;
								}
							}
						}
							
						else
						{
							fp = fopen("hash_table.idx", "rb+");
							get_blk(fp);
							fclose(fp);
							length++;
							buk_buf[m].buk.blk_no = length - 1;
							buk_buf[m].change_flag = 1;
							read_idx("hash_table.idx",buk_buf[m].nth_bucket, length - 1);
							bucket.buk.blk_no = -1;
							bucket.buk.rcd_no = 1;
							bucket.buk.hk_addr[0] = temp[i];
							temp[i].hkey = -1;					
							buk_over_buf[m] = bucket;
							buk_over_buf[m].change_flag = 1;
						}
					}
				}
				m++;
			}
		}
		N: i++;
	}
	
	j = 0;
	i = 0;
	while( j < BUCKET_BUFFER_SIZE)//将改动了的索引桶写回
	{
		if(buk_buf[j].change_flag == 1)
		{
			bucket.buk = buk_buf[j].buk;
			write_idx("hash_table.idx", buk_buf[j].from_blk_no);
			buk_buf[j].from_blk_no = -1;
			buk_buf[j].buk.blk_no = -1;
			buk_buf[j].nth_bucket = -1;
			buk_buf[j].change_flag = 0;
			buk_buf[j].buk.rcd_no = 0;
			for( i = 0;i < HASH_SPACE;i++)
				buk_buf[j].buk.hk_addr[i].hkey = -1;
		}
		else
		{
			buk_buf[j].from_blk_no = -1;
			buk_buf[j].buk.blk_no = -1;
			buk_buf[j].nth_bucket = -1;
			buk_buf[j].change_flag = 0;
			buk_buf[j].buk.rcd_no = 0;
			for( i = 0;i < HASH_SPACE;i++)
				buk_buf[j].buk.hk_addr[i].hkey = -1;
		}

		if(buk_over_buf[j].change_flag == 1)
		{
			bucket.buk = buk_over_buf[j].buk;
			write_idx("hash_table.idx", buk_over_buf[j].from_blk_no);
			buk_over_buf[j].from_blk_no = -1;
			buk_over_buf[j].buk.blk_no = -1;
			buk_over_buf[j].nth_bucket = -1;
			buk_over_buf[j].change_flag = 0;
			buk_over_buf[j].buk.rcd_no = 0;
			for( i = 0;i < HASH_SPACE;i++)
				buk_over_buf[j].buk.hk_addr[i].hkey = -1;
		}
		else
		{
			buk_over_buf[j].from_blk_no = -1;
			buk_over_buf[j].buk.blk_no = -1;
			buk_over_buf[j].nth_bucket = -1;
			buk_over_buf[j].change_flag = 0;
			buk_over_buf[j].buk.rcd_no = 0;
			for( i = 0;i < HASH_SPACE;i++)
				buk_over_buf[j].buk.hk_addr[i].hkey = -1;
		}
		j++;
	}

}
	
void add_hash_table_bucket(char *filename, long old_bucket_no)
{
	FILE *fp = NULL;
	long i = 0;
	long j = 0;
	long length = 0;
	long fd = 0;
	fd = open(filename, O_RDWR);
	length = filelength(fd)/BLOCK_SIZE;
	close(fd);
	fp = fopen(filename, "rb+");
	j = hash_info.bucket_no - old_bucket_no;
	if( fp != NULL)
	{
		while( i < j )
		{
			fp = get_blk(fp);
			init_hash_tab(fp);
			renew_nth_blk(old_bucket_no, length);
			old_bucket_no++;
			length++;
			i++;
		}
		fclose(fp);
	}
}

void renew_nth_blk(long nth_bucket, long bucket_no)
{
	long i = 0;
	long j = 0;
	long found = 0;
	long flag = 0;
	FILE *fp = NULL;
	while( i < NTH_BLOCK_BUFFER_SIZE && found == 0) 
	{
		if(nth_blk_buf[i].from_blk_no != -1)
		{
			j = 0;
			while( j < NTH_BLOCK_IN_BLOCK && found == 0)
			{
				if( nth_blk_buf[i].nth_blk[j].nth_bucket == -1)
				{
					nth_blk_buf[i].nth_blk[j].nth_bucket = nth_bucket;
					nth_blk_buf[i].nth_blk[j].blk_no = bucket_no;
					nth_blk_buf[i].change_flag = 1;
					found = 1;
				}
				j++;
			}
		}
		i++;
	}
	
	j = 0;
	i = 0;
	if(found == 0)//在读入缓冲的nth_blk文件块中没有找到可以加入对应信息的地方,必须读入新的对应信息块
	{
		while(j < NTH_BLOCK_BUFFER_SIZE && found == 0)
		{
			if(nth_blk_buf[j].change_flag == 1)
			{
				nth_blk_relation = nth_blk_buf[j];
				write_nth_blk("nth_block.dat", nth_blk_relation.from_blk_no);
				nth_blk_buf[j].from_blk_no = -1;
				flag = read_nth_blk("nth_block.dat", NTH_BLK_CUR);
				if(flag == 1)
				{
					nth_blk_buf[j] = nth_blk_relation;
					NTH_BLK_CUR++;
					while( i < NTH_BLOCK_IN_BLOCK && found ==0 )
					{
						if(nth_blk_buf[j].nth_blk[i].nth_bucket == -1)
						{
							nth_blk_buf[j].nth_blk[i].nth_bucket = nth_bucket;
							nth_blk_buf[j].nth_blk[i].blk_no = bucket_no;
							nth_blk_buf[j].change_flag = 1;
							found = 1;
						}
						i++;
					}
				}
				else
				{
					fp = fopen("nth_block.dat", "rb+");
					get_blk(fp);
					fclose(fp);
					read_nth_blk("nth_block.dat", NTH_BLK_CUR);
					nth_blk_buf[j] = nth_blk_relation;
					NTH_BLK_CUR = 0;
					while( i < NTH_BLOCK_IN_BLOCK && found == 0 )
					{
						if(nth_blk_buf[j].nth_blk[i].nth_bucket == -1)
						{
							nth_blk_buf[j].nth_blk[i].nth_bucket = nth_bucket;
							nth_blk_buf[j].nth_blk[i].blk_no = bucket_no;
							nth_blk_buf[j].change_flag = 1;
							found = 1;
						}
						i++;
					}
				}
			}
			j++;
		}
	}
}
					
void renew_hash_info(long data_volume)
{
	long i = 0;
	hash_info.rcd_no += data_volume;
	i = (long)((float)hash_info.rcd_no/((float)HASH_SPACE*SATURATION_DEGREE)) + 1;
	if( i > hash_info.bucket_no)
		hash_info.bucket_no = i;
	hash_info.hkey_i = renew_hash_info_hkey_i(hash_info.bucket_no);
}

long renew_hash_info_hkey_i(long x)
{
     long i = 0;
	 long j = 0;
	 long k = 0;
     while(1)
     {
		 j = pow(2, i);
		 k = 2 * j;
		if(j <= x && k > x)
		{
			i++;
			break;
		}          
		else
		i++;
     }
     i--;
     if(j == x)
		 return i;
     else
		 return i+1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -