/* * 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 . / /* * defutil.hh * * COMMENTS * Common functions used by defxxx programs */ #include #include #include using std::cout; using std::endl; #include "raslib/mddtypes.hh" #include "raslib/structuretype.hh" #include "raslib/odmgtypes.hh" #include "raslib/minterval.hh" #include "raslib/parseparams.hh" #include "conversion/convertor.hh" #include "conversion/convfactory.hh" //--I/O file int readFile(const char* fileName, char **data, r_ULong& dataSize) { FILE *pFile=NULL; if(fileName==NULL) { cout << "readFile(...) fileName is null" << endl; return EXIT_FAILURE; } if(*data!=NULL) { cout << "readFile(...) data is not null" << endl; return EXIT_FAILURE; } pFile=fopen(fileName, "rb"); if(pFile==NULL) { cout << "readFile(...) unable to open file " << fileName << endl; return EXIT_FAILURE; } fseek(pFile, 0, SEEK_END); dataSize=ftell(pFile); *data=new char[dataSize]; if(*data==NULL) { cout << "readFile(...) unable to claim memory for file " << fileName << endl; fclose(pFile); return EXIT_FAILURE; } fseek(pFile, 0, SEEK_SET); fread(*data, 1, dataSize, pFile); fclose(pFile); return EXIT_SUCCESS; } int writeFile(const char* fileName, const char **data, r_ULong& dataSize) { FILE *pFile=NULL; if(fileName==NULL) { cout << "writeFile(...) fileName is null" << endl; return EXIT_FAILURE; } if(*data==NULL) { cout << "writeFile(...) data is null" << endl; return EXIT_FAILURE; } if(!dataSize) { cout << "writeFile(...) dataSize is zero" << endl; return EXIT_FAILURE; } pFile=fopen(fileName, "wb"); if(pFile==NULL) { cout << "writeFile(...) unable to open file" << fileName << endl; return EXIT_FAILURE; } fwrite(*data, 1, dataSize, pFile); fclose(pFile); pFile=NULL; return EXIT_SUCCESS; } //ConvertFrom/To r_Array data int convertFrom(r_Data_Format fmt, const char* fmtParams, const char* data, const r_Minterval& dataDom, const r_Type* dataType, r_convDesc& desc) { r_Storage_Man_CPP mySM; r_Convertor *conv=NULL; if(data==NULL) { cout << "convertFrom(...) data is null" << endl; return EXIT_FAILURE; } if(dataType==NULL) { cout << "convertFrom(...) dataType is null" << endl; return EXIT_FAILURE; } try { conv=r_Convertor_Factory::create(fmt, data, dataDom, dataType); conv->set_storage_handler(mySM); } catch(r_Error& err) { cout << "convertFrom(...) request for convertor " << fmt << " failed" << endl << "Error " << err.get_errorno() << " : " << err.what() << endl; return EXIT_FAILURE; } try { desc = conv->convertFrom(fmtParams); } catch(r_Error &err) { cout << "convertFrom(...) conversion from " << fmt << " format to r_Array format failed! " << endl << "Error " << err.get_errorno() << " : " << err.what() << endl; if(conv) { delete conv; conv=NULL; } return EXIT_FAILURE; } return EXIT_SUCCESS; } int convertTo(r_Data_Format fmt, const char* fmtParams, const char* data, const r_Minterval& dataDom, const r_Type* dataType, r_convDesc& desc) { r_Storage_Man_CPP mySM; r_Convertor *conv=NULL; if(data==NULL) { cout << "convertTo(...) data is null" << endl; return EXIT_FAILURE; } if(dataType==NULL) { cout << "convertTo(...) dataType is null" << endl; return EXIT_FAILURE; } try { conv=r_Convertor_Factory::create(fmt, data, dataDom, dataType); conv->set_storage_handler(mySM); } catch(r_Error& err) { cout << "convertTo(...) request for convertor " << fmt << " failed! " << endl << "Error " << err.get_errorno() << " : " << err.what() << endl; return EXIT_FAILURE; } try { desc = conv->convertTo(fmtParams); } catch(r_Error &err) { cout << "convertTo(...) conversion from " << fmt << " format to r_Array format failed! " << endl << "Error " << err.get_errorno() << " : " << err.what() << endl; if(conv) { delete conv; conv=NULL; } return EXIT_FAILURE; } return EXIT_SUCCESS; } //init/deinit ConvDesc void cleanConvDesc(r_convDesc& desc) { desc.src=NULL; desc.srcType=NULL; if(desc.dest!=NULL) { delete []desc.dest; desc.dest=NULL; } if(desc.destType!=NULL) { delete desc.destType; desc.destType=NULL; } desc.baseType = r_Convertor::ctype_void; } void initConvDesc(r_convDesc& desc) { desc.dest=NULL; desc.src=NULL; desc.srcType=NULL; desc.destType=NULL; desc.baseType = r_Convertor::ctype_void; } //decode a minterval from a string int decodeMinterval(const char* src, r_Minterval& srcIv) { if(!src) { cout << "decodeMinterval(...) src is null" << endl; return EXIT_FAILURE; } try { srcIv=r_Minterval(src); } catch(r_Error& err) { cout << "decodeMinterval(...) error while constructing the minterval from " << src << endl; cout << "Error " << err.get_errorno() << ":" << err.what() << endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } //decode a type from a string int decodeType(const char* src, r_Type*& srcType) { if(!src) { cout << "decodeType(...) src is null" << endl; return EXIT_FAILURE; } if(srcType) { cout << "decodeType(...) src is not null" << endl; return EXIT_FAILURE; } try { srcType=r_Type::get_any_type(src); } catch(r_Error& err) { cout << "decodeType(...) error while constructing the type from " << src << endl; cout << "Error " << err.get_errorno() << ":" << err.what() << endl; return EXIT_FAILURE; } if(!srcType) { cout << "decodeType(...) the type retrived with r_Type::get_any_type(...) is null" << endl; return EXIT_FAILURE; } if(!srcType->isBaseType()) { cout << "decodeType(...) the type retrived (" << srcType->type_id() << ") is not a base type" << endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } //parse r_Array params 'domain=,type=' int parseArrayParams(const char* formatparams, const char* fpDomain, const char* fpType, char*& domain, char*& type) { const int fpNo=2; r_Parse_Params params(fpNo); //parameter validation if(formatparams==NULL) { cout << "parseArrayParams(...) formatparams is null" << endl; return EXIT_FAILURE; } if(fpDomain==NULL){ cout << "parseArrayParams(...) fpDomain is null" << endl; return EXIT_FAILURE; } if(fpType==NULL){ cout << "parseArrayParams(...) fpType is null" << endl; return EXIT_FAILURE; } if(domain!=NULL){ cout << "parseArrayParams(...) domain is not null" << endl; return EXIT_FAILURE; } if(type!=NULL){ cout << "parseArrayParams(...) type is not null" << endl; return EXIT_FAILURE; } params.add(fpDomain, &domain, r_Parse_Params::param_type_string); params.add(fpType, &type, r_Parse_Params::param_type_string); if(params.process(formatparams) != fpNo) { cout << "parseArrayParams(...) error parsing " << formatparams << endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } //compare 2 structure type int compareStructure(r_Structure_Type* src, r_Structure_Type* dest) { r_Structure_Type::attribute_iterator iterSrc, iterDest; if(src==NULL) { cout << "compareStructure(...) src is null !"<< endl; return EXIT_FAILURE; } if(dest==NULL) { cout << "compareStructure(...) dest is null !"<< endl; return EXIT_FAILURE; } iterSrc=src->defines_attribute_begin(); iterDest=dest->defines_attribute_begin(); while( iterSrc!=src->defines_attribute_end() || iterDest!=dest->defines_attribute_end()) { r_Type::r_Type_Id typeSrcId=r_Type::UNKNOWNTYPE, typeDestId=r_Type::UNKNOWNTYPE; typeSrcId=(*iterSrc).type_of().type_id(); typeDestId=(*iterDest).type_of().type_id(); if(typeSrcId!=typeDestId) { cout << "comparaStructure(...) typeSrcId(" << typeSrcId << ") != typeDestId(" << typeDestId << ") !"<< endl; return EXIT_FAILURE; } if((typeSrcId== r_Type::STRUCTURETYPE) && (compareStructure((r_Structure_Type*)(&((*iterSrc).type_of())), (r_Structure_Type*)(&((*iterDest).type_of()))) != EXIT_SUCCESS)) return EXIT_FAILURE; iterSrc++; iterDest++; } if((iterSrc==src->defines_attribute_end()) && (iterDest==dest->defines_attribute_end())) return EXIT_SUCCESS; else { if(iterSrc!=src->defines_attribute_end()) cout << "compareStructure(...) src has more atributes then dest!" << endl; else cout << "compareStructure(...) dest has more atributes then src!" << endl; return EXIT_FAILURE; } }