/* * This file is part of rasdaman community. * * Rasdaman community is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Rasdaman community is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . */ /**************************************************************************** * * * PURPOSE: * accesses data from a RasDaMan database according to the options * specified in an input file. Optionally outputs timing and size * information. * * DESCRIPTION: * test_access reads from a text file a database name, and mddcolls * names and for each one of them, it either reads a PersMDDColl and * prints the status of all the mddobjs it contains (or part of them) * or it deletes the MDDObjs. * The program is able to print the tiles contents, show the accessing * time and the sizes of each MDDObject. * The input file has to start with the line: * 'Database: ' * and after it, for every MDDCollection, the line: * 'MDDColl: ' * which can be followed by the line: * ' intersect: ' * or by the line: * ' pointQuery: ' * in this case, the cell with address equal to the origin of the * tile is accessed. * which causes printing only the status of the mddobjs which * intersect with . * Options and arguments are described in the printUsage( ) function. * * Example input file : * Database: SMRasDaBase * MDDColl: Images2DA * intersect: [0:29,9:19] * MDDColl: Toms3DA * * * COMMENTS: * In this version, the -r option deletes whole collections only. * To be extended in the future to delete selected objects and/or * selected parts of objects. * ***************************************************************************/ #ifdef EARLY_TEMPLATE #define __EXECUTABLE__ #ifdef __GNUG__ #include "server/template_inst.hh" #endif #endif #include #include #include #include #include #ifdef BASEDB_O2 #include "o2template_CC.hxx" // declaration of O2 ref and coll classes #endif #include "raslib/rminit.hh" #include "raslib/rmdebug.hh" #include "typefactory.hh" #include "ulongtype.hh" // from the catalogif base DBMS interface module #include "mddmgr/persmddcoll.hh" #include "mddmgr/persmddobj.hh" #include "mddmgr/persmddcolliter.hh" #include "adminif.hh" #include "databaseif.hh" #include "transactionif.hh" #include "compression/tilecompression.hh" extern char* myExecArgv0 = ""; RMINITGLOBALS('C') #define MAX 256 ifstream testfile; void testAccessing( char* persMDDCollName, char* search, int printTilesContents, int timeAccess, int printSizes, int printCompression ); void intersectOption( char* search, PersMDDColl* accessedColl, int printTilesContents, int timeAccess, int printSizes ); void pointQueryOption( char* search, PersMDDColl* accessedColl, int timeAccess, int printSizes ); void testDeleteColls( DatabaseIf* db, char* persMDDCollName, char* search, int timeAccess, int printSizes ); int checkArguments( int argc, char** argv, const char* searchText, int& optionValueIndex ); void printUsage( ); /********************************************************************** * Function name.: int main (int argc, char** argv) * * Arguments.....: * argc: number of arguments given to program * argv: array of char* with arguments * Return value..: exit status * Description...: none **********************************************************************/ int main( int argc, char** argv) { // variables representing O2 database, test file, ta and session DatabaseIf database; TransactionIf ta; // static char O2BenchSchemaName[] = "SMRasDaSchema"; static char O2BenchDBName[MAX]; char mc_name[MAX],search[MAX]; int printTilesContents = 0; int timeAccess = 0; int printSizes = 0; int printCompression = 0; int deleteColls = 0; int i, optionValueIndex; // don't forget to initialize before using AdminIf! myExecArgv0 = argv[0]; AdminIf* myAdmin = AdminIf::instance(); // is help is needed if (checkArguments (argc, argv, "-h", optionValueIndex)) { printUsage( ); delete myAdmin; exit( 0 ); } // openning the test file if (checkArguments (argc, argv, "-f", optionValueIndex)) { for (i = 0; argv[optionValueIndex][i+1] != '\0'; i++) search[i] = argv[optionValueIndex][i+2]; testfile.open (search); if (!testfile) { cout << "cannot open this file" << endl; return 1; } } else printUsage( ); /* { cout << "Please write: test_access -f" << endl; cout << "Or maybe: test_access -h for help...." << endl; return 1; } */ // updating the flag of printing the tiles if (checkArguments (argc, argv, "-p", optionValueIndex)) printTilesContents = 1; // updating the flag of timming the access if (checkArguments (argc, argv, "-t", optionValueIndex)) timeAccess = 1; // updating the flag of printing the sizes of mddobjs if (checkArguments (argc, argv, "-s", optionValueIndex)) printSizes = 1; // updating the flag of deletion if (checkArguments (argc, argv, "-r", optionValueIndex)) deleteColls = 1; // updating the flag of compression if (checkArguments (argc, argv, "-c", optionValueIndex)) printCompression = 1; // reading data-base name testfile.getline (search, MAX, ':'); while ((!strstr (search, "Database")) && (!testfile.eof ( ))) testfile.getline (search, MAX, ':'); testfile >> O2BenchDBName; // connect to the database cout << "Connecting to database " << O2BenchDBName << "..." << endl; database.open (O2BenchDBName); // searching for mddcalls testfile.getline (search, MAX, ':'); while (!testfile.eof ( )) { ta.begin ( &database ); // searching for mddcall while ((!strstr (search, "MDDColl")) && (!testfile.eof ( ))) testfile.getline (search, MAX, ':'); if (strstr (search, "MDDColl")) { testfile >> mc_name; testfile.getline (search, MAX, ':'); if (!deleteColls) testAccessing (mc_name, search, printTilesContents, timeAccess, printSizes, printCompression); else testDeleteColls(&database, mc_name, search, timeAccess, printSizes); } ta.commit( ); } cout << endl<< "Ending O2 session..." << endl; database.close( ); testfile.close( ); delete myAdmin; } /********************************************************************** * Function......: * testAccessing( char* persMDDCollName, char* search, * int printTilesContents, int timeAccess, * int printSizes) * Arguments.....: * persMDDCollName: the MDDColl name * search: for searching the words from the file * printTilesContents: the flag of printing the tiles * timeAccess: the flag of timming the access * Return value..: none * Description...: reads DirTilesIx's and shows contents **********************************************************************/ void testAccessing( char* persMDDCollName, char* search, int printTilesContents, int timeAccess, int printSizes, int printCompression) { PersMDDObj* accessedObj; PersMDDColl* accessedColl; cout << endl << endl << "....testAccessing " << persMDDCollName << endl; try { accessedColl = new PersMDDColl(persMDDCollName); } catch(...) { cout << " Error: exception caught when trying to access collection "; cout << endl; return; } // To test PersMDDColl::printStatus( ) // accessedColl->printStatus( ); // To test PersMDDObj::printStatus( ), MDDCollIter::createIterator( ) and // MDDCollIter methods : // cout << " Iterating through the collection with PersMDDCollIter " << endl; // MDDCollIter* objsIt = accessedColl->createIterator( ); // the regular option of showing the contents if ((strstr (search, "MDDColl")) || (testfile.eof ( ))) { cout << " Iterating through the collection with PersMDDCollIter " << endl; MDDCollIter* objsIt = accessedColl->createIterator( ); for( int i = 1 ; objsIt->notDone( ); i++, objsIt->advance( )) { accessedObj = (PersMDDObj*) objsIt->getElement(); cout << endl << endl << " --" << i << ". MDD object in set:" << endl; if (printTilesContents && timeAccess) { vector* TileVector; // start counter RMInit::dbgOut.rdbuf(cout.rdbuf()); RMTimer* Counter = new RMTimer("PersMDDObj", "getTiles"); TileVector = accessedObj->getTiles ( ); // stop counter cout << "The time of accessing by "; delete Counter; vector ::iterator t; for (t = TileVector->begin ( ); t != TileVector->end ( ); t++) { (*t)->printStatus( ); cout << endl; } TileVector->erase( TileVector->begin(), TileVector->end() ); delete TileVector; } else if (printTilesContents && !timeAccess) { vector* TileVector; TileVector = accessedObj->getTiles ( ); vector ::iterator t; for (t = TileVector->begin ( ); t != TileVector->end ( ); t++) { (*t)->printStatus( ); cout << endl; } TileVector->erase( TileVector->begin(), TileVector->end() ); delete TileVector; } else if (!printTilesContents && timeAccess) { // start counter RMInit::dbgOut.rdbuf(cout.rdbuf()); RMTimer* Counter = new RMTimer("PersMDDObj", "printStatus"); accessedObj->printStatus ( ); // stop counter cout << endl << "The time of accessing by "; delete Counter; } else if (!printTilesContents && !timeAccess) { accessedObj->printStatus ( ); } if (printSizes) { // printing the sizes of the mddobj cout << endl << "The logical-size of the mddobj: " << accessedObj->getLogicalSize ( ) << endl; cout << "The physical-size of the mddobj: " << accessedObj->getPhysicalSize ( ) << endl; cout << "The physical-cells-size of the mddobj: " << accessedObj->getPhysicalCellsSize ( ) << endl; cout << "The index-size of the mddobj: " << accessedObj->getIxSize ( ) << endl; } if (printCompression) { int i = 0; unsigned long totalSize = 0; vector* TileVector; TileVector = accessedObj->getTiles ( ); vector ::iterator t; for (t = TileVector->begin ( ); t != TileVector->end ( ); t++) { cout << ++i << ". "; if( (*t)->getDataFormat() == r_ZLib ) { totalSize += (*t)->getPhysicalSize( ); cout << "Size of compressed tile: " << (*t)->getPhysicalSize( ) << endl; } else { cout << "Tile not compressed! Size: " << (*t)->getSize() << endl; } } TileVector->erase( TileVector->begin(), TileVector->end() ); delete TileVector; if(totalSize != 0) cout << "Total size of compressed tiles: " << totalSize << endl; } } // for objsIt loop delete objsIt; } // if MDDColl // the intersect option else if (strstr (search, "intersect")) { intersectOption( search, accessedColl, printTilesContents, timeAccess, printSizes); } else if (strstr (search, "pointQuery")) { pointQueryOption( search, accessedColl, timeAccess, printSizes); } else { cout << "don't know what is this..." << endl; testfile.getline (search, MAX, ':'); } accessedColl->releaseAll( ); delete accessedColl; } void intersectOption( char* search, PersMDDColl* accessedColl, int printTilesContents, int timeAccess, int printSizes ) { PersMDDObj* accessedObj; int cont = 1; for ( ; cont == 1 ; ) // intersect loop { testfile.get (search, MAX, '['); testfile.getline (search, MAX, ']'); strcat (search, "]"); cout << " Iterating through the collection with PersMDDCollIter " << endl; MDDCollIter* objsIt = accessedColl->createIterator( ); for( int i = 1 ; objsIt->notDone( ); i++, objsIt->advance( )) { accessedObj = (PersMDDObj*) objsIt->getElement(); cout << endl << endl << " --" << i << ". MDD object in set:" << endl; r_Minterval interval (search); cout << "Intersecting to "<< interval << endl; vector* TileVector; vector ::iterator t; RMTimer* Counter; if ( timeAccess ) { // start counter // RMInit::dbgOut = cout.rdbuf(); RMInit::bmOut << "Intersect Region " << interval << " " << "\t"; // Counter = new RMTimer(" PersMDDObj", "intersect"); } TileVector = accessedObj->intersect (interval); if ( printTilesContents ) { int j = 1; for (t = TileVector->begin ( ); t != TileVector->end ( ); t++, j++) { cout << "Tile "<< j <<": "<printStatus( ); cout << endl; } } else { int j = 1; for (t = TileVector->begin ( ); t != TileVector->end ( ); t++, j++) cout << "Tile " << j << ": " << (*t)->getDomain ( ) << endl; } // ?? TileVector->erase( ); delete TileVector; if (printSizes) { // printing the sizes of the mddobj cout << endl << "The logical-size of the mddobj: " << accessedObj->getLogicalSize ( ) << endl; cout << "The physical-size of the mddobj: " << accessedObj->getPhysicalSize ( ) << endl; cout << "The physical-cells-size of the mddobj: " << accessedObj->getPhysicalCellsSize ( ) << endl; cout << "The index-size of the mddobj: " << accessedObj->getIxSize ( ) << endl; } } // for objsIt loop delete objsIt; testfile.getline (search, MAX, ':'); cout << search << endl; if ( !strstr( search, "intersect") ) cont = 0; // cout << " cont "<< cont << endl; } // for cont loop } void pointQueryOption( char* search, PersMDDColl* accessedColl, int timeAccess, int printSizes ) { PersMDDObj* accessedObj; int cont = 1; for ( ; cont == 1 ; ) // intersect loop { testfile.get (search, MAX, '['); testfile.getline (search, MAX, ']'); strcat (search, "]"); cout << " Iterating through the collection with PersMDDCollIter " << endl; MDDCollIter* objsIt = accessedColl->createIterator( ); for( int i = 1 ; objsIt->notDone( ); i++, objsIt->advance( )) { accessedObj = (PersMDDObj*) objsIt->getElement(); cout << endl << endl << " --" << i << ". MDD object in set:" << endl; r_Minterval interval (search); r_Point pnt = interval.get_origin( ); cout << "Point query to "<< pnt << endl; RMTimer* Counter; if ( timeAccess ) { // start counter RMInit::bmOut << "Intersect Region " << interval << " " << "\t"; // Counter = new RMTimer(" PersMDDObj", "intersect"); } char* result = accessedObj->pointQuery(pnt); if ( result ) cout << "Result of point query : "<< long(*result) <getLogicalSize ( ) << endl; cout << "The physical-size of the mddobj: " << accessedObj->getPhysicalSize ( ) << endl; cout << "The physical-cells-size of the mddobj: " << accessedObj->getPhysicalCellsSize ( ) << endl; cout << "The index-size of the mddobj: " << accessedObj->getIxSize ( ) << endl; } } // for objsIt loop delete objsIt; testfile.getline (search, MAX, ':'); cout << search << endl; if ( !strstr( search, "pointQuery") ) cont = 0; // cout << " cont "<< cont << endl; } // for cont loop } /********************************************************************** * Function......: * testDeleteColls( DatabaseIf* db, char* persMDDCollName, * char* search, int timeAccess,int printSizes ) * * Arguments.....: * persMDDCollName: the MDDColl name * search: for searching the words from the file * printTilesContents: the flag of printing the tiles * timeAccess: the flag of timming the access * Return value..: none * Description...: reads DirTilesIx's and shows contents **********************************************************************/ void testDeleteColls( DatabaseIf* db, char* persMDDCollName, char* search, int timeAccess, int printSizes) { // PersMDDObj* accessedObj; PersMDDColl* accessedColl; /* cout << endl << endl << "... Destroying root collection " << persMDDCollName << endl; PersMDDColl::destroyRoot( persMDDCollName, db ); */ cout << endl << endl << "....testAccessing " << persMDDCollName << endl; try { accessedColl = new PersMDDColl( persMDDCollName ); } catch(...) { cout << " Error: exception caught when trying to access collection "; cout << endl; return; } accessedColl->removeAll( ); accessedColl->releaseAll( ); cout << endl << endl << "... Destroying root collection " << persMDDCollName << endl; PersMDDColl::destroyRoot( persMDDCollName, db ); } /********************************************************************** * Function......: checkArguments (int argc, char** argv, * const char* searchText, * int& optionValueIndex) * * Arguments.....: * argc: number of arguments given to program * argv: array of char* with arguments * searchText: the desire option * optionValueIndex: the index of the found option * Return value..: int * Description...: searching an option in the accexuting line **********************************************************************/ int checkArguments (int argc, char** argv, const char* searchText, int& optionValueIndex) { int found = 0; int i = 1; while (!found && i < argc) { found = !strncmp (searchText, argv[i], 2); if (!found) i++; } if (found) optionValueIndex = i; else optionValueIndex = 0; return found; } void printUsage( ) { cout << endl << "Usage: " << endl; cout << "test_access -h" << endl; cout << "test_access -f [-t] [-p] [-s]" << endl; cout << "test_access -f -r " << endl; cout << " -h ... this help" << endl; cout << " -p ... for printing tiles contents" << endl; cout << " -t ... for timming the access" << endl; cout << " -s ... for printing the sizes of mddobjs" << endl; cout << " -f ... for the name of the text file" << endl; cout << " -r ... for deleting the collections listed in " << endl; cout << " -c ... for printing info on compressed tiles"; cout << endl << endl; }