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

📄 create_t.c

📁 一个c语言开发的小型的dbms系统
💻 C
字号:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "struct.h"

void create_table(char * _table_name,char _field_name[10][30],int * _field_type,int * _field_lenth,int col_num)
/*表名,字段名组,字段类型组,字段长度组,字段数*/
{
	struct tab_dic_type tab_dic,tab_dic_temp,free_block;/*定义表字典对象*/
	struct col_dic_type col_dic;/*定义列字典对象*/
	struct data_head head_data,head_data_temp;/*定义数据头对象*/
	FILE *tab_fp,*col_fp,*data_fp;
	char  *data;
	int   *int_data;
	int i,id,offset;
	int repet=0;
	id=-1;

	if((tab_fp=fopen("TABLE","rb+"))==NULL)
	{
		printf("cann't open file TABLE\n");
		exit(0);
	}/*打开表字典文件*/
	if((col_fp=fopen("COLUMN","ab+"))==NULL)
	{
		printf("cann't open file COLUMN\n");
		exit(0);
	}/*打开列字典文件*/
	if((data_fp=fopen("DATABASE","rb+"))==NULL)
   {
	 printf("cann't open file DATABASE\n");
	 exit(0);
	}/*打开数据文件*/

	if (strlen(_table_name)>100)/*表名长度判断*/
		printf("table name is too long!\n");
	else/*填写表字典信息*/
	{
		while (!feof(tab_fp))/*表名是否重复*/
		{
			id=id+1;
			if (id==0)
				fread(&free_block,sizeof(struct tab_dic_type),1,tab_fp);
			else
			{
				if (fread(&tab_dic_temp,sizeof(struct tab_dic_type),1,tab_fp)!=1)
				{	
				}
				if (strcmp(tab_dic_temp.tab_name,_table_name)==0)
				{
					printf("table name is repetitional\n");
					repet=1;
					break;
				}
			}
		 }
	}
	if (repet!=1)
	{ 
		if (id==0)
		{
			free_block.tab_id=0;
			free_block.first_free_block=0;
			 if (fwrite(&free_block,sizeof(struct tab_dic_type),1,tab_fp)!=1)
				printf(" TABLE file(free_block) write error!\n");
			 id=id+1;
		}
		strcpy(tab_dic.tab_name,_table_name);
		tab_dic.tab_id=id;
		tab_dic.first_free_block=free_block.first_free_block;
		tab_dic.col_num=col_num;
		tab_dic.row_num=0;
		tab_dic.row_len=0;
    
		 for(i=0;i<col_num;i++)
		{
			 if (strlen(&_field_name[i])>100)/*列名长度判断*/
    			printf("field name is too long!\n");
			 else/*填写列字典信息*/
   			{
    			col_dic.tab_id=tab_dic.tab_id;
    			strcpy(col_dic.col_name,&_field_name[i]);
    			col_dic.col_id=tab_dic.tab_id*100+i;
    			col_dic.col_type=_field_type[i];
	//printf("col_dic.col_type=%d\n",col_dic.col_type );
    	col_dic.col_length=_field_lenth[i];
//	printf("col_dic.col_length=%d\n",col_dic.col_length );
		tab_dic.row_len=tab_dic.row_len+_field_lenth[i]+1;

				if (fwrite(&col_dic,sizeof(struct col_dic_type),1,col_fp)!=1)
       				printf("COLUMN file write error!\n");  
			}
		 }
   if (fwrite(&tab_dic,sizeof(struct tab_dic_type),1,tab_fp)!=1)
       printf(" TABLE file write error!\n"); 

  //读取空闲块块头信息
    fseek(data_fp,tab_dic.first_free_block*1024,0);
    fread(&head_data_temp,sizeof(struct data_head),1,data_fp);
  if (head_data_temp.last_block==-2)
	free_block.first_free_block=head_data_temp.next_block;
  else
     free_block.first_free_block= free_block.first_free_block+1;
   fseek(tab_fp,0,0);
   if (fwrite(&free_block,sizeof(struct tab_dic_type),1,tab_fp)!=1)
      printf(" TABLE file(free_block) write error!\n");

   /*填写数据头信息*/
   head_data.next_block=-1;
   head_data.last_block=-1;	
   head_data.next_free_addr=tab_dic.first_free_block*1024+24;
   fseek(data_fp,tab_dic.first_free_block*1024,0);
   if (fwrite(&head_data,sizeof(struct data_head),1,data_fp)!=1)
      printf("DATABASE file(data_head) write error!\n");
   fseek(data_fp,tab_dic.first_free_block*1024+24,0);
   offset=ftell(data_fp);
   while (offset<=(tab_dic.first_free_block+1)*1024-1)
		{
			data=(char *)malloc(tab_dic.row_len);
			for(i=0;i<tab_dic.row_len;i++)
				data[i]='\0';
			int_data=data;
			*int_data=offset+tab_dic.row_len;
			offset=offset+tab_dic.row_len;
			if (fwrite(data,tab_dic.row_len,1,data_fp)!=1)
				printf("DATABASE file write error!\n");
		}

   fclose(tab_fp);
   fclose(col_fp);
   fclose(data_fp);
 }
}


void drop_table(char * _table_name)
/*表名*/
{struct tab_dic_type tab_dic,tab_dic_temp,free_block;/*定义表字典对象*/
// struct col_dic_type col_dic;/*定义列字典对象*/
// struct data_head head_data,head_data_temp;/*定义数据头对象*/
 FILE *tab_fp,*col_fp;
 char  *data;
 int   *int_data;
 int i,id,offset;
 int repet=0;
 id=-1;

 if((tab_fp=fopen("TABLE","rb+"))==NULL)
   {
	 printf("cann't open file TABLE\n");
     exit(0);
   }/*打开表字典文件*/

    while (!feof(tab_fp))/*表名是否重复*/
      {
		id=id+1;
	    if (id==0)
		   fread(&free_block,sizeof(struct tab_dic_type),1,tab_fp);
	   else
	   {
		   if (fread(&tab_dic_temp,sizeof(struct tab_dic_type),1,tab_fp)!=1)
	   { //  printf(" TABLE file read error!\n");
	   }
	   if (strcmp(tab_dic_temp.tab_name,_table_name)==0)
		{//printf("table name is repetitional\n");
	     repet=1;
	     break;
		}
	   }
      }

  if (repet!=1)
  {
	  printf("Table %s is not existed\n",_table_name);
	  return;
  }
  
 
   for(i=strlen(tab_dic_temp.tab_name)+1;i>0;i--)
	   tab_dic_temp.tab_name[i]=tab_dic_temp.tab_name[i-1];
   tab_dic_temp.tab_name[0]='$';
   fseek(tab_fp,-sizeof(struct tab_dic_type),SEEK_CUR);
   if (fwrite(&tab_dic_temp,sizeof(struct tab_dic_type),1,tab_fp)!=1)
       printf(" TABLE file write error!\n"); 

  fclose(tab_fp);

/*    fseek(data_fp,tab_dic.first_free_block*1024,0);
    fread(&head_data_temp,sizeof(struct data_head),1,data_fp);
  if (head_data_temp.last_block==-2)
	free_block.first_free_block=head_data_temp.next_block;
  else
     free_block.first_free_block= free_block.first_free_block+1;
   fseek(tab_fp,0,0);
   if (fwrite(&free_block,sizeof(struct tab_dic_type),1,tab_fp)!=1)
      printf(" TABLE file(free_block) write error!\n");
*/
  
/*   head_data.next_block=-1;
   head_data.last_block=-1;	
   head_data.next_free_addr=tab_dic.first_free_block*1024+24;
   fseek(data_fp,tab_dic.first_free_block*1024,0);
   if (fwrite(&head_data,sizeof(struct data_head),1,data_fp)!=1)
      printf("DATABASE file(data_head) write error!\n");
   fseek(data_fp,tab_dic.first_free_block*1024+24,0);
   offset=ftell(data_fp);
   while (offset<=(tab_dic.first_free_block+1)*1024-1)
		{data=(char *)malloc(tab_dic.row_len);
         for(i=0;i<tab_dic.row_len;i++)
			data[i]='\0';
		 int_data=data;
		 *int_data=offset+tab_dic.row_len;
		 offset=offset+tab_dic.row_len;
		 if (fwrite(data,tab_dic.row_len,1,data_fp)!=1)
			printf("DATABASE file write error!\n");
		}
*/
   
}

⌨️ 快捷键说明

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