summaryrefslogtreecommitdiffstats
path: root/rasodmg/test/system_compare.cc
diff options
context:
space:
mode:
Diffstat (limited to 'rasodmg/test/system_compare.cc')
-rw-r--r--rasodmg/test/system_compare.cc273
1 files changed, 273 insertions, 0 deletions
diff --git a/rasodmg/test/system_compare.cc b/rasodmg/test/system_compare.cc
new file mode 100644
index 0000000..1dbc507
--- /dev/null
+++ b/rasodmg/test/system_compare.cc
@@ -0,0 +1,273 @@
+/*
+* 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_compare.cc
+ *
+ * MODULE: rasodmg/test
+ *
+ * COMMENTS:
+ * None
+*/
+
+static const char rcsid[] = "@(#)rasodmg/test,SystemCompare: $Id: system_compare.cc,v 1.3 2002/07/16 07:42:36 hoefner Exp $";
+
+#ifdef EARLY_TEMPLATE
+#define __EXECUTABLE__
+#include "raslib/template_inst.hh"
+#endif
+
+#include "system_compare.hh"
+#include "raslib/rminit.hh"
+#include "raslib/rmdebug.hh"
+#include "raslib/primitivetype.hh"
+#include "raslib/marraytype.hh"
+#include "rasodmg/tiling.hh"
+#include "rasodmg/stattiling.hh"
+#include "rasodmg/storagelayout.hh"
+#include "rasodmg/oqlquery.hh"
+#include "clientcomm/clientcomm.hh"
+
+int main(int argc, const char** argv)
+ {
+ SystemBasic::usageHeader = "system_compare version 0.9\n\t\tProgram for checking data in RasDaMan\n";
+ SystemBasic::usageFooter = "Required information:\n\t\tMDD type\n\t\tCollection name\n\t\tMDD domain\n\t\tScale levels or file name\n";
+ int retval = 0;
+ try {
+ retval = SystemCompare::doStuff(argc, argv);
+ }
+ catch (r_Error& e)
+ {
+ cout << "Caught Exception at top level: " << e.get_errorno() << " " << e.what() << endl;
+ }
+ }
+
+int
+SystemCompare::doStuff(int argc, const char** argv)
+ {
+ installSignalHandlers();
+ int retval = 0;
+ retval = parseParams(argc, (char**)argv);
+ if (retval == 0)
+ {
+ if (mddTypeName)
+ {
+ if (mddDomainDef)
+ {
+ if (collName)
+ {
+ if (fileName)
+ {//compare given file with database
+ retval = doCompare();
+ }
+ else {
+ if (scaleLevels != NULL)
+ {//compare scalelevels
+ retval = doCompare();
+ }
+ else {
+ retval = NOCOMPAREDESTINATION;
+ }
+ }
+ }
+ else {
+ retval = NOCOLLNAMEDEFINED;
+ }
+ }
+ else {
+ retval = MDDDOMAINNOTSPECIFIED;
+ }
+ }
+ else {
+ retval = NOMDDTYPEDEFINED;
+ }
+ }
+ explainRetval(retval);
+ return retval;
+ }
+
+//SystemUpdate::doUpdate(const char* queryString, const char* queryStringS, const char* mddTypeName, const r_Marray_Type mddType, const r_Minterval& mddDomain, const char* inputFormatParams, )
+int
+SystemCompare::doCompare()
+ {
+ int retval = 0;
+ char queryBufferS[QUERYBUFFERLENGTH];
+ memset(queryBufferS, 0, QUERYBUFFERLENGTH * sizeof(char));
+ if (mddOIdDef)
+ {
+ std::ostrstream stream(queryBufferS, QUERYBUFFERLENGTH);
+ stream << "SELECT A" << mddDomain << " FROM " << collName << " AS A WHERE oid(A) = " << mddOId;
+ }
+ else {
+ std::ostrstream stream(queryBufferS, QUERYBUFFERLENGTH);
+ stream << "SELECT A" << mddDomain << " FROM " << collName << " AS A";
+ }
+ r_Storage_Layout* stl = new r_Storage_Layout(theTiling->clone());
+ char* typeStructure = NULL;
+ r_Ref<r_GMarray> selectedMDD;
+ r_Set< r_Ref_Any > result;
+ r_Marray_Type* mddType = NULL;
+ try {
+ openTransaction(false);
+ typeStructure = db.communication->getTypeStructure(mddTypeName, ClientComm::r_MDDType_Type);
+ ta.abort();
+ db.close();
+ }
+ catch (r_Error& err)
+ {
+ RMInit::logOut << "Error during type retrieval from database: " << err.get_errorno() << " " << err.what() << endl;
+ typeStructure = new char[strlen(mddTypeName) + 1];
+ strcpy(typeStructure, mddTypeName);
+ }
+ try {
+ r_Type* tempType = r_Type::get_any_type(typeStructure);
+ if (tempType->isMarrayType())
+ {
+ mddType = (r_Marray_Type*)tempType;
+ }
+ else {
+ RMInit::logOut << "The type (" << typeStructure << ") is not an marray type." << endl;
+ retval = MDDTYPEINVALID;
+ }
+ }
+ catch (r_Error& err)
+ {
+ RMInit::logOut << "Error during type retrieval from type structure (" << typeStructure << "): " << err.get_errorno() << " " << err.what() << endl;
+ retval = MDDTYPEINVALID;
+ }
+ if (retval == 0)
+ {
+ size_t baseTypeLength = mddType->base_type().size();
+ if (fileName)
+ {//check if file corresponds to collection
+ r_Storage_Layout* stl = new r_Storage_Layout(theTiling->clone());
+ r_Ref<r_GMarray> tempMDD = new (mddTypeName)r_GMarray(mddDomain, baseTypeLength, stl);
+ tempMDD->set_type_schema(mddType);
+ FILE* filePointer = checkFile(fileName, retval);
+ if (retval != 0)
+ {
+ tempMDD.destroy();
+ return retval;
+ }
+ retval = initGMarray(tempMDD, filePointer, inputFormat, mddDomain, inputFormatParams);
+ fclose(filePointer);
+ if (retval == 0)
+ {
+ try {
+ r_OQL_Query query(queryBufferS);
+ openTransaction(false);
+ r_oql_execute(query, result);
+ r_Iterator< r_Ref_Any > iter = result.create_iterator();
+ selectedMDD = r_Ref<r_GMarray>(*iter);
+ if (polygonDefined)
+ {
+ polygon.setMArray(*selectedMDD);
+ if (foreGroundDef)
+ polygon.fillMArrayInside(foreGround);
+ if (backGroundDef)
+ polygon.fillMArrayOutside(backGround);
+ }
+ if (retval == 0)
+ {
+ retval = compareGMarrays(selectedMDD, tempMDD);
+ if (((retval != 0) || (force)) && (outputFileName != NULL))
+ {
+ char* tempName = new char[strlen(outputFileName) + strlen("image.png") + 1];
+ strcpy(tempName, outputFileName);
+ strcat(tempName, ".db.png");
+ saveData(tempName, selectedMDD->get_array(), selectedMDD->get_array_size(), selectedMDD->spatial_domain());
+ strcpy(tempName, outputFileName);
+ strcat(tempName, ".image.png");
+ saveData(tempName, tempMDD->get_array(), tempMDD->get_array_size(), tempMDD->spatial_domain());
+ delete [] tempName;
+ tempName = NULL;
+ }
+ }
+ ta.abort();
+ db.close();
+ }
+ catch (r_Error& err)
+ {
+ RMInit::logOut << "Error during administrative action: " << err.get_errorno() << " " << err.what() << endl;
+ retval = EXCEPTIONADMIN;
+ ta.abort();
+ }
+ if (db.get_status() != r_Database::not_open)
+ db.close();
+ }
+ }
+ if (scaleLevels != NULL)
+ {
+ try {
+ //initialise selectedMDD
+ r_OQL_Query query(queryBufferS);
+ openTransaction(false);
+ r_oql_execute(query, result);
+ r_Iterator< r_Ref_Any > iter = result.create_iterator();
+ selectedMDD = r_Ref<r_GMarray>(*iter);
+ if (polygonDefined)
+ {
+ polygon.setMArray(*selectedMDD);
+ if (foreGroundDef)
+ polygon.fillMArrayInside(foreGround);
+ if (backGroundDef)
+ polygon.fillMArrayOutside(backGround);
+ }
+ if (retval == 0)
+ {//read the scaled mdds from db and scale down the selected MDD and compare
+ std::list<std::pair<double, char*> >::iterator iter = scaleLevels->begin();
+ std::list<std::pair<double, char*> >::iterator end = scaleLevels->end();
+ r_Minterval scaledDomain;
+ r_Minterval clipDomain;
+ unsigned int length = 0;
+ r_Dimension maxDim = mddDomain.dimension();
+ r_Point origin(maxDim);
+ double factor = 0;
+ for (r_Dimension i = 0; i < maxDim; i++)
+ origin[i] = 0;
+ while ((iter != end) && (retval == 0))
+ {
+ factor = iter->first;
+ retval = scaleDomain(overlayDomain, origin, factor, scaledDomain, clipDomain, length);
+ RMInit::logOut << "scaled: " << iter->second << " scaled domain " << scaledDomain << " clip domain " << clipDomain << " result=" << retval << endl;
+ const r_Type* type = selectedMDD->get_base_type_schema();
+ size_t tlen = selectedMDD->get_type_length();
+ retval = compareScaledMDD(selectedMDD, clipDomain, scaledDomain, length, iter->second);
+ iter++;
+ }
+ }
+ ta.abort();
+ db.close();
+ }
+ catch (r_Error& err)
+ {
+ RMInit::logOut << "Error during administrative action: " << err.get_errorno() << " " << err.what() << endl;
+ retval = EXCEPTIONADMIN;
+ ta.abort();
+ }
+ if (db.get_status() != r_Database::not_open)
+ db.close();
+ }
+ }
+ return retval;
+ }
+