summaryrefslogtreecommitdiffstats
path: root/rasodmg/test/system_query.cc
diff options
context:
space:
mode:
Diffstat (limited to 'rasodmg/test/system_query.cc')
-rw-r--r--rasodmg/test/system_query.cc400
1 files changed, 400 insertions, 0 deletions
diff --git a/rasodmg/test/system_query.cc b/rasodmg/test/system_query.cc
new file mode 100644
index 0000000..d04c658
--- /dev/null
+++ b/rasodmg/test/system_query.cc
@@ -0,0 +1,400 @@
+/*
+* 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 <http://www.gnu.org/licenses/>.
+*
+* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
+rasdaman GmbH.
+*
+* For more information please see <http://www.rasdaman.org>
+* or contact Peter Baumann via <baumann@rasdaman.com>.
+/
+/**
+ * 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 <unistd.h>
+#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() : "<nn>") << endl;
+ cout << " Type Schema...........: " << flush;
+ if (result_set.get_type_schema())
+ result_set.get_type_schema()->print_status(cout);
+ else
+ cout << "<nn>" << 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 << "<nn>" << 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<r_GMarray>(*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<r_GMarray>(*iter)->get_array_size();
+ const char* theStuff = r_Ref<r_GMarray>(*iter)->get_array();
+ for (int cnt = 0; cnt < numCells; cnt++)
+ cout << theStuff[cnt];
+ }
+ else {
+ cout << "Image " << i << endl;
+ r_Ref<r_GMarray>(*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<r_GMarray>(*iter)->get_array();
+ dataSize=r_Ref<r_GMarray>(*iter)->get_array_size();
+ mddDomain=(r_Minterval*)&(r_Ref<r_GMarray>(*iter)->spatial_domain());
+ conversionType=(r_Base_Type*)r_Ref<r_GMarray>(*iter)->get_base_type_schema();
+ //convert this from currentformat(DEF) to r_Array
+ if (convertFrom(mafmt, data, dataSize, *mddDomain, conversionType, NULL) == 0)
+ {
+ r_Ref<r_GMarray>(*iter)->set_array_size(dataSize);
+ r_Ref<r_GMarray>(*iter)->set_type_length(conversionType->size());
+ r_Ref<r_GMarray>(*iter)->set_array(data);
+ r_Ref<r_GMarray>(*iter)->set_current_format(r_Array);
+ r_Ref<r_GMarray>(*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<r_GMarray>(*iter)->get_array();
+ dataSize=r_Ref<r_GMarray>(*iter)->get_array_size();
+ mddDomain=(r_Minterval*)&(r_Ref<r_GMarray>(*iter)->spatial_domain());
+ conversionType=(r_Base_Type*)r_Ref<r_GMarray>(*iter)->get_base_type_schema();
+ if (convertTo(outputFormat, data, dataSize, *mddDomain, conversionType, outputFormatParams) == 0)
+ {
+ r_Ref<r_GMarray>(*iter)->set_array_size(dataSize);
+ r_Ref<r_GMarray>(*iter)->set_type_length(conversionType->size());
+ r_Ref<r_GMarray>(*iter)->set_array(data);
+ r_Ref<r_GMarray>(*iter)->set_current_format(outputFormat);
+ r_Ref<r_GMarray>(*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<r_GMarray>(*iter)->get_array_size() << " bytes to " << defFileName << endl;
+
+ FILE *tfile = fopen(defFileName, "wb");
+ fwrite((void*)r_Ref<r_GMarray>(*iter)->get_array(), 1, r_Ref<r_GMarray>(*iter)->get_array_size(), tfile);
+ fclose(tfile);
+ }
+ }
+ break;
+
+ case r_Type::POINTTYPE:
+ cout << "Element " << i << ": " << *(r_Ref<r_Point>(*iter)) << endl;
+ break;
+
+ case r_Type::SINTERVALTYPE:
+ cout << "Element " << i << ": " << *(r_Ref<r_Sinterval>(*iter)) << endl;
+ break;
+
+ case r_Type::MINTERVALTYPE:
+ cout << "Element " << i << ": " << *(r_Ref<r_Minterval>(*iter)) << endl;
+ break;
+
+ case r_Type::OIDTYPE:
+ cout << "Element " << i << ": " << *(r_Ref<r_OId>(*iter)) << endl;
+ break;
+
+ default:
+ cout << "Element " << i << ": " << flush;
+ printScalar( *(r_Ref<r_Scalar>(*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; i<structValue->count_elements(); i++ )
+ {
+ printScalar( (*structValue)[i] );
+
+ if( i < structValue->count_elements()-1 ) cout << ", " << flush;
+ }
+ cout << " }" << endl;
+ }
+ break;
+ }
+}