main() {
	srand(time(NULL));
	int error;
	int i;
	int pagenum,*buf;
	int fd;

	/* create a new file to be used as input file */


	if ((error=PF_CreateFile(FILE))!= PFE_OK){
		PF_PrintError("Cannot create file");
		exit(1);
	}
	printf("Input File created\n");

	/* create a temporary file */
	if ((error=PF_CreateFile(TMPFILE))!= PFE_OK){
		PF_PrintError("Cannot create file");
		exit(1);
	}
	printf("Temporary File created\n");

	/* this method creates a sample input file filled with random numbers */
	writefile(FILE);

	copyfiles();		// copy the contents of the input file to a temporary file

	/* this method prints out the sample input file generated above */
	readfile(FILE);
	printf("File read\n");
	printf("Starting the sorting process\n");
	external_sort();
	readfile(FILE);
}
Пример #2
0
main()
{

int bufmode;
scanf("%d", &bufmode);
setBufMode(bufmode);
int error;
int i;
int pagenum,*buf;
int *buf1,*buf2;
int fd1,fd2;

   int choice;
    scanf("%d", &choice);

	char filename1[20], filename2[20];

    switch(choice)
    {
    case 1:
		scanf("%s", filename1);

        if ((error=PF_CreateFile(filename1))!= PFE_OK){
            PF_PrintError("asfsad");
            exit(1);
        }

        scanf("%d", &choice);
        writefile(filename1, choice);

        break;

    case 2:
		scanf("%s", filename1);

        selectByName(filename1, "DBInternals");

        break;

    case 3:
		scanf("%s", filename1);
		scanf("%s", filename2);

		join(filename1, filename2);

        break;

    case 4:
		scanf("%s", filename1);
		scanf("%s", filename2);

		scanf("%d", &choice);
		setBufSize(choice);

		join(filename1, filename2);

		break;

    default:
        	break;
    }

PF_printcounts();

}
main() {
	int error;
	int i;
	int pagenum,*buf;
	int *buf1,*buf2;
	int fd1,fd2;

	/* create a few files */
	if ((error=PF_CreateFile(FILE1))!= PFE_OK){
		PF_PrintError("file1");
		exit(1);
	}
	printf("file1 created\n");

	if ((error=PF_CreateFile(FILE2))!= PFE_OK){
		PF_PrintError("file2");
		exit(1);
	}
	printf("file2 created\n");

	/* write to file1 */
	writefile(FILE1);

	/* print it out */
	readfile(FILE1);

	/* write to file2 */
	writefile(FILE2);

	/* print it out */
	readfile(FILE2);


	/* open both files */
	if ((fd1=PF_OpenFile(FILE1))<0){
		PF_PrintError("open file1\n");
		exit(1);
	}
	printf("opened file1\n");

	if ((fd2=PF_OpenFile(FILE2))<0 ){
		PF_PrintError("open file2\n");
		exit(1);
	}
	printf("opened file2\n");

	/* get rid of records  1, 3, 5, etc from file 1,
	and 0,2,4,6 from file2 */
	for (i=0; i < PF_MAX_BUFS; i++){
		if (i & 1){
			if ((error=PF_DisposePage(fd1,i))!= PFE_OK){
				PF_PrintError("dispose\n");
				exit(1);
			}
			printf("disposed %d of file1\n",i);
		}
		else {
			if ((error=PF_DisposePage(fd2,i))!= PFE_OK){
				PF_PrintError("dispose\n");
				exit(1);
			}
			printf("disposed %d of file2\n",i);
		}
	}

	if ((error=PF_CloseFile(fd1))!= PFE_OK){
		PF_PrintError("close fd1");
		exit(1);
	}
	printf("closed file1\n");

	if ((error=PF_CloseFile(fd2))!= PFE_OK){
		PF_PrintError("close fd2");
		exit(1);
	}
	printf("closed file2\n");
	/* print the files */
	readfile(FILE1);
	readfile(FILE2);


	/* destroy the two files */
	if ((error=PF_DestroyFile(FILE1))!= PFE_OK){
		PF_PrintError("destroy file1");
		exit(1);
	}
	if ((error=PF_DestroyFile(FILE2))!= PFE_OK){
		PF_PrintError("destroy file2");
		exit(1);
	}

	/* create them again */
	if ((fd1=PF_CreateFile(FILE1))< 0){
		PF_PrintError("create file1");
		exit(1);
	}
	printf("file1 created\n");

	if ((fd2=PF_CreateFile(FILE2))< 0){
		PF_PrintError("create file2");
		exit(1);
	}
	printf("file2 created\n");

	/* put stuff into the two files */
	writefile(FILE1);
	writefile(FILE2);

	/* Open the files, and see how the buffer manager
	handles more insertions, and deletions */
	/* open both files */
	if ((fd1=PF_OpenFile(FILE1))<0){
		PF_PrintError("open file1\n");
		exit(1);
	}
	printf("opened file1\n");

	if ((fd2=PF_OpenFile(FILE2))<0 ){
		PF_PrintError("open file2\n");
		exit(1);
	}
	printf("opened file2\n");

	for (i=PF_MAX_BUFS; i < PF_MAX_BUFS*2 ; i++){
		if ((error=PF_AllocPage(fd2,&pagenum,&buf))!= PFE_OK){
			PF_PrintError("first buffer\n");
			exit(1);
		}
		*((int *)buf) = i;
		if ((error=PF_UnfixPage(fd2,pagenum,TRUE))!= PFE_OK){
			PF_PrintError("unfix file1");
			exit(1);
		}
		printf("alloc %d file1\n",i,pagenum);

		if ((error=PF_AllocPage(fd1,&pagenum,&buf))!= PFE_OK){
			PF_PrintError("first buffer\n");
			exit(1);
		}
		*((int *)buf) = i;
		if ((error=PF_UnfixPage(fd1,pagenum,TRUE))!= PFE_OK){
			PF_PrintError("dispose file1");
			exit(1);
		}
		printf("alloc %d file2\n",i,pagenum);
	}

	for (i= PF_MAX_BUFS; i < PF_MAX_BUFS*2; i++){
		if (i & 1){
			if ((error=PF_DisposePage(fd1,i))!= PFE_OK){
				PF_PrintError("dispose fd1");
				exit(1);
			}
			printf("dispose fd1 page %d\n",i);
		}
		else {
			if ((error=PF_DisposePage(fd2,i))!= PFE_OK){
				PF_PrintError("dispose fd2");
				exit(1);
			}
			printf("dispose fd2 page %d\n",i);
		}
	}

	printf("getting file2\n");
	for (i=PF_MAX_BUFS; i < PF_MAX_BUFS*2; i++){
		if (i & 1){
			if ((error=PF_GetThisPage(fd2,i,&buf))!=PFE_OK){
				PF_PrintError("get this on fd2");
				exit(1);
			}
			printf("%d %d\n",i,*buf);
			if ((error=PF_UnfixPage(fd2,i,FALSE))!= PFE_OK){
				PF_PrintError("get this on fd2");
					exit(1);
			}
		}
	}

	printf("getting file1\n");
	for (i=PF_MAX_BUFS; i < PF_MAX_BUFS*2; i++){
		if (!(i & 1)){
			if ((error=PF_GetThisPage(fd1,i,&buf))!=PFE_OK){
				PF_PrintError("get this on fd2");
				exit(1);
			}
			printf("%d %d\n",i,*buf);
			if ((error=PF_UnfixPage(fd1,i,FALSE))!= PFE_OK){
				PF_PrintError("get this on fd2");
					exit(1);
			}
		}
	}

	/* print the files */
	printfile(fd2);

	printfile(fd1);

	/*put some more stuff into file1 */
	printf("putting stuff into holes in fd1\n"); 
	for (i=0; i < (PF_MAX_BUFS/2 -1); i++){
		if (PF_AllocPage(fd1,&pagenum,&buf)!= PFE_OK){
			PF_PrintError("PF_AllocPage");
			exit(1);
		}
		*buf =pagenum;
		if (PF_UnfixPage(fd1,pagenum,TRUE)!= PFE_OK){
			PF_PrintError("PF_UnfixPage");
			exit(1);
		}
	}

	printf("printing fd1");
	printfile(fd1);

	PF_CloseFile(fd1);
	printf("closed file1\n");

	PF_CloseFile(fd2);
	printf("closed file2\n");

	/* open file1 twice */
	if ((fd1=PF_OpenFile(FILE1))<0){
		PF_PrintError("open file1");
		exit(1);
	}
	printf("opened file1\n");

	/* try to destroy it while it's still open*/
	error=PF_DestroyFile(FILE1);
	PF_PrintError("destroy file1, should not succeed");


	/* get rid of some invalid page */
	error=PF_DisposePage(fd1,100);
	PF_PrintError("dispose page 100, should fail");


	/* get a valid page, and try to dispose it without unfixing.*/
	if ((error=PF_GetThisPage(fd1,1,&buf))!=PFE_OK){
		PF_PrintError("get this on fd2");
		exit(1);
	}
	printf("got page%d\n",*buf);
	error=PF_DisposePage(fd1,1);
	PF_PrintError("dispose page1, should fail");

	/* Now unfix it */
	if ((error=PF_UnfixPage(fd1,1,FALSE))!= PFE_OK){
		PF_PrintError("get this on fd2");
			exit(1);
	}

	error=PF_UnfixPage(fd1,1,FALSE);
	PF_PrintError("unfix fd1 again, should fail");

	if ((fd2=PF_OpenFile(FILE1))<0 ){
		PF_PrintError("open file1 again");
		exit(1);
	}
	printf("opened file1 again\n");

	printfile(fd1);

	printfile(fd2);

	if (PF_CloseFile(fd1) != PFE_OK){
		PF_PrintError("close fd1");
		exit(1);
	}

	if (PF_CloseFile(fd2)!= PFE_OK){
		PF_PrintError("close fd2");
		exit(1);
	}

	/* print the buffer */
	printf("buffer:\n");
	PFbufPrint();

	/* print the hash table */
	printf("hash table:\n");
	PFhashPrint();
}
Пример #4
0
main(int argc, char *argv[])
{
int error;
int i,fd;
int pagenum,*buf;
int *buf1,*buf2;
int fd1,fd2;
int nowrites;

//int stale_file[2][];
	if( argc == 3 )
	{
		printf("output The argument supplied are %s, %s\n", argv[1], argv[2]);
		//char temp[] = *argv[1];
		//nowrites = *argv[2];
		sscanf(argv[1], "%d", &filesize); 
		sscanf(argv[2], "%d", &nowrites);
		filesize = filesize*PF_MAX_BUFS; 
		printf("output final The argument supplied are %d, %d\n", filesize, nowrites);
	}
	else
	{
		printf("One argument expected.\n");
		filesize = 2*PF_MAX_BUFS;
		nowrites = 20;
	}
	/* create a few files */
	if ((error=PF_CreateFile(FILE1))!= PFE_OK){
		PF_PrintError("file1");
		exit(1);
	}
	printf("file size - %d", filesize);
	int stale_file1[20000];
	for (i=0; i<filesize; i++)
	{
		stale_file1[i] = 0;
	}
	printf("file1 created\n");

	if ((error=PF_CreateFile(FILE2))!= PFE_OK){
		PF_PrintError("file2");
		exit(1);
	}
	int stale_file2[20000];
	for (i=0; i<filesize; i++)
	{
		stale_file2[i] = 0;
	}
	printf("file2 created\n");

	
	/* write to file1 */
	writefile(FILE1,stale_file1);

	/* print it out */
	readfile(FILE1,stale_file1);
	
	
	//Sequential Updates
	reads = 0;
	writes = 0;
	erases = 0;
	if ((fd=PF_OpenFile(FILE1))<0){
		PF_PrintError("open file");
		exit(1);
	}
	pagenum = -1;
	int temp = 0;
	printf("\noutput final Sequential Updates\n");
	while (temp<nowrites && (error=PF_GetNextPage(fd,&pagenum,&buf))== PFE_OK)
	//for(i=0; i<nowrites; i++)
	{
		i = pagenum;
		temp++;
		if ((error=PF_UnfixPage(fd,pagenum,FALSE))!= PFE_OK){
			PF_PrintError("unfix");
			exit(1);
		}
		updatefile(FILE1,stale_file1,i);
	}
	printf("reads - %d\n", reads);
	printf("erases - %d\n", erases);
	printf("writes - %d\n", writes);
	garbagecollect(FILE1,stale_file1);
	printf("output file size - %d\n", filesize);
	printf("output Number of updates - %d\n", nowrites);
	printf("output Number of pages in block - %d\n", PAGEINBLOCK);
	printf("output After garbage collection\n");
	printf("output final reads - %d\n", reads);
	printf("output final erases(in units of blocks) - %d\n", erases/PAGEINBLOCK);
	printf("output final writes - %d\n", writes);
	
	if ((error=PF_CloseFile(fd))!= PFE_OK){
		PF_PrintError("close file");
		exit(1);
	}
	readfile(FILE1, stale_file1);

	/* write to file2 */
	writefile(FILE2,stale_file2);

	/* print it out */
	readfile(FILE2,stale_file2);
		

	//Random Updates 
	reads = 0;
	writes = 0;
	erases = 0;
	if ((fd=PF_OpenFile(FILE2))<0){
		PF_PrintError("open file");
		exit(1);
	}
	pagenum = -1;
	temp = 0;
	printf("\noutput final Random Updates\n");
	while (temp<nowrites && ((error=PF_GetNextPage(fd,&pagenum,&buf))== PFE_OK || error == PFE_EOF) )
	//for(i=0; i<nowrites; i++)
	{
		if(error == PFE_EOF)
		{
			printf("output EOF reached\n");
			pagenum = -1;
			continue;
		}
		i = pagenum;
		if ((error=PF_UnfixPage(fd,pagenum,FALSE))!= PFE_OK){
			printf("outputerror - %d\n", error);
			PF_PrintError("unfix");
			exit(1);
		}
		int j = rand();
		if(j%2 == 0) continue;
		temp++;
		//printf("output i : %d", i);
		//int j = rand() % filesize;
		updatefile(FILE2,stale_file2,i);
		if(temp==nowrites/2) 
		{
			printf("output Before garbage collection1:-\n");
			printf("output reads - %d\n", reads);
			printf("output erases(in units of blocks) - %d\n", erases/PAGEINBLOCK);
			printf("output writes - %d\n", writes);
			numpages(FILE2,stale_file2);
			printf("output total number of pages - %d, stale pages is - %d\n", numtotal,numstale);
			garbagecollect(FILE2,stale_file2);
			printf("output After garbage collection1:-\n");
			printf("output reads - %d\n", reads);
			printf("output erases(in units of blocks) - %d\n", erases/PAGEINBLOCK);
			printf("output writes - %d\n", writes);
			numpages(FILE2,stale_file2);
			printf("output total number of pages - %d, stale pages is - %d\n", numtotal,numstale);
		}
	}
	if(error != PFE_OK) 
	{
		PF_PrintError("output");
	}
	printf("output Before garbage collection2\n");
	printf("output reads - %d\n", reads);
	printf("output erases(in units of blocks) - %d\n", erases/PAGEINBLOCK);
	printf("output writes - %d\n", writes);
	numpages(FILE2,stale_file2);
	printf("output total number of pages - %d, stale pages is - %d\n", numtotal,numstale);
	garbagecollect(FILE2,stale_file2);
	printf("output file size - %d\n", filesize);
	printf("output Number of updates - %d, %d\n", temp, nowrites);
	printf("output Number of pages in block - %d\n", PAGEINBLOCK);
	printf("output After garbage collection2\n");
	printf("output final reads - %d\n", reads);
	printf("output final erases(in units of blocks) - %d\n", erases/PAGEINBLOCK);
	printf("output final writes - %d\n", writes);
	numpages(FILE2,stale_file2);
	printf("output total number of pages - %d, stale pages is - %d\n", numtotal,numstale);
		
	if ((error=PF_CloseFile(fd))!= PFE_OK){
		PF_PrintError("close file");
		exit(1);
	}
	readfile(FILE2, stale_file2);

	//readfile(FILE1,stale_file1);
	
	//garbagecollect(FILE1,stale_file1);
	
	//readfile(FILE1,stale_file1);
}
Пример #5
0
/* Creates a secondary idex file called fileName.indexNo */
AM_CreateIndex(char* fileName,int indexNo,char attrType,int attrLength)
{
	char *pageBuf; /* buffer for holding a page */
	char indexfName[AM_MAX_FNAME_LENGTH]; /* String to store the indexed
					 files name with extension           */
	int pageNum; /* page number of the root page(also the first page) */
	int fileDesc; /* file Descriptor */
	int errVal;
	int maxKeys;/* Maximum keys that can be held on one internal page */
	AM_LEAFHEADER head,*header;

	/* Check the parameters */
	if ((attrType != 'c') && (attrType != 'f') && (attrType != 'i'))
		{
		 AM_Errno = AME_INVALIDATTRTYPE;
		 return(AME_INVALIDATTRTYPE);
                 }
        
	if ((attrLength < 1) || (attrLength > 255))
		{
		 AM_Errno = AME_INVALIDATTRLENGTH;
		 return(AME_INVALIDATTRLENGTH);
                }
	
	if (attrLength != 4)
		if (attrType !='c')
			{
			 AM_Errno = AME_INVALIDATTRLENGTH;
			 return(AME_INVALIDATTRLENGTH);
                        }
	
	header = &head;
	
	/* Get the filename with extension and create a paged file by that name*/
	sprintf(indexfName,"%s.%d",fileName,indexNo);
	errVal = PF_CreateFile(indexfName);
	AM_Check;

	/* open the new file */
	fileDesc = PF_OpenFile(indexfName);
	if (fileDesc < 0) 
	  {
	   AM_Errno = AME_PF;
	   return(AME_PF);
          }

	/* allocate a new page for the root */
	errVal = PF_AllocPage(fileDesc,&pageNum,&pageBuf);
	AM_Check;
	allocsDone++;
	/* initialise the header */
	header->pageType = 'l';
	header->nextLeafPage = AM_NULL_PAGE;
	header->recIdPtr = PF_PAGE_SIZE;
	header->keyPtr = AM_sl;
	header->freeListPtr = AM_NULL;
	header->numinfreeList = 0;
	header->attrLength = attrLength;
	header->numKeys = 0;
	/* the maximum keys in an internal node- has to be even always*/
	maxKeys = (PF_PAGE_SIZE - AM_sint - AM_si)/(AM_si + attrLength);
	if (( maxKeys % 2) != 0) 
		header->maxKeys = maxKeys - 1;
	else 
		header->maxKeys = maxKeys;
	/* copy the header onto the page */
	bcopy(header,pageBuf,AM_sl);
	
	errVal = PF_UnfixPage(fileDesc,pageNum,TRUE);
	AM_Check;
	
	/* Close the file */
	errVal = PF_CloseFile(fileDesc);
	AM_Check;
	
	/* initialise the root page and the leftmost page numbers */
	AM_RootPageNum = pageNum;
	return(AME_OK);
}
Пример #6
0
void create_input_pages() {
    
    
    int totalRecsAdded;
    
    int error;
    
    if ((error=PF_CreateFile(MERGESORTFILE))!= PFE_OK){
        PF_PrintError( "Error in creating mergesortfile");
        exit(1);
    }
   //- printf("mergesortfile created\n");
    
    int fd,pagenum;
    char *buf;
    
    pagenum = -1;
    
    if ((fd=PF_OpenFile(MERGESORTFILE))<0){
        PF_PrintError("Error in opening mergesortfile");
        exit(1);
    }
    //-printf("opened %s\n", MERGESORTFILE);
    
    if ((error=PF_AllocPage(fd,&pagenum,&buf))!= PFE_OK) {
        PF_PrintError("ERROR: failed allocating buffers in create_input_pages\n");
        exit(1);
    }
    //-printf("allocated page %d in create_input_pages\n",pagenum);
    //printf("f4f42");
    FILE *file = fopen ( filename, "r" );
    //printf("f4f42");
    fflush(file);
    if ( file != NULL ) {
        char line[MAXATTRSIZE];
        
        int recsAdded = 0;
        totalRecsAdded = 0;
        while ( fgets ( line, ATTRSIZE, file ) != NULL ) {
            //puts(line);
            //printf("%d \n", strlen(line));
            if(recsAdded == MAXRECSPERPAGE) {
                if ((error=PF_UnfixPage(fd, pagenum, TRUE))!= PFE_OK) {
                    PF_PrintError("Error in disposing page of mergesortfile");
                    exit(1);
                }
                //-printf("deallocated page %d in create_input_pages\n",pagenum);
                if ((error=PF_AllocPage(fd,&pagenum,&buf))!= PFE_OK) {
                    PF_PrintError("ERROR: failed allocating buffers in create_input_pages\n");
                    exit(1);
                }
                //-printf("allocated page %d in create_input_pages\n",pagenum);
                recsAdded = 0;
                bcopy(&recsAdded, buf, si);
            }
            bcopy(line, buf + si + recsAdded * (ATTRSIZE + si), ATTRSIZE);
            
            totalRecsAdded++;
            bcopy((char*)&totalRecsAdded, buf + si + recsAdded * (ATTRSIZE + si) + ATTRSIZE, si);
            int abc=recsAdded+1;
            bcopy(&abc, buf, si);
            
//            printf("%s ", line);
//            bcopy(buf + si + recsAdded * (ATTRSIZE + si), line, ATTRSIZE);
//            bcopy(buf + si + recsAdded * (ATTRSIZE + si) + ATTRSIZE, (char*)&totalRecsAdded, si);
//            bcopy(buf, &recsAdded, si);
            recsAdded++;
//            printf("%s %d %d\n", line, totalRecsAdded, recsAdded);
            
        }
       //- printf("Totally %d records were added\n", totalRecsAdded);
        fclose ( file );
    }
    else {
        perror ( filename ); /* why didn't the file open? */
    }
    if ((error=PF_UnfixPage(fd, pagenum, TRUE))!= PFE_OK){
        PF_PrintError("Error in disposing page of mergesortfile");
        exit(1);
    }
    //-printf("deallocated page %d in create_input_pages\n", pagenum);
    if ((error=PF_CloseFile(fd))!= PFE_OK) {
        PF_PrintError("Error in closing mergesortfile---");
        exit(1);
    }
    //-printf("mergesortfile closed\n");
    
    
}