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); }
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(); }
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); }
/* 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); }
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"); }