/*
* 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 .
*/
/*************************************************************
*
*
* COMMENTS:
*
*
*
************************************************************/
#include // cout
#include // fopen, perror
#include
#include
#include
#include "qlparser/querytree.hh"
#include "raslib/rminit.hh"
#include "raslib/rmdebug.hh"
#include "adminif.hh"
#include "databaseif.hh"
#include "transactionif.hh"
#include "mddmgr/mddobj.hh"
#include "mddmgr/mddcoll.hh"
#include "mddmgr/mddcolliter.hh"
// init globals for server initialization
RMINITGLOBALS('S')
extern int yyparse();
extern char* myExecArgv0 = "";
extern int globalOptimizationLevel = 4;
extern char* beginParseString;
extern char* iterParseString;
extern int RManDebug;
extern int RManInfo = 0;
extern int rewrite = 0;
extern int loadopt = 0;
extern QueryTree* parseQueryTree;
int checkArguments( int argc, char** argv, const char* searchText, int& optionValueIndex )
{
int found = 0;
int i=1;
while( !found && i ... log is printed to (default: server.log)" << endl;
cout << " -l log is printed to standard out" << endl;
cout << " -d ... debug output is printed to (default: server.dbg)" << endl;
cout << " -d debug output is printed to standard out" << endl;
cout << " -dl n ... debug level is set to n (0-4, default: 0)" << endl;
cout << " - 0 = no / 4 = maximal debug information" << endl;
cout << " -opt n ... maximal optimization level (0-4, default: 4)" << endl;
cout << " - 0 = no / 4 = maximal optimization" << endl;
cout << " -t time test is enabled" << endl;
cout << " -nooutput ... no output of result" << endl;
cout << endl;
return 0;
}
strcpy( baseName, argv[1] );
if( checkArguments( argc, argv, "-l", optionValueIndex ) )
if( optionValueIndex )
{
RMInit::logFileOut.open( argv[optionValueIndex] );
// RMInit::logOut = RMInit::logFileOut;
}
else {
// RMInit::logOut = cout.rdbuf();
}
else
{
// default
RMInit::logFileOut.open("server.log");
// RMInit::logOut = RMInit::logFileOut;
}
if( checkArguments( argc, argv, "-d", optionValueIndex ) )
if( optionValueIndex )
{
RMInit::dbgFileOut.open( argv[optionValueIndex] );
// RMInit::dbgOut = RMInit::dbgFileOut;
}
else {
// RMInit::logOut = cout.rdbuf();
}
else
{
// default
RMInit::dbgFileOut.open("server.dbg");
// RMInit::dbgOut = RMInit::dbgFileOut;
}
if( checkArguments( argc, argv, "-dl", optionValueIndex ) )
if( optionValueIndex )
RManDebug = (int)strtoul( argv[optionValueIndex], (char **)NULL, 10);
if( checkArguments( argc, argv, "-opt", optionValueIndex ) )
if( optionValueIndex )
globalOptimizationLevel = (int)strtoul( argv[optionValueIndex], (char **)NULL, 10);
timeTest = checkArguments( argc, argv, "-t", optionValueIndex );
noOutput = checkArguments( argc, argv, "-nooutput", optionValueIndex );
inFile = fopen( argv[2], "r" );
if( inFile == NULL )
{
cout << "Error opening query file " << argv[2] << endl;
return -1;
}
fread( &query, 1, 4095, inFile );
fclose( inFile );
cout << endl << "Query:" << endl << endl << query << endl;
//
// open database, start transaction
//
// variables representing O2 database, ta and session
DatabaseIf db;
TransactionIf ta;
// don't forget to initialize before using AdminIf!
cout << "Connecting to O2 ..." << flush;
myExecArgv0 = argv[0];
AdminIf* myAdmin = AdminIf::instance();
cout << "OK" << endl;
// connect to the database
cout << "Opening database " << baseName << "... " << flush;
db.open( baseName );
cout << "OK" << endl;
cout << "Starting transaction ... " << flush;
ta.begin(&db);
cout << "OK" << endl;
//
// body of test program
//
beginParseString = query;
iterParseString = query;
parseQueryTree = new QueryTree(); // create a query tree object...
if( timeTest )
gettimeofday (&startTime, &tzp);
RMInit::logOut << "Parsing..." << flush;
if( yyparse() == 0 )
{
RMInit::logOut << "OK" << endl << endl;
parseQueryTree->printTree( 2, RMInit::logOut );
RMInit::logOut << endl;
parseQueryTree->getRoot()->printAlgebraicExpression();
cout << endl << endl;
unsigned int localOptimizationLevel = globalOptimizationLevel < parseQueryTree->getOptimizationLevel() ?
globalOptimizationLevel : parseQueryTree->getOptimizationLevel();
RMInit::logOut << "Optimizing query on level " << localOptimizationLevel << endl;
try
{
parseQueryTree->optimize( localOptimizationLevel );
}
catch( ParseInfo& info )
{
RMInit::logOut << endl << "Optimization Error" << endl;
info.printStatus();
cout << endl;
return 0;
}
RMInit::logOut << endl;
parseQueryTree->printTree( 2, RMInit::logOut );
RMInit::logOut << endl;
parseQueryTree->getRoot()->printAlgebraicExpression( RMInit::logOut );
RMInit::logOut << endl << endl;
RMInit::logOut << "Evaluating... " << flush;
vector* transColl = 0;
try
{
transColl = parseQueryTree->evaluateRetrieval();
}
catch( ParseInfo& info )
{
RMInit::logOut << endl << "Query Execution Error" << endl;
info.printStatus();
cout << endl;
return 0;
}
RMInit::logOut << "OK" << endl << endl;
if( timeTest )
{
gettimeofday(&stopTime, &tzp);
if(startTime.tv_usec > stopTime.tv_usec) {
stopTime.tv_usec += 1000000;
stopTime.tv_sec--;
}
deltaTime.tv_usec = stopTime.tv_usec - startTime.tv_usec;
deltaTime.tv_sec = stopTime.tv_sec - startTime.tv_sec;
cout << "Time for query processing " << deltaTime.tv_sec << " sec " << deltaTime.tv_usec << " msec " << endl;
}
vector::iterator transIter;
int collNum;
collNum = transColl->size();
cout << "The result collection has " << collNum << " entries." << endl;
if( transColl != 0 && !noOutput )
{
int i;
for( transIter = transColl->begin(), i=0; transIter != transColl->end(); transIter++, i++ )
{
QtData* mddObj = *transIter;
cout << endl << " --" << i << ". MDD object in set:" << endl << " ";
mddObj->printStatus();
/*vector* tiles = mddObj->getTiles();
vector::iterator tileIter;
for( tileIter = tiles->begin(); tileIter!=tiles->end(); tileIter++ )
{
cout << endl << " Tile" << endl;
(*tileIter)->printStatus();
}
// delete the Tile elements of the vector and the vector itself
// release( tiles->begin(), tiles->end() );
for( tileIter = tiles->begin(); tileIter!=tiles->end(); tileIter++ )
delete *tileIter;
delete tiles;*/
}
// release dynamic memory for the collection (delete MDDObjs)
// transColl->eraseAll();
delete transColl;
// delete transIter;
};
}
else
RMInit::logOut << " failed" << endl;
delete parseQueryTree;
//
// end of body
//
cout << "Committing transaction ... " << flush;
ta.commit();
cout << "OK" << endl;
cout << "Closing database ..." << flush;
db.close();
cout << "OK" << endl;
cout << "Ending O2 session ..." << endl;
delete myAdmin;
cout << "OK" << endl;
return 0;
}