WiscDB
main.cpp
00001 
00008 #include <vector>
00009 #include "btree.h"
00010 #include "include/page.h"
00011 #include "fileScanner.h"
00012 #include "include/page_iterator.h"
00013 #include "include/file_iterator.h"
00014 #include "exceptions/insufficient_space_exception.h"
00015 #include "exceptions/index_scan_completed_exception.h"
00016 #include "exceptions/file_not_found_exception.h"
00017 #include "exceptions/no_such_key_found_exception.h"
00018 #include "exceptions/bad_scanrange_exception.h"
00019 #include "exceptions/bad_opcodes_exception.h"
00020 #include "exceptions/scan_not_initialized_exception.h"
00021 #include "exceptions/end_of_file_exception.h"
00022 
00023 #define checkPassFail(a, b)                                                                                 \
00024 {                                                                                                                                       \
00025     if(a == b)                                                                                                              \
00026         std::cout << "\nTest passed at line no:" << __LINE__ << "\n";       \
00027     else                                                                                                                            \
00028     {                                                                                                                                   \
00029         std::cout << "\nTest FAILS at line no:" << __LINE__;                        \
00030         std::cout << "\nExpected no of records:" << b;                                  \
00031         std::cout << "\nActual no of records found:" << a;                          \
00032         std::cout << std::endl;                                                                                 \
00033         exit(1);                                                                                                                \
00034     }                                                                                                                                   \
00035 }
00036 
00037 using namespace wiscdb;
00038 
00039 // -----------------------------------------------------------------------------
00040 // Globals
00041 // -----------------------------------------------------------------------------
00042 int testNum = 1;
00043 const std::string relationName = "relA";
00044 //If the relation size is changed then the second parameter 2 chechPassFail may need to be changed to number of record that are expected to be found during the scan, else tests will erroneously be reported to have failed.
00045 const int   relationSize = 5000;
00046 std::string intIndexName, doubleIndexName, stringIndexName;
00047 
00048 // This is the structure for tuples in the base relation
00049 
00050 typedef struct tuple {
00051     int i;
00052     double d;
00053     char s[64];
00054 } RECORD;
00055 
00056 PageFile* file1;
00057 RecordId rid;
00058 RECORD record1;
00059 std::string dbRecord1;
00060 
00061 BufferManager * bufMgr = new BufferManager(100);
00062 
00063 // -----------------------------------------------------------------------------
00064 // Forward declarations
00065 // -----------------------------------------------------------------------------
00066 
00067 void createRelationForward();
00068 void createRelationBackward();
00069 void createRelationRandom();
00070 void intTests();
00071 int intScan(BTreeIndex *index, int lowVal, Operator lowOp, int highVal, Operator highOp);
00072 void indexTests();
00073 void doubleTests();
00074 int doubleScan(BTreeIndex *index, double lowVal, Operator lowOp, double highVal, Operator highOp);
00075 void stringTests();
00076 int stringScan(BTreeIndex *index, int lowVal, Operator lowOp, int highVal, Operator highOp);
00077 void test1();
00078 void test2();
00079 void test3();
00080 void errorTests();
00081 void deleteRelation();
00082 
00083 int main(int argc, char **argv)
00084 {
00085     if( argc != 2 )
00086     {
00087         std::cout << "Expects one argument as a number between 1 to 3 to choose datatype of key.\n";
00088         std::cout << "For INTEGER keys run as: ./wiscdb_main 1\n";
00089         std::cout << "For DOUBLE keys run as: ./wiscdb_main 2\n";
00090         std::cout << "For STRING keys run as: ./wiscdb_main 3\n";
00091         return 0;
00092     }
00093 
00094     sscanf(argv[1],"%d",&testNum);
00095 
00096     switch(testNum)
00097     {
00098         case 1:
00099             std::cout << "leaf size:" << INTARRAYLEAFSIZE << " non-leaf size:" << INTARRAYNONLEAFSIZE << std::endl;
00100             break;
00101         case 2:
00102             std::cout << "leaf size:" << DOUBLEARRAYLEAFSIZE << " non-leaf size:" << DOUBLEARRAYNONLEAFSIZE << std::endl;
00103             break;
00104         case 3:
00105             std::cout << "leaf size:" << STRINGARRAYLEAFSIZE << " non-leaf size:" << STRINGARRAYNONLEAFSIZE << std::endl;
00106             break;
00107     }
00108 
00109 
00110   // Clean up from any previous runs that crashed.
00111   try
00112     {
00113     File::remove(relationName);
00114   }
00115     catch(FileNotFoundException)
00116     {
00117   }
00118 
00119     {
00120         // Create a new database file.
00121         PageFile new_file = PageFile::create(relationName);
00122 
00123         // Allocate some pages and put data on them.
00124         for (int i = 0; i < 20; ++i)
00125         {
00126             PageId new_page_number;
00127             Page new_page = new_file.allocatePage(new_page_number);
00128 
00129         sprintf(record1.s, "%05d string record", i);
00130         record1.i = i;
00131         record1.d = (double)i;
00132         std::string new_data(reinterpret_cast<char*>(&record1), sizeof(record1));
00133 
00134             new_page.insertRecord(new_data);
00135             new_file.writePage(new_page_number, new_page);
00136         }
00137 
00138     }
00139     // new_file goes out of scope here, so file is automatically closed.
00140 
00141     {
00142         FileScanner fscan(relationName, bufMgr);
00143 
00144         try
00145         {
00146             RecordId scanRid;
00147             while(1)
00148             {
00149                 fscan.scanNext(scanRid);
00150                 //Assuming RECORD.i is our key, lets extract the key, which we know is INTEGER and whose byte offset is also know inside the record. 
00151                 std::string recordStr = fscan.getRecord();
00152                 const char *record = recordStr.c_str();
00153                 int key = *((int *)(record + offsetof (RECORD, i)));
00154                 std::cout << "Extracted : " << key << std::endl;
00155             }
00156         }
00157         catch(EndOfFileException e)
00158         {
00159             std::cout << "Read all records" << std::endl;
00160         }
00161     }
00162     // filescanner goes out of scope here, so relation file gets closed.
00163 
00164     File::remove(relationName);
00165 
00166     test1();
00167     test2();
00168     test3();
00169     //errorTests();
00170 
00171   return 1;
00172 }
00173 
00174 void test1()
00175 {
00176     // Create a relation with tuples valued 0 to relationSize and perform index tests 
00177     // on attributes of all three types (int, double, string)
00178     std::cout << "---------------------" << std::endl;
00179     std::cout << "createRelationForward" << std::endl;
00180     createRelationForward();
00181     indexTests();
00182     deleteRelation();
00183 }
00184 
00185 void test2()
00186 {
00187     // Create a relation with tuples valued 0 to relationSize in reverse order and perform index tests 
00188     // on attributes of all three types (int, double, string)
00189     std::cout << "----------------------" << std::endl;
00190     std::cout << "createRelationBackward" << std::endl;
00191     createRelationBackward();
00192     indexTests();
00193     deleteRelation();
00194 }
00195 
00196 void test3()
00197 {
00198     // Create a relation with tuples valued 0 to relationSize in random order and perform index tests 
00199     // on attributes of all three types (int, double, string)
00200     std::cout << "--------------------" << std::endl;
00201     std::cout << "createRelationRandom" << std::endl;
00202     createRelationRandom();
00203     indexTests();
00204     deleteRelation();
00205 }
00206 
00207 // -----------------------------------------------------------------------------
00208 // createRelationForward
00209 // -----------------------------------------------------------------------------
00210 
00211 void createRelationForward()
00212 {
00213     std::vector<RecordId> ridVec;
00214   // destroy any old copies of relation file
00215     try
00216     {
00217         File::remove(relationName);
00218     }
00219     catch(FileNotFoundException e)
00220     {
00221     }
00222 
00223   file1 = new PageFile(relationName, true);
00224 
00225   // initialize all of record1.s to keep purify happy
00226   memset(record1.s, ' ', sizeof(record1.s));
00227     PageId new_page_number;
00228   Page new_page = file1->allocatePage(new_page_number);
00229 
00230   // Insert a bunch of tuples into the relation.
00231   for(int i = 0; i < relationSize; i++ )
00232     {
00233     sprintf(record1.s, "%05d string record", i);
00234     record1.i = i;
00235     record1.d = (double)i;
00236     std::string new_data(reinterpret_cast<char*>(&record1), sizeof(record1));
00237 
00238         while(1)
00239         {
00240             try
00241             {
00242             new_page.insertRecord(new_data);
00243                 break;
00244             }
00245             catch(InsufficientSpaceException e)
00246             {
00247                 file1->writePage(new_page_number, new_page);
00248             new_page = file1->allocatePage(new_page_number);
00249             }
00250         }
00251   }
00252 
00253     file1->writePage(new_page_number, new_page);
00254 }
00255 
00256 // -----------------------------------------------------------------------------
00257 // createRelationBackward
00258 // -----------------------------------------------------------------------------
00259 
00260 void createRelationBackward()
00261 {
00262   // destroy any old copies of relation file
00263     try
00264     {
00265         File::remove(relationName);
00266     }
00267     catch(FileNotFoundException e)
00268     {
00269     }
00270   file1 = new PageFile(relationName, true);
00271 
00272   // initialize all of record1.s to keep purify happy
00273   memset(record1.s, ' ', sizeof(record1.s));
00274     PageId new_page_number;
00275   Page new_page = file1->allocatePage(new_page_number);
00276 
00277   // Insert a bunch of tuples into the relation.
00278   for(int i = relationSize - 1; i >= 0; i-- )
00279     {
00280     sprintf(record1.s, "%05d string record", i);
00281     record1.i = i;
00282     record1.d = i;
00283 
00284     std::string new_data(reinterpret_cast<char*>(&record1), sizeof(RECORD));
00285 
00286         while(1)
00287         {
00288             try
00289             {
00290             new_page.insertRecord(new_data);
00291                 break;
00292             }
00293             catch(InsufficientSpaceException e)
00294             {
00295                 file1->writePage(new_page_number, new_page);
00296             new_page = file1->allocatePage(new_page_number);
00297             }
00298         }
00299   }
00300 
00301     file1->writePage(new_page_number, new_page);
00302 }
00303 
00304 // -----------------------------------------------------------------------------
00305 // createRelationRandom
00306 // -----------------------------------------------------------------------------
00307 
00308 void createRelationRandom()
00309 {
00310   // destroy any old copies of relation file
00311     try
00312     {
00313         File::remove(relationName);
00314     }
00315     catch(FileNotFoundException e)
00316     {
00317     }
00318   file1 = new PageFile(relationName, true);
00319 
00320   // initialize all of record1.s to keep purify happy
00321   memset(record1.s, ' ', sizeof(record1.s));
00322     PageId new_page_number;
00323   Page new_page = file1->allocatePage(new_page_number);
00324 
00325   // insert records in random order
00326 
00327   std::vector<int> intvec(relationSize);
00328   for( int i = 0; i < relationSize; i++ )
00329   {
00330     intvec[i] = i;
00331   }
00332 
00333   long pos;
00334   int val;
00335     int i = 0;
00336   while( i < relationSize )
00337   {
00338     pos = random() % (relationSize-i);
00339     val = intvec[pos];
00340     sprintf(record1.s, "%05d string record", val);
00341     record1.i = val;
00342     record1.d = val;
00343 
00344     std::string new_data(reinterpret_cast<char*>(&record1), sizeof(RECORD));
00345 
00346         while(1)
00347         {
00348             try
00349             {
00350             new_page.insertRecord(new_data);
00351                 break;
00352             }
00353             catch(InsufficientSpaceException e)
00354             {
00355         file1->writePage(new_page_number, new_page);
00356             new_page = file1->allocatePage(new_page_number);
00357             }
00358         }
00359 
00360         int temp = intvec[relationSize-1-i];
00361         intvec[relationSize-1-i] = intvec[pos];
00362         intvec[pos] = temp;
00363         i++;
00364   }
00365   
00366     file1->writePage(new_page_number, new_page);
00367 }
00368 
00369 // -----------------------------------------------------------------------------
00370 // indexTests
00371 // -----------------------------------------------------------------------------
00372 
00373 void indexTests()
00374 {
00375   if(testNum == 1)
00376   {
00377     intTests();
00378         try
00379         {
00380             File::remove(intIndexName);
00381         }
00382     catch(FileNotFoundException e)
00383     {
00384     }
00385   }
00386   else if(testNum == 2)
00387   {
00388     doubleTests();
00389         try
00390         {
00391             File::remove(doubleIndexName);
00392         }
00393     catch(FileNotFoundException e)
00394     {
00395     }
00396   }
00397   else if(testNum == 3)
00398   {
00399     stringTests();
00400         try
00401         {
00402             File::remove(stringIndexName);
00403         }
00404     catch(FileNotFoundException e)
00405     {
00406     }
00407   }
00408 }
00409 
00410 // -----------------------------------------------------------------------------
00411 // intTests
00412 // -----------------------------------------------------------------------------
00413 
00414 void intTests()
00415 {
00416   std::cout << "Create a B+ Tree index on the integer field" << std::endl;
00417   BTreeIndex index(relationName, intIndexName, bufMgr, offsetof(tuple,i), INTEGER);
00418 
00419     // run some tests
00420     checkPassFail(intScan(&index,25,GT,40,LT), 14)
00421     checkPassFail(intScan(&index,20,GTE,35,LTE), 16)
00422     checkPassFail(intScan(&index,-3,GT,3,LT), 3)
00423     checkPassFail(intScan(&index,996,GT,1001,LT), 4)
00424     checkPassFail(intScan(&index,0,GT,1,LT), 0)
00425     checkPassFail(intScan(&index,300,GT,400,LT), 99)
00426     checkPassFail(intScan(&index,3000,GTE,4000,LT), 1000)
00427 }
00428 
00429 int intScan(BTreeIndex * index, int lowVal, Operator lowOp, int highVal, Operator highOp)
00430 {
00431   RecordId scanRid;
00432     Page *curPage;
00433 
00434   std::cout << "Scan for ";
00435   if( lowOp == GT ) { std::cout << "("; } else { std::cout << "["; }
00436   std::cout << lowVal << "," << highVal;
00437   if( highOp == LT ) { std::cout << ")"; } else { std::cout << "]"; }
00438   std::cout << std::endl;
00439 
00440   int numResults = 0;
00441     
00442     try
00443     {
00444     index->startScan(&lowVal, lowOp, &highVal, highOp);
00445     }
00446     catch(NoSuchKeyFoundException e)
00447     {
00448     std::cout << "No Key Found satisfying the scan criteria." << std::endl;
00449         return 0;
00450     }
00451 
00452     while(1)
00453     {
00454         try
00455         {
00456             index->scanNext(scanRid);
00457             bufMgr->readPage(file1, scanRid.page_number, curPage);
00458             RECORD myRec = *(reinterpret_cast<const RECORD*>(curPage->getRecord(scanRid).data()));
00459             bufMgr->unPinPage(file1, scanRid.page_number, false);
00460 
00461             if( numResults < 5 )
00462             {
00463                 std::cout << "at:" << scanRid.page_number << "," << scanRid.slot_number;
00464                 std::cout << " -->:" << myRec.i << ":" << myRec.d << ":" << myRec.s << ":" <<std::endl;
00465             }
00466             else if( numResults == 5 )
00467             {
00468                 std::cout << "..." << std::endl;
00469             }
00470         }
00471         catch(IndexScanCompletedException e)
00472         {
00473             break;
00474         }
00475 
00476         numResults++;
00477     }
00478 
00479   if( numResults >= 5 )
00480   {
00481     std::cout << "Number of results: " << numResults << std::endl;
00482   }
00483   index->endScan();
00484   std::cout << std::endl;
00485 
00486     return numResults;
00487 }
00488 
00489 // -----------------------------------------------------------------------------
00490 // doubleTests
00491 // -----------------------------------------------------------------------------
00492 
00493 void doubleTests()
00494 {
00495   std::cout << "Create a B+ Tree index on the double field" << std::endl;
00496   BTreeIndex index(relationName, doubleIndexName, bufMgr, offsetof(tuple,d), DOUBLE);
00497 
00498     // run some tests
00499     checkPassFail(doubleScan(&index,25,GT,40,LT), 14)
00500     checkPassFail(doubleScan(&index,20,GTE,35,LTE), 16)
00501     checkPassFail(doubleScan(&index,-3,GT,3,LT), 3)
00502     checkPassFail(doubleScan(&index,996,GT,1001,LT), 4)
00503     checkPassFail(doubleScan(&index,0,GT,1,LT), 0)
00504     checkPassFail(doubleScan(&index,300,GT,400,LT), 99)
00505     checkPassFail(doubleScan(&index,3000,GTE,4000,LT), 1000)
00506 }
00507 
00508 int doubleScan(BTreeIndex * index, double lowVal, Operator lowOp, double highVal, Operator highOp)
00509 {
00510   RecordId scanRid;
00511     Page *curPage;
00512 
00513   std::cout << "Scan for ";
00514   if( lowOp == GT ) { std::cout << "("; } else { std::cout << "["; }
00515   std::cout << lowVal << "," << highVal;
00516   if( highOp == LT ) { std::cout << ")"; } else { std::cout << "]"; }
00517   std::cout << std::endl;
00518 
00519   int numResults = 0;
00520 
00521     try
00522     {
00523     index->startScan(&lowVal, lowOp, &highVal, highOp);
00524     }
00525     catch(NoSuchKeyFoundException e)
00526     {
00527     std::cout << "No Key Found satisfying the scan criteria." << std::endl;
00528         return 0;
00529     }
00530 
00531     while(1)
00532     {
00533         try
00534         {
00535             index->scanNext(scanRid);
00536             bufMgr->readPage(file1, scanRid.page_number, curPage);
00537             RECORD myRec = *(reinterpret_cast<const RECORD*>(curPage->getRecord(scanRid).data()));
00538             bufMgr->unPinPage(file1, scanRid.page_number, false);
00539 
00540             if( numResults < 5 )
00541             {
00542                 std::cout << "rid:" << scanRid.page_number << "," << scanRid.slot_number;
00543                 std::cout << " -->:" << myRec.i << ":" << myRec.d << ":" << myRec.s << ":" <<std::endl;
00544             }
00545             else if( numResults == 5 )
00546             {
00547                 std::cout << "..." << std::endl;
00548             }
00549         }
00550         catch(IndexScanCompletedException e)
00551         {
00552             break;
00553         }
00554 
00555         numResults++;
00556     }
00557 
00558   if( numResults >= 5 )
00559   {
00560     std::cout << "Number of results: " << numResults << std::endl;
00561   }
00562   index->endScan();
00563   std::cout << std::endl;
00564 
00565     return numResults;
00566 }
00567 
00568 // -----------------------------------------------------------------------------
00569 // stringTests
00570 // -----------------------------------------------------------------------------
00571 
00572 void stringTests()
00573 {
00574   std::cout << "Create a B+ Tree index on the string field" << std::endl;
00575   BTreeIndex index(relationName, stringIndexName, bufMgr, offsetof(tuple,s), STRING);
00576 
00577     // run some tests
00578     checkPassFail(stringScan(&index,25,GT,40,LT), 14)
00579     checkPassFail(stringScan(&index,20,GTE,35,LTE), 16)
00580     checkPassFail(stringScan(&index,-3,GT,3,LT), 3)
00581     checkPassFail(stringScan(&index,996,GT,1001,LT), 4)
00582     checkPassFail(stringScan(&index,0,GT,1,LT), 0)
00583     checkPassFail(stringScan(&index,300,GT,400,LT), 99)
00584     checkPassFail(stringScan(&index,3000,GTE,4000,LT), 1000)
00585 }
00586 
00587 int stringScan(BTreeIndex * index, int lowVal, Operator lowOp, int highVal, Operator highOp)
00588 {
00589   RecordId scanRid;
00590     Page *curPage;
00591 
00592   std::cout << "Scan for ";
00593   if( lowOp == GT ) { std::cout << "("; } else { std::cout << "["; }
00594   std::cout << lowVal << "," << highVal;
00595   if( highOp == LT ) { std::cout << ")"; } else { std::cout << "]"; }
00596   std::cout << std::endl;
00597 
00598   char lowValStr[100];
00599   sprintf(lowValStr,"%05d string record",lowVal);
00600   char highValStr[100];
00601   sprintf(highValStr,"%05d string record",highVal);
00602 
00603   int numResults = 0;
00604 
00605     try
00606     {
00607     index->startScan(lowValStr, lowOp, highValStr, highOp);
00608     }
00609     catch(NoSuchKeyFoundException e)
00610     {
00611     std::cout << "No Key Found satisfying the scan criteria." << std::endl;
00612         return 0;
00613     }
00614 
00615     while(1)
00616     {
00617         try
00618         {
00619             index->scanNext(scanRid);
00620             bufMgr->readPage(file1, scanRid.page_number, curPage);
00621             RECORD myRec = *(reinterpret_cast<const RECORD*>(curPage->getRecord(scanRid).data()));
00622             bufMgr->unPinPage(file1, scanRid.page_number, false);
00623 
00624             if( numResults < 5 )
00625             {
00626                 std::cout << "rid:" << scanRid.page_number << "," << scanRid.slot_number;
00627                 std::cout << " -->:" << myRec.i << ":" << myRec.d << ":" << myRec.s << ":" <<std::endl;
00628             }
00629             else if( numResults == 5 )
00630             {
00631                 std::cout << "..." << std::endl;
00632             }
00633         }
00634         catch(IndexScanCompletedException e)
00635         {
00636             break;
00637         }
00638 
00639         numResults++;
00640     }
00641 
00642   if( numResults >= 5 )
00643   {
00644     std::cout << "Number of results: " << numResults << std::endl;
00645   }
00646   index->endScan();
00647   std::cout << std::endl;
00648 
00649     return numResults;
00650 }
00651 
00652 // -----------------------------------------------------------------------------
00653 // errorTests
00654 // -----------------------------------------------------------------------------
00655 
00656 void errorTests()
00657 {
00658     std::cout << "Error handling tests" << std::endl;
00659     std::cout << "--------------------" << std::endl;
00660     // Given error test
00661 
00662     try
00663     {
00664         File::remove(relationName);
00665     }
00666     catch(FileNotFoundException e)
00667     {
00668     }
00669 
00670   file1 = new PageFile(relationName, true);
00671     
00672   // initialize all of record1.s to keep purify happy
00673   memset(record1.s, ' ', sizeof(record1.s));
00674     PageId new_page_number;
00675   Page new_page = file1->allocatePage(new_page_number);
00676 
00677   // Insert a bunch of tuples into the relation.
00678     for(int i = 0; i <10; i++ ) 
00679     {
00680     sprintf(record1.s, "%05d string record", i);
00681     record1.i = i;
00682     record1.d = (double)i;
00683     std::string new_data(reinterpret_cast<char*>(&record1), sizeof(record1));
00684 
00685         while(1)
00686         {
00687             try
00688             {
00689             new_page.insertRecord(new_data);
00690                 break;
00691             }
00692             catch(InsufficientSpaceException e)
00693             {
00694                 file1->writePage(new_page_number, new_page);
00695             new_page = file1->allocatePage(new_page_number);
00696             }
00697         }
00698   }
00699 
00700     file1->writePage(new_page_number, new_page);
00701 
00702   BTreeIndex index(relationName, intIndexName, bufMgr, offsetof(tuple,i), INTEGER);
00703     
00704     int int2 = 2;
00705     int int5 = 5;
00706 
00707     // Scan Tests
00708     std::cout << "Call endScan before startScan" << std::endl;
00709     try
00710     {
00711         index.endScan();
00712         std::cout << "ScanNotInitialized Test 1 Failed." << std::endl;
00713     }
00714     catch(ScanNotInitializedException e)
00715     {
00716         std::cout << "ScanNotInitialized Test 1 Passed." << std::endl;
00717     }
00718     
00719     std::cout << "Call scanNext before startScan" << std::endl;
00720     try
00721     {
00722         RecordId foo;
00723         index.scanNext(foo);
00724         std::cout << "ScanNotInitialized Test 2 Failed." << std::endl;
00725     }
00726     catch(ScanNotInitializedException e)
00727     {
00728         std::cout << "ScanNotInitialized Test 2 Passed." << std::endl;
00729     }
00730     
00731     std::cout << "Scan with bad lowOp" << std::endl;
00732     try
00733     {
00734     index.startScan(&int2, LTE, &int5, LTE);
00735         std::cout << "BadOpcodesException Test 1 Failed." << std::endl;
00736     }
00737     catch(BadOpcodesException e)
00738     {
00739         std::cout << "BadOpcodesException Test 1 Passed." << std::endl;
00740     }
00741     
00742     std::cout << "Scan with bad highOp" << std::endl;
00743     try
00744     {
00745     index.startScan(&int2, GTE, &int5, GTE);
00746         std::cout << "BadOpcodesException Test 2 Failed." << std::endl;
00747     }
00748     catch(BadOpcodesException e)
00749     {
00750         std::cout << "BadOpcodesException Test 2 Passed." << std::endl;
00751     }
00752 
00753 
00754     std::cout << "Scan with bad range" << std::endl;
00755     try
00756     {
00757     index.startScan(&int5, GTE, &int2, LTE);
00758         std::cout << "BadScanrangeException Test 1 Failed." << std::endl;
00759     }
00760     catch(BadScanrangeException e)
00761     {
00762         std::cout << "BadScanrangeException Test 1 Passed." << std::endl;
00763     }
00764 
00765     deleteRelation();
00766 }
00767 
00768 void deleteRelation()
00769 {
00770     if(file1)
00771     {
00772         bufMgr->flushFile(file1);
00773         delete file1;
00774         file1 = NULL;
00775     }
00776     try
00777     {
00778         File::remove(relationName);
00779     }
00780     catch(FileNotFoundException e)
00781     {
00782     }
00783 }
 All Classes Namespaces Functions Variables Typedefs Enumerations Friends