www.pudn.com > database_edwardversion.rar > file.c


#include  
#include  
#include  
#include "database.h" 
 
 
/*/////////////////////////////////////////////////////////////////// 
	the functions below are used to load a database or save a 
	database 
 
	Author: Edward Lee 
///////////////////////////////////////////////////////////////////**/ 
 
/*--------------------------------------- 
	Open Function : 
	Load datas from a file and create  
	chained lists 
---------------------------------------*/ 
void Open(void) 
{	 
	FILE *fp; 
	char filename[FILE_NAME];  //////// 
	int i=0,j=0,k=0; 
	int len_filename; 
	struct table *ptable1,*ptable2; 
	struct column *pcolumn1,*pcolumn2; 
	struct data *pdata1,*pdata2; 
	struct database *database; 
 
	// the path of the file 
	printf("Please input the filename(or the filepath) for file open(with postfix [.db]):\n"); 
	scanf(" %s",filename); 
 
	// check the filename, if wrong, reinput 
	len_filename=strlen(filename); 
	while(filename[len_filename-1]!='b'||filename[len_filename-2]!='d'||filename[len_filename-3]!='.') 
	{ 
		printf("postfix of the filename wrong! Input again:"); 
		scanf(" %s",filename); 
		len_filename=strlen(filename); 
	} 
 
	// Open the file for reading 
	if( (fp=fopen(filename,"rb"))==NULL )  
	{ 
		printf("cannot open file!\n"); 
		return; 
	}	 
 
	// Read the database infomation 
	if(databasehead==NULL)	// if NULL, no database in the memory  
	{ 
		databasehead = (struct database *)malloc(LEN_DATABASE); 
		if( ( fread(databasehead,LEN_DATABASE-8,1,fp) )!=1 ) 
		{	printf("file read error!\n"); 
			return; 
		} 
		databasehead->next = NULL;		// End database chained list 
	} 
	else	// another database 
	{ 
		database=databasehead; 
		while(database->next!=NULL) database=database->next; 
		database->next = (struct database *)malloc(LEN_DATABASE); 
		if( ( fread(database->next,LEN_DATABASE-8,1,fp) )!=1 ) 
		{	printf("file read error!\n"); 
			return; 
		} 
		database->next->next = NULL;		// End database chained list 
	} 
 
	// Read the table infomation 
	ptable1 = ptable2 = (struct table *)malloc(LEN_TABLE); 
	databasehead->tablehead = ptable1; 
	for(i=0;iiTableNum;i++) 
	{	if( ( fread(ptable1,LEN_TABLE-8,1,fp) )!=1 ) 
		{	printf("file read error!\n"); 
			return; 
		} 
		ptable2=ptable1; 
		ptable1->next = (struct table *)malloc(LEN_TABLE); 
		ptable1 = ptable1->next; 
	} 
	ptable2->next = NULL;		// End table chained list 
//	free(ptable1);		//////// /////////  /////////  ///////////// 
 
	// Read the column infomation 
	ptable1 = databasehead->tablehead;		// Chain tables to database 
	pcolumn1 = pcolumn2 = (struct column *)malloc(LEN_COLUMN); 
	for(i=0;iiTableNum;i++) 
	{	ptable1->columnhead = pcolumn1;		// Chain columns to table 	 
		for(j=0;jiColNum;j++) 
		{	if( ( fread(pcolumn1,LEN_COLUMN-8,1,fp) )!=1 ) 
			{	printf("file read error!\n"); 
				return; 
			} 
			pcolumn2 = pcolumn1; 
			pcolumn1->next = (struct column *)malloc(LEN_COLUMN); 
			pcolumn1 = pcolumn1->next; 
		} 
		pcolumn2->next = NULL;		// End column chained list 
	//	free(pcolumn1);	////////////   ////////   ///////////////  ////////// 
		ptable1 = ptable1->next;	// Next table 
	} 
 
	// Read the real data  
	ptable1 = databasehead->tablehead;		// Chain tables to database 
	pdata1 = pdata2 = (struct data *)malloc(LEN_DATA); 
	for(i=0;iiTableNum;i++) 
	{	pcolumn1 = ptable1->columnhead;		// Chain columns to table  
		for(j=0;jiColNum;j++)	 
		{	pcolumn1->datahead = pdata1;	// Chain datas to column 
			for(k=0;kiLineNum;k++) 
			{	if( ( fread(pdata1,LEN_DATA-4,1,fp) )!=1 ) 
				{	printf("file read error!\n"); 
					return; 
				} 
				pdata2 = pdata1; 
				pdata1->next = (struct data *)malloc(LEN_DATA); 
				pdata1 = pdata1->next;		// Next data 
			} 
			pdata2->next = NULL; 
	//		free(pdata1);				//////////// //////////  //////////  //////// 
			pcolumn1 = pcolumn1->next;		// Next column 
		} 
		ptable1 = ptable1->next;			// Next table 
	} 
 
	// Close the file 
	fclose(fp); 
} 
 
/*--------------------------------------- 
	Save Function : 
	Save chained lists into a file 
---------------------------------------*/ 
void SaveDatabase(struct database *database) 
{ 
	FILE *fp; 
	int i,j,k; 
	int len_filename;	// for checking the postfix of filename 
	struct table *ptable; 
	struct column *pcolumn; 
	struct data *pdata; 
	char filename[MAX_NAME]; 
	 
	// the path of the file 
	printf("Please input the filename(or the filepath) for file save(with postfix [.db]):\n"); 
	scanf(" %s",filename); 
 
	// check the filename, if wrong, reinput 
	len_filename=strlen(filename); 
	while(filename[len_filename-1]!='b'||filename[len_filename-2]!='d'||filename[len_filename-3]!='.') 
	{ 
		printf("postfix of the filename wrong! Input again:"); 
		scanf(" %s",filename); 
		len_filename=strlen(filename); 
	} 
 
	// Open the file for writing 
	if( ( fp=fopen(filename,"wb") )==NULL )  
	{ 
		printf("cannot open file!\n"); 
		return; 
	} 
 
	// Write the database infomation 
	if( ( fwrite(database,sizeof(struct database)-8,1,fp) )!=1 ) 
	{	printf("file write error!\n"); 
		return; 
	} 
 
	// Write the table infomation 
	ptable = database->tablehead; 
	for(i=0;iiTableNum;i++) 
	{	if( ( fwrite(ptable,sizeof(struct table)-8,1,fp) )!=1 ) 
		{	printf("file write error!\n"); 
			return; 
		} 
		ptable = ptable->next; 
	} 
 
	// Write the column infomation 
	ptable = database->tablehead; 
	for(i=0;iiTableNum;i++) 
	{	pcolumn = ptable->columnhead; 
		for(j=0;jiColNum;j++) 
		{	if( ( fwrite(pcolumn,sizeof(struct column)-8,1,fp) )!=1 ) 
			{	printf("file write error!\n"); 
				return; 
			} 
			pcolumn = pcolumn->next; 
		} 
		ptable = ptable->next; 
	} 
 
	// Write the real data  
	ptable = database->tablehead; 
	for(i=0;iiTableNum;i++) 
	{	pcolumn = ptable->columnhead; 
		for(j=0;jiColNum;j++) 
		{	pdata = pcolumn->datahead;	 
			for(k=0;kiLineNum;k++) 
			{	if( ( fwrite(pdata,sizeof(struct data)-4,1,fp) )!=1 ) 
				{	printf("file write error!\n"); 
					return; 
				} 
				pdata = pdata->next;	// Next data 
			} 
			pcolumn = pcolumn->next;	// Next column 
		} 
		ptable = ptable->next;			// Next table 
	} 
 
	// Close the file 
	fclose(fp); 
} 
 
void Save(void) 
{ 
	struct database *pdb; 
	char databasename[MAX_NAME]; 
	 
	ShowDatabaseInfo(); 
	printf("Database Name:"); 
	scanf(" %s",databasename); 
	pdb=GetDatabase(databasename); 
 
	SaveDatabase(pdb); 
}