/* * 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_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 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 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(*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(*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 >::iterator iter = scaleLevels->begin(); std::list >::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; }