/*
* 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 .
/
/**
* SOURCE: system_query.cc
*
* MODULE: rasodmg/test
*
* COMMENTS:
* None
*/
static const char rcsid[] = "@(#)rasodmg/test,SystemQuery: $Id: system_query.cc,v 1.11 2002/07/30 07:16:23 hoefner Exp $";
#ifdef EARLY_TEMPLATE
#define __EXECUTABLE__
#include "raslib/template_inst.hh"
#endif
#include
#include "system_query.hh"
#include "raslib/complex.hh"
#include "raslib/structure.hh"
#include "raslib/primitive.hh"
#include "raslib/primitivetype.hh"
#include "rasodmg/oqlquery.hh"
#include "rasodmg/storagelayout.hh"
int
main(int argc, char** argv)
{
SystemBasic::usageHeader = "system_compare version 0.9\n\t\tProgram for executing queries against RasDaMan\n";
SystemBasic::usageFooter = "Required information:\n\t\tQuery file\n";
int retval = 0;
try {
retval = SystemQuery::doStuff(argc, argv);
}
catch (r_Error& e)
{
cout << "Caught Exception at top level: " << e.get_errorno() << " " << e.what() << endl;
}
}
int
SystemQuery::doStuff(int argc, char** argv)
{
installSignalHandlers();
int retval = 0;
retval = parseParams(argc, argv);
if (retval == 0)
{
if (fileName)
{
r_Storage_Layout* stl = 0;
db.set_servername(serverName);
db.set_useridentification(userName, passwd);
try {
db.open(baseName);
FILE* filePointer = checkFile(fileName, retval);
if (retval != 0)
return retval;
size_t dataSize = 0;
char* data = getData(filePointer, dataSize, retval);
if(retval != 0)
return retval;
char* myQuery = new char[dataSize + 1];
memcpy(myQuery, data, dataSize);
delete data;
data = 0;
myQuery[dataSize - 1] = '\0';
RMInit::logOut << "Query " << myQuery << endl;
r_OQL_Query q1(myQuery);
RMInit::logOut << "OQL " << q1.get_query() << endl;
if (q1.is_update_query())
{
cout << "Starting Update Transaction" << endl;
ta.begin();
db.set_storage_format(storageFormat, storageFormatParams);
db.set_transfer_format(transferFormat, transferFormatParams);
if (retval == 0)
{
try {
RMDBGIF(20, RMDebug::module_tools, "WAITBEFOREQL", \
RMInit::dbgOut << "Waiting 100 sec before query\n" << std::endl; \
sleep(100); \
RMInit::dbgOut << "Continue now\n" << std::endl; );
r_oql_execute(q1);
RMDBGIF(20, RMDebug::module_tools, "WAITAFTERQL", \
RMInit::dbgOut << "Waiting 100 sec before query\n" << std::endl; \
sleep(100); \
RMInit::dbgOut << "Continue now\n" << std::endl; );
}
catch (r_Error& errorObj)
{
cout << "FAILED" << endl << errorObj.what() << endl;
ta.abort();
retval = EXCEPTIONEXECUTEQUERY;
}
}
if (retval == 0)
ta.commit();
}
else {
cout << "Starting Read Only Transaction ... "; cout.flush();
ta.begin(r_Transaction::read_only);
db.set_storage_format(storageFormat, storageFormatParams);
db.set_transfer_format(transferFormat, transferFormatParams);
cout << "OK" << endl;
r_Set< r_Ref_Any > result_set;
cout << "Executing query ... "; cout.flush();
try {
RMDBGIF(20, RMDebug::module_tools, "WAITBEFOREQL", \
RMInit::dbgOut << "Waiting 100 sec before query\n" << std::endl; \
sleep(100); \
RMInit::dbgOut << "Continue now\n" << std::endl; );
r_oql_execute(q1, result_set);
RMDBGIF(20, RMDebug::module_tools, "WAITAFTERQL", \
RMInit::dbgOut << "Waiting 100 sec before query\n" << std::endl; \
sleep(100); \
RMInit::dbgOut << "Continue now\n" << std::endl; );
}
catch(r_Error& errorObj)
{
cout << "FAILED" << endl << errorObj.what() << endl;
ta.abort();
retval = EXCEPTIONEXECUTEQUERY;
}
if (retval == 0)
{
cout << "OK" << endl;
cout << "Collection" << endl;
cout << " Oid...................: " << result_set.get_oid() << endl;
cout << " Type Structure........: " << (result_set.get_type_structure() ? result_set.get_type_structure() : "") << endl;
cout << " Type Schema...........: " << flush;
if (result_set.get_type_schema())
result_set.get_type_schema()->print_status(cout);
else
cout << "" << flush;
cout << endl;
cout << " Number of entries.....: " << result_set.cardinality() << endl;
cout << " Element Type Schema...: " << flush;
if (result_set.get_element_type_schema())
result_set.get_element_type_schema()->print_status(cout);
else
cout << "" << flush;
cout << endl;
if (testBed)
{
cout << "-- Testbed line: result_type=" << result_set.get_type_structure() << endl;
cout << "-- Testbed line: result_elements=" << result_set.cardinality() << endl;
cout << endl;
}
r_Iterator< r_Ref_Any > iter = result_set.create_iterator();
cout << endl;
if (testBed)
cout << "-- Testbed start block:" << endl;
for (int i=1 ; iter.not_done(); iter++, i++)
{
switch (result_set.get_element_type_schema()->type_id())
{
case r_Type::MARRAYTYPE:
{
const char *defExt=NULL;
r_Data_Format mafmt = r_Ref(*iter)->get_current_format();
r_Data_Format tmpfmt = r_Data_Format_NUMBER;
if(outputFormat)
tmpfmt = outputFormat;
else
tmpfmt = mafmt;
// special treatment only for DEFs
switch (tmpfmt)
{
case r_TOR:
defExt = "tor"; break;
case r_DEM:
defExt = "dem"; break;
case r_VFF:
defExt = "vff"; break;
case r_TIFF:
defExt = "tif"; break;
case r_JPEG:
defExt = "jpg"; break;
case r_HDF:
defExt = "hdf"; break;
case r_PNG:
defExt = "png"; break;
case r_BMP:
defExt = "bmp"; break;
default:
defExt = NULL;
}
if (outputFormat && (defExt == NULL))
defExt = "raw";
if (defExt == NULL)
{
if (printText)
{
int numCells = r_Ref(*iter)->get_array_size();
const char* theStuff = r_Ref(*iter)->get_array();
for (int cnt = 0; cnt < numCells; cnt++)
cout << theStuff[cnt];
}
else {
cout << "Image " << i << endl;
r_Ref(*iter)->print_status(cout, 0);
}
cout << endl;
}
else{
if(outputFormat && mafmt!=outputFormat)
{
r_Base_Type* conversionType=NULL;
r_Minterval* mddDomain=NULL;
if(mafmt!=r_Array)
{
data=r_Ref(*iter)->get_array();
dataSize=r_Ref(*iter)->get_array_size();
mddDomain=(r_Minterval*)&(r_Ref(*iter)->spatial_domain());
conversionType=(r_Base_Type*)r_Ref(*iter)->get_base_type_schema();
//convert this from currentformat(DEF) to r_Array
if (convertFrom(mafmt, data, dataSize, *mddDomain, conversionType, NULL) == 0)
{
r_Ref(*iter)->set_array_size(dataSize);
r_Ref(*iter)->set_type_length(conversionType->size());
r_Ref(*iter)->set_array(data);
r_Ref(*iter)->set_current_format(r_Array);
r_Ref(*iter)->set_spatial_domain(*mddDomain);
data = 0;
}
else
{
cout << "Error while converting to " << r_Array << " from " << mafmt << endl;
retval=CONVERSIONEXCEPTION;
}
}
//convert this from r_Array to outputFormat
data=r_Ref(*iter)->get_array();
dataSize=r_Ref(*iter)->get_array_size();
mddDomain=(r_Minterval*)&(r_Ref(*iter)->spatial_domain());
conversionType=(r_Base_Type*)r_Ref(*iter)->get_base_type_schema();
if (convertTo(outputFormat, data, dataSize, *mddDomain, conversionType, outputFormatParams) == 0)
{
r_Ref(*iter)->set_array_size(dataSize);
r_Ref(*iter)->set_type_length(conversionType->size());
r_Ref(*iter)->set_array(data);
r_Ref(*iter)->set_current_format(outputFormat);
r_Ref(*iter)->set_spatial_domain(*mddDomain);
data = 0;
}
else
{
cout << "Error while converting to " << outputFormat << " from " << r_Array << endl;
retval=CONVERSIONEXCEPTION;
}
}
char defFileName[256];
sprintf(defFileName, "%s%d.%s", outputFileName, i, defExt);
cout << "Marray " << i << " will write " << r_Ref(*iter)->get_array_size() << " bytes to " << defFileName << endl;
FILE *tfile = fopen(defFileName, "wb");
fwrite((void*)r_Ref(*iter)->get_array(), 1, r_Ref(*iter)->get_array_size(), tfile);
fclose(tfile);
}
}
break;
case r_Type::POINTTYPE:
cout << "Element " << i << ": " << *(r_Ref(*iter)) << endl;
break;
case r_Type::SINTERVALTYPE:
cout << "Element " << i << ": " << *(r_Ref(*iter)) << endl;
break;
case r_Type::MINTERVALTYPE:
cout << "Element " << i << ": " << *(r_Ref(*iter)) << endl;
break;
case r_Type::OIDTYPE:
cout << "Element " << i << ": " << *(r_Ref(*iter)) << endl;
break;
default:
cout << "Element " << i << ": " << flush;
printScalar( *(r_Ref(*iter)) );
cout << endl;
}
}
}
if (testBed)
cout << "-- Testbed end block:" << endl;
if (retval == 0)
ta.commit();
else
ta.abort();
}
delete myQuery;
myQuery = 0;
db.close();
}
catch (r_Error& obj)
{
cout << "Exception (" << obj.get_errorno() << ") : " << obj.what() << endl;
ta.abort();
db.close();
retval = EXCEPTIONADMIN;
}
}
else {
retval = FILENAMENOTSPECIFIED;
}
}
explainRetval(retval);
return retval;
}
void SystemQuery::printScalar( const r_Scalar& scalar )
{
switch( scalar.get_type()->type_id() )
{
case r_Type::BOOL:
cout << ( ((r_Primitive*)&scalar)->get_boolean() ? "T" : "F" ) << flush;
break;
case r_Type::CHAR:
cout << (int)((r_Primitive*)&scalar)->get_char() << flush;
break;
case r_Type::OCTET:
cout << (int)((r_Primitive*)&scalar)->get_octet() << flush;
break;
case r_Type::SHORT:
cout << ((r_Primitive*)&scalar)->get_short() << flush;
break;
case r_Type::USHORT:
cout << ((r_Primitive*)&scalar)->get_ushort() << flush;
break;
case r_Type::LONG:
cout << ((r_Primitive*)&scalar)->get_long() << flush;
break;
case r_Type::ULONG:
cout << ((r_Primitive*)&scalar)->get_ulong() << flush;
break;
case r_Type::FLOAT:
cout << ((r_Primitive*)&scalar)->get_float() << flush;
break;
case r_Type::DOUBLE:
cout << ((r_Primitive*)&scalar)->get_double() << flush;
break;
case r_Type::COMPLEXTYPE1:
case r_Type::COMPLEXTYPE2:
cout << "(" << ((r_Complex*)&scalar)->get_re() << ", " << ((r_Complex*)&scalar)->get_im() << ")" << flush;
break;
case r_Type::STRUCTURETYPE:
{
r_Structure* structValue = (r_Structure*)&scalar;
cout << "{ " << flush;
for( int i=0; icount_elements(); i++ )
{
printScalar( (*structValue)[i] );
if( i < structValue->count_elements()-1 ) cout << ", " << flush;
}
cout << " }" << endl;
}
break;
}
}