#include "mymalloc/mymalloc.h" /* * 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 . */ /************************************************************* * * * PURPOSE * Contains the functions which really communicate with the server * * * COMMENTS: * - return values & their meaning see servercomm.hh * ************************************************************/ #include #include "rnpclientcomm.hh" #include "rasodmg/transaction.hh" #include "rasodmg/database.hh" #include "rasodmg/iterator.hh" #include "rasodmg/set.hh" #include "rasodmg/ref.hh" #include "rasodmg/storagelayout.hh" #include "rasodmg/tiling.hh" #include "raslib/minterval.hh" #include "raslib/rmdebug.hh" #include "raslib/rminit.hh" #include "raslib/primitivetype.hh" #include "raslib/complextype.hh" #include "raslib/structuretype.hh" #include "raslib/primitive.hh" #include "raslib/complex.hh" #include "raslib/structure.hh" #include "raslib/endian.hh" #include "raslib/parseparams.hh" // for transfer compression #include "compression/tilecompression.hh" #include "debug.hh" void RnpClientComm::setTurbo(bool turbo) { ENTER( "RpcClientComm::setTurbo(" << turbo << ")" ); RMDBGENTER( 2, RMDebug::module_clientcomm, "RpcClientComm", "setTurbo(" << turbo << ")" ); useTurbo = turbo; RMDBGEXIT( 2, RMDebug::module_clientcomm, "RpcClientComm", "setTurbo()" ); LEAVE( "RpcClientComm::setTurbo()" ); } void RnpClientComm::executeConnect() { ENTER( "RnpClientComm::executeConnect()" ); startRequest(RnpRasserver::cmd_connect); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, 0); encoder.addStringParameter(RnpRasserver::pmt_capability, capability); TALK( "request RnpRasserver::cmd_connect with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clientID = decoder.getDataAsInteger(); TALK( "executeConnect: Connected, clientID 0x" << hex << clientID << dec << endl ); endianServer = decoder.getDesiredEndianness() == Rnp::bigEndian ? 0: 1; endianClient = Rnp::detectHostEndianness() == Rnp::bigEndian ? 0: 1; clearAnswer(); LEAVE( "RnpClientComm::executeConnect()" ); } void RnpClientComm::executeDisconnect() { ENTER( "RnpClientComm::executeDisconnect()" ); startRequest(RnpRasserver::cmd_disconnect); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "request RnpRasserver::cmd_disconnect with clientID 0x" << hex << clientID << dec ); clientID = -1; TALK( "clientID now set to 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clearAnswer(); LEAVE( "RnpClientComm::executeDisconnect()" ); } void RnpClientComm::executeOpenDB(const char* lDatabaseName) { ENTER( "RnpClientComm::executeOpenDB( lDatabaseName=" << (lDatabaseName?lDatabaseName:"(null)") << " )" ); startRequest(RnpRasserver::cmd_opendb); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_dbname, lDatabaseName); TALK( "request RnpRasserver::cmd_opendb '" << lDatabaseName << "', with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clearAnswer(); LEAVE( "RnpClientComm::executeOpenDB()" ); } void RnpClientComm::executeCloseDB() { ENTER( "RnpClientComm::executeCloseDB()" ); startRequest(RnpRasserver::cmd_closedb); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "request RnpRasserver::cmd_closedb with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clearAnswer(); LEAVE( "RnpClientComm::executeCloseDB()" ); } void RnpClientComm::executeBeginTA(bool rw) { ENTER( "RnpClientComm::executeBeginTA( rw=" << rw << " )" ); startRequest(RnpRasserver::cmd_beginta); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addInt32Parameter(RnpRasserver::pmt_accesmode, rw); TALK( "request RnpRasserver::cmd_beginta with rw=" << rw << ", clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clearAnswer(); LEAVE( "RnpClientComm::executeBeginTA()" ); } void RnpClientComm::executeCommitTA() { ENTER( "RnpClientComm::executeCommitTA()" ); startRequest(RnpRasserver::cmd_committa); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "request RnpRasserver::cmd_committa with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clearAnswer(); LEAVE( "RnpClientComm::executeCommitTA()" ); } void RnpClientComm::executeAbortTA() { ENTER( "RnpClientComm::executeAbortTA()" ); startRequest(RnpRasserver::cmd_abortta); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "request RnpRasserver::cmd_abortta with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clearAnswer(); LEAVE( "RnpClientComm::executeAbortTA()" ); } void RnpClientComm::turboOpenDB(const char *lDatabaseName) { ENTER( "RnpClientComm::turboOpenDB( lDatabaseName=" << (lDatabaseName?lDatabaseName:"(null)") << " )" ); clientID = 0; startRequest(RnpRasserver::cmd_connect); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, 0); // = always clientID -- PB encoder.addStringParameter(RnpRasserver::pmt_capability, capability); encoder.endFragment(); TALK( "request RnpRasserver::cmd_connect with clientID 0x0, capability '" << capability << "'" ); encoder.startFragment(Rnp::fgt_Command,RnpRasserver::cmd_opendb); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_dbname, lDatabaseName); encoder.endFragment(); TALK( "adding fragment RnpRasserver::cmd_opendb with db '" << lDatabaseName << "', clientID 0x" << hex << clientID << dec ); encoder.startFragment(Rnp::fgt_Command,RnpRasserver::cmd_closedb); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.endFragment(); TALK( "adding fragment RnpRasserver::cmd_closedb with clientID 0x" << hex << clientID << dec ); encoder.startFragment(Rnp::fgt_Command,RnpRasserver::cmd_disconnect); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "adding fragment RnpRasserver::cmd_disconnect with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); //clientID = decoder.getDataAsInteger(); clientID = -1; // we will disconnect so we force it here TALK( "RnpClientComm::turboOpenDB(): clientID set to 0x" << hex << clientID << dec ); endianServer = decoder.getDesiredEndianness() == Rnp::bigEndian ? 0: 1; endianClient = Rnp::detectHostEndianness() == Rnp::bigEndian ? 0: 1; // open decoder.getNextFragment(); detectErrors(); // close decoder.getNextFragment(); detectErrors(); // disconnect decoder.getNextFragment(); detectErrors(); clearAnswer(); LEAVE( "RnpClientComm::turboOpenDB()" ); } void RnpClientComm::turboBeginTA(bool rw) { ENTER( "RnpClientComm::turboBeginTA( rw=" << rw << " )" ); clientID = 0; startRequest(RnpRasserver::cmd_connect); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, 0); encoder.addStringParameter(RnpRasserver::pmt_capability, capability); encoder.endFragment(); TALK( "request RnpRasserver::cmd_connect with clientID 0x" << hex << clientID << dec << ", capability '" << capability << "'" ); encoder.startFragment(Rnp::fgt_Command,RnpRasserver::cmd_opendb); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_dbname, databaseName); encoder.endFragment(); TALK( "adding fragment RnpRasserver::cmd_opendb '" << databaseName << "', with clientID 0x" << hex << clientID << dec ); encoder.startFragment(Rnp::fgt_Command,RnpRasserver::cmd_beginta); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addInt32Parameter(RnpRasserver::pmt_accesmode, rw); TALK( "adding fragment RnpRasserver::cmd_beginta with rw=" << rw << ", clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clientID = decoder.getDataAsInteger(); TALK( "rceived clientID 0x" << hex << clientID << dec ); endianServer = decoder.getDesiredEndianness() == Rnp::bigEndian ? 0: 1; endianClient = Rnp::detectHostEndianness() == Rnp::bigEndian ? 0: 1; // open decoder.getNextFragment(); detectErrors(); // beginTA decoder.getNextFragment(); detectErrors(); clearAnswer(); LEAVE( "RnpClientComm::turboBeginTA()" ); } void RnpClientComm::turboCommitTA() { ENTER( "RnpClientComm::turboCommitTA()" ); startRequest(RnpRasserver::cmd_committa); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.endFragment(); TALK( "request RnpRasserver::cmd_committa with clientID 0x" << hex << clientID << dec ); encoder.startFragment(Rnp::fgt_Command,RnpRasserver::cmd_closedb); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.endFragment(); TALK( "adding fragment RnpRasserver::cmd_closedb with clientID 0x" << hex << clientID << dec ); encoder.startFragment(Rnp::fgt_Command,RnpRasserver::cmd_disconnect); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "adding fragment RnpRasserver::cmd_disconnect with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); // close decoder.getNextFragment(); detectErrors(); // disconnect decoder.getNextFragment(); detectErrors(); clientID = -1; TALK( "resetting: clientID 0x" << hex << clientID << dec ); clearAnswer(); LEAVE( "RnpClientComm::turboCommitTA()" ); } void RnpClientComm::turboAbortTA() { ENTER( "RnpClientComm::turboAbortTA()" ); startRequest(RnpRasserver::cmd_abortta); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.endFragment(); TALK( "request RnpRasserver::cmd_abortta with clientID 0x" << hex << clientID << dec ); encoder.startFragment(Rnp::fgt_Command,RnpRasserver::cmd_closedb); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.endFragment(); TALK( "adding fragment RnpRasserver::cmd_closedb with clientID 0x" << hex << clientID << dec ); encoder.startFragment(Rnp::fgt_Command,RnpRasserver::cmd_disconnect); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "adding fragment RnpRasserver::cmd_disconnect with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); // close decoder.getNextFragment(); detectErrors(); // disconnect decoder.getNextFragment(); detectErrors(); clientID = -1; TALK( "resetting: clientID 0x" << hex << clientID << dec ); clearAnswer(); LEAVE( "RnpClientComm::turboAbortTA()" ); } //--------------------------------------------------------------------------------- int RnpClientComm::executeStartInsertPersMDD( const char* collName, r_GMarray* mar ) { ENTER( "RnpClientComm::executeStartInsertPersMDD( collName=" << (collName?collName:"(null)") << ", mar=" << ((unsigned long) mar) << " )" ); startRequest(RnpRasserver::cmd_startinsPmdd); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_collname, collName); char *domain = mar->spatial_domain().get_string_representation(); encoder.addStringParameter(RnpRasserver::pmt_domain, domain); encoder.addInt32Parameter(RnpRasserver::pmt_typelength, mar->get_type_length()); encoder.addStringParameter(RnpRasserver::pmt_typename, mar->get_type_name()); encoder.addStringParameter(RnpRasserver::pmt_oidstring, mar->get_oid().get_string_representation()); TALK( "request RnpRasserver::cmd_startinsPmdd with collname '" << collName << "', domain " << domain << ", typelength " << mar->get_type_length() << ", typename '" << mar->get_type_name() << ", oid " << mar->get_oid().get_string_representation() << ", clientID 0x" << hex << clientID << dec ); free(domain); int result = sendAndReturnStatus(); ENTER( "RnpClientComm::executeStartInsertPersMDD() -> " << result ); return result; } int RnpClientComm::executeExecuteQuery( const char* query, r_Set< r_Ref_Any >& result ) throw( r_Error ) { ENTER( "RnpClientComm::executeExecuteQuery( query=" << (query?query:"(null)") << ", result=" << ((unsigned long) &result) << " )" ); startRequest(RnpRasserver::cmd_queryrpc); encoder.adjustBufferSize(strlen(query)); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_querystring, query); TALK( "request RnpRasserver::cmd_queryrpc with query '" << query << ", clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); int status = decoder.getDataAsInteger(); decoder.getNextParameter(); int errNo = decoder.getDataAsInteger(); decoder.getNextParameter(); int lineNo = decoder.getDataAsInteger(); decoder.getNextParameter(); int colNo = decoder.getDataAsInteger(); decoder.getNextParameter(); const char* token = decoder.getDataAsString(); decoder.getNextParameter(); const char* typeName = decoder.getDataAsString(); decoder.getNextParameter(); const char* typeStructure = decoder.getDataAsString(); if(status == 0 || status == 1) { result.set_type_by_name( typeName ); result.set_type_structure( typeStructure ); } // status == 2 - empty result if( status == 4 || status == 5 ) { r_Equery_execution_failed err( errNo, lineNo, colNo, token ); clearAnswer(); LEAVE( "RnpClientComm::executeExecuteQuery() exception: status=" << status ); throw err; } clearAnswer(); LEAVE( "RnpClientComm::executeExecuteQuery() -> " << status ); return status; } int RnpClientComm::executeEndTransfer() { ENTER( "RnpClientComm::executeEndTransfer()" ); startRequest(RnpRasserver::cmd_endtransfer); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "request RnpRasserver::cmd_endtransfer with clientID 0x" << hex << clientID << dec ); int result = sendAndReturnStatus(); LEAVE( "RnpClientComm::executeEndTransfer() -> " << result ); return result; } GetElementRes* RnpClientComm::executeGetNextElement() { ENTER( "RnpClientComm::executeGetNextElement()" ); startRequest(RnpRasserver::cmd_getnextelem); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "request RnpRasserver::cmd_getnextelem with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); GetElementRes *result = new GetElementRes; result->data.confarray_val = NULL; result->status = decoder.getDataAsInteger(); if(decoder.countParameters() == 2) { decoder.getNextParameter(); result->data.confarray_len = decoder.getDataLength(); result->data.confarray_val = new char[decoder.getDataLength()]; memcpy(result->data.confarray_val, decoder.getData(), decoder.getDataLength()); } clearAnswer(); LEAVE( "RnpClientComm::executeGetNextElement() -> " << result ); return result; } int RnpClientComm::executeInsertMDD(const char* collName, r_GMarray* mar, RPCMarray *rpcMarray) { ENTER( "RnpClientComm::executeInsertMDD( collName=" << (collName?collName:"(null)") << ", mar=" << ((unsigned long) mar) << ", rpcMarray=" << ((unsigned long) rpcMarray) << " )" ); int size = rpcMarray->data.confarray_len; startRequest(RnpRasserver::cmd_insertmdd, RNP_DEFAULTBUFFERSIZE + size); encoder.addInt32Parameter( RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter( RnpRasserver::pmt_collname, collName); encoder.addStringParameter( RnpRasserver::pmt_typename, mar->get_type_name()); encoder.addStringParameter( RnpRasserver::pmt_oidstring, mar->get_oid().get_string_representation()); encoder.addStringParameter( RnpRasserver::pmt_domain, rpcMarray->domain); encoder.addInt32Parameter( RnpRasserver::pmt_typelength, rpcMarray->cellTypeLength); encoder.addInt32Parameter( RnpRasserver::pmt_currentformat, rpcMarray->currentFormat); encoder.addInt32Parameter( RnpRasserver::pmt_storageformat, rpcMarray->storageFormat); encoder.addOpaqueParameter( RnpRasserver::pmt_tiledata, rpcMarray->data.confarray_val, size); TALK( "request RnpRasserver::cmd_insertmdd with collection '" << collName << ", ..., clientID 0x" << hex << clientID << dec ); int result = sendAndReturnStatus(); LEAVE( "RnpClientComm::executeInsertMDD() -> " << result ); return result; } int RnpClientComm::executeInsertCollection( const char* collName, const char* typeName, const r_OId& oid ) { ENTER( "RnpClientComm::executeInsertCollection( collName=" << (collName?collName:"(null)") << ", typeName=" << (typeName?typeName:"(null)") << ", oid=" << oid << " )" ); startRequest(RnpRasserver::cmd_insertcoll); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_collname, collName); encoder.addStringParameter(RnpRasserver::pmt_typename, typeName); encoder.addStringParameter(RnpRasserver::pmt_oidstring, oid.get_string_representation()); TALK( "request RnpRasserver::cmd_insertcoll collection '" << collName << ", ..., with clientID 0x" << hex << clientID << dec ); int result = sendAndReturnStatus(); LEAVE( "RnpClientComm::executeInsertCollection() -> " << result ); return result; } // common function using the dynamic parameter facility of RNP r_Ref_Any RnpClientComm::executeGetCollByNameOrOId ( const char* collName, const r_OId& oid ) throw( r_Error ) { ENTER( "RnpClientComm::executeGetCollByNameOrOId( collName=" << (collName?collName:"(null)") << ", oid=" << oid << " )" ); startRequest(RnpRasserver::cmd_getcoll); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); if( collName != NULL) encoder.addStringParameter(RnpRasserver::pmt_collname, collName); else encoder.addStringParameter(RnpRasserver::pmt_oidstring, oid.get_string_representation()); TALK( "request RnpRasserver::cmd_getcoll with ..., clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); int status = decoder.getDataAsInteger(); decoder.getNextParameter(); const char *typeName = decoder.getDataAsString(); decoder.getNextParameter(); const char *typeStructure = decoder.getDataAsString(); decoder.getNextParameter(); const char *oidstring = decoder.getDataAsString(); decoder.getNextParameter(); const char *collectionName= decoder.getDataAsString(); r_Set< r_Ref_Any >* set = 0; if( status != 0 && status != 1 ) { r_Error err; switch( status ) { case 2: err = r_Error( r_Error::r_Error_ObjectUnknown ); break; case 3: err = r_Error( r_Error::r_Error_ClientUnknown ); break; default: err = r_Error( r_Error::r_Error_TransferFailed ); break; } clearAnswer(); LEAVE( "RnpClientComm::executeGetCollByNameOrOId(): exception, status = " << status ); throw err; } // create the set r_OId rOId( oidstring ); set = new ( r_Database::actual_database, r_Object::read, rOId ) r_Set< r_Ref_Any >; // initialize data elements set->set_type_by_name ( typeName ); set->set_type_structure( typeStructure ); set->set_object_name ( collectionName ); clearAnswer(); // get collection elements if( status == 0 ) getMDDCollection( *set, 0 ); // else rpcStatus == 1 -> Result collection is empty and nothing has to be got. r_Ref_Any result = r_Ref_Any( set->get_oid(), set ); LEAVE( "RnpClientComm::executeGetCollByNameOrOId() -> (result set not displayed)" ); return result; } // common function using the dynamic parameter facility of RNP r_Ref_Any RnpClientComm::executeGetCollOIdsByNameOrOId ( const char* collName, const r_OId& oid ) throw( r_Error ) { ENTER( "RnpClientComm::executeGetCollOIdsByNameOrOId( collName=" << (collName?collName:"(null)") << ", oid=" << oid << " )" ); startRequest(RnpRasserver::cmd_getcolloids); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); if( collName != NULL) encoder.addStringParameter(RnpRasserver::pmt_collname, collName); else encoder.addStringParameter(RnpRasserver::pmt_oidstring, oid.get_string_representation()); TALK( "request RnpRasserver::cmd_getcolloids with ..., clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); int status = decoder.getDataAsInteger(); decoder.getNextParameter(); const char *typeName = decoder.getDataAsString(); decoder.getNextParameter(); const char *typeStructure = decoder.getDataAsString(); decoder.getNextParameter(); const char *oidstring = decoder.getDataAsString(); decoder.getNextParameter(); const char *collectionName= decoder.getDataAsString(); r_Set< r_Ref >* set = 0; if( status != 0 && status != 1 ) { r_Error err; switch( status ) { case 2: err = r_Error( r_Error::r_Error_ObjectUnknown ); break; case 3: err = r_Error( r_Error::r_Error_ClientUnknown ); break; default: err = r_Error( r_Error::r_Error_TransferFailed ); break; } clearAnswer(); LEAVE( "RnpClientComm::executeGetCollOIdsByNameOrOId(): exception, status = " << status ); throw err; } // create the set r_OId rOId( oidstring ); set = new ( r_Database::actual_database, r_Object::read, rOId ) r_Set< r_Ref< r_GMarray > >; set->set_type_by_name ( typeName ); set->set_type_structure( typeStructure ); set->set_object_name ( collName ); // fill set with oids if( status == 0 ) { while(decoder.getNextParameter() != 0) { r_OId roid( decoder.getDataAsString() ); set->insert_element( r_Ref(roid), 1 ); } } clearAnswer(); r_Ref_Any result = r_Ref_Any( set->get_oid(), set ); LEAVE( "RnpClientComm::executeGetCollOIdsByNameOrOId() -> (result not displayed)" ); return result; } GetMDDRes* RnpClientComm::executeGetNextMDD() { ENTER( "RnpClientComm::executeGetNextMDD()" ); startRequest(RnpRasserver::cmd_getnextmdd); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "request RnpRasserver::cmd_getnextmdd with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); GetMDDRes* result = new GetMDDRes; result->status = decoder.getDataAsInteger(); decoder.getNextParameter(); result->domain = strdup(decoder.getDataAsString()); decoder.getNextParameter(); result->typeName = strdup(decoder.getDataAsString()); decoder.getNextParameter(); result->typeStructure = strdup(decoder.getDataAsString()); decoder.getNextParameter(); result->oid = strdup(decoder.getDataAsString()); decoder.getNextParameter(); result->currentFormat = decoder.getDataAsInteger(); clearAnswer(); LEAVE( "RnpClientComm::executeGetNextMDD() -> " << result ); return result; } GetTileRes* RnpClientComm::executeGetNextTile() { ENTER( "RnpClientComm::executeGetNextTile()" ); startRequest(RnpRasserver::cmd_getnexttile); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "request RnpRasserver::cmd_getnexttile with clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); GetTileRes* result = new GetTileRes; result->marray = new RPCMarray; result->status = decoder.getDataAsInteger(); if(decoder.getNextParameter() != 0) { result->marray->domain = strdup(decoder.getDataAsString()); decoder.getNextParameter(); result->marray->cellTypeLength = decoder.getDataAsInteger(); decoder.getNextParameter(); result->marray->currentFormat = decoder.getDataAsInteger(); decoder.getNextParameter(); result->marray->storageFormat = decoder.getDataAsInteger(); decoder.getNextParameter(); int length = decoder.getDataLength(); result->marray->data.confarray_len = length; result->marray->data.confarray_val = (char*)mymalloc(length); memcpy(result->marray->data.confarray_val, decoder.getData(), length); } else { result->marray->domain = 0; result->marray->data.confarray_val = 0; } clearAnswer(); LEAVE( "RnpClientComm::executeGetNextTile() -> " << result ); return result; } int RnpClientComm::executeInitUpdate() { ENTER( "RnpClientComm::executeInitUpdate()" ); startRequest(RnpRasserver::cmd_initupdate); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "adding fragment XXX with clientID 0x" << hex << clientID << dec ); int result = sendAndReturnStatus(); LEAVE( "RnpClientComm::executeInitUpdate() -> " << result ); return result; } int RnpClientComm::executeStartInsertTransMDD(r_GMarray* mdd) { ENTER( "RnpClientComm::executeStartInsertTransMDD( mdd=" << ((unsigned long) mdd) << " )" ); startRequest(RnpRasserver::cmd_startinsTmdd); encoder.addInt32Parameter( RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter( RnpRasserver::pmt_domain, mdd->spatial_domain().get_string_representation()); encoder.addInt32Parameter( RnpRasserver::pmt_typelength, mdd->get_type_length()); encoder.addStringParameter( RnpRasserver::pmt_typename, mdd->get_type_name()); TALK( "request RnpRasserver::cmd_startinsTmdd with ..., clientID 0x" << hex << clientID << dec ); int result = sendAndReturnStatus(); LEAVE( "RnpClientComm::executeStartInsertTransMDD() -> " << result ); return result; } int RnpClientComm::executeInsertTile(bool persistent, RPCMarray *tile) { ENTER( "RnpClientComm::executeInsertTile( persistent=" << persistent << ", tile=" << ((unsigned long) tile) << " )" ); int size = tile->data.confarray_len; startRequest(RnpRasserver::cmd_inserttile, RNP_DEFAULTBUFFERSIZE + size); encoder.addInt32Parameter( RnpRasserver::pmt_clientid, clientID); encoder.addInt32Parameter( RnpRasserver::pmt_ispersistent, persistent ? 1:0); encoder.addStringParameter( RnpRasserver::pmt_domain, tile->domain); encoder.addInt32Parameter( RnpRasserver::pmt_typelength, tile->cellTypeLength); encoder.addInt32Parameter( RnpRasserver::pmt_currentformat, tile->currentFormat); encoder.addInt32Parameter( RnpRasserver::pmt_storageformat, tile->storageFormat); encoder.addOpaqueParameter( RnpRasserver::pmt_tiledata, tile->data.confarray_val, size); TALK( "request RnpRasserver::cmd_inserttile with ..., clientID 0x" << hex << clientID << dec ); int result = sendAndReturnStatus(); LEAVE( "RnpClientComm::executeInsertTile() -> " << result ); return result; } void RnpClientComm::executeEndInsertMDD(bool persistent) { ENTER( "RnpClientComm::executeEndInsertMDD( persistent=" << persistent << " )" ); startRequest(RnpRasserver::cmd_endinsmdd); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addInt32Parameter(RnpRasserver::pmt_ispersistent, persistent ? 1:0); TALK( "request RnpRasserver::cmd_endinsmdd with persistent " << persistent << ", clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clearAnswer(); LEAVE( "RnpClientComm::executeEndInsertMDD()" ); } void RnpClientComm::executeExecuteUpdateQuery(const char *query) throw(r_Error) { ENTER( "RnpClientComm::executeExecuteUpdateQuery( query=" << (query?query:"(null)") << " )" ); startRequest(RnpRasserver::cmd_updaterpc); encoder.adjustBufferSize(strlen(query)); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_querystring, query); TALK( "request RnpRasserver::cmd_updaterpc with query '" << query << "', clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); int status = decoder.getDataAsInteger(); decoder.getNextParameter(); int errNo = decoder.getDataAsInteger(); decoder.getNextParameter(); int lineNo = decoder.getDataAsInteger(); decoder.getNextParameter(); int colNo = decoder.getDataAsInteger(); decoder.getNextParameter(); std::string token = decoder.getDataAsString(); clearAnswer(); if( status == 2 || status == 3 ) { LEAVE( "RnpClientComm::executeExecuteUpdateQuery(): exception, status = " << status ); throw r_Equery_execution_failed( errNo, lineNo, colNo, token.c_str() ); } if( status == 1 ) { LEAVE( "RnpClientComm::executeExecuteUpdateQuery(): exception, status = " << status ); throw r_Error( r_Error::r_Error_ClientUnknown ); } if( status > 3 ) { LEAVE( "RnpClientComm::executeExecuteUpdateQuery(): exception, status = " << status ); throw r_Error( r_Error::r_Error_TransferFailed ); } LEAVE( "RnpClientComm::executeExecuteUpdateQuery()" ); } r_OId RnpClientComm::executeGetNewOId( unsigned short objType ) throw(r_Error) { //cout<<" RnpClientComm::getNewOId: not implemented"< " << oid ); return oid; } unsigned short RnpClientComm::executeGetObjectType( const r_OId& oid ) throw(r_Error) { ENTER( "RnpClientComm::executeGetObjectType( oid=" << oid << " )" ); startRequest(RnpRasserver::cmd_getobjecttype); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_oidstring, oid.get_string_representation()); TALK( "request RnpRasserver::cmd_getobjecttype with ..., clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); int status = decoder.getDataAsInteger(); switch( status ) { case 0: break; //OK case 1: clearAnswer(); LEAVE( "RnpClientComm::executeGetObjectType(): exception, status = " << status ); throw r_Error( r_Error::r_Error_ClientUnknown ); break; case 2: clearAnswer(); LEAVE( "RnpClientComm::executeGetObjectType(): exception, status = " << status ); throw r_Error( r_Error::r_Error_ObjectUnknown ); break; default: clearAnswer(); LEAVE( "RnpClientComm::executeGetObjectType(): exception, status = " << status ); throw r_Error( r_Error::r_Error_TransferFailed ); break; } decoder.getNextParameter(); unsigned short objType = decoder.getDataAsInteger(); clearAnswer(); LEAVE( "RnpClientComm::executeGetObjectType() -> " << objType ); return objType; } char* RnpClientComm::executeGetTypeStructure( const char* typeName, r_Type_Type typeType ) throw(r_Error) { ENTER( "RnpClientComm::executeGetTypeStructure( typeName=" << (typeName?typeName:"(null)") << ", typeType=" << typeType << " )" ); startRequest(RnpRasserver::cmd_gettypestruct); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_typename, typeName); encoder.addInt32Parameter(RnpRasserver::pmt_typetype, typeType); TALK( "request RnpRasserver::cmd_gettypestruct with ..., clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); int status = decoder.getDataAsInteger(); switch(status) { case 0: break; //OK case 1: clearAnswer(); LEAVE( "RnpClientComm::executeGetTypeStructure(): exception, status = " << status ); throw r_Error( r_Error::r_Error_TransactionNotOpen ); break; case 2: clearAnswer(); LEAVE( "RnpClientComm::executeGetTypeStructure(): exception, status = " << status ); throw r_Error( r_Error::r_Error_DatabaseClassUndefined ); break; default: clearAnswer(); LEAVE( "RnpClientComm::executeGetTypeStructure(): exception, status = " << status ); throw r_Error( r_Error::r_Error_TransferFailed ); break; } decoder.getNextParameter(); char* typeStructure = new char [decoder.getDataLength() + 1]; strcpy(typeStructure, decoder.getDataAsString()); clearAnswer(); LEAVE( "RnpClientComm::executeGetTypeStructure() -> " << typeStructure ); return typeStructure; } int RnpClientComm::executeSetFormat( bool lTransferFormat, r_Data_Format format, const char* formatParams) { ENTER( "RnpClientComm::executeSetFormat( lTransferFormat=" << lTransferFormat << ", format=" << format << ", formatParams=" << (formatParams?formatParams:"(null)") << " )" ); startRequest(RnpRasserver::cmd_setformat); encoder.addInt32Parameter( RnpRasserver::pmt_clientid, clientID); encoder.addInt32Parameter( RnpRasserver::pmt_whichformat, lTransferFormat); encoder.addInt32Parameter( RnpRasserver::pmt_format, format); encoder.addStringParameter(RnpRasserver::pmt_formatparams, formatParams); TALK( "request RnpRasserver::cmd_setformat with ..., clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); int status = decoder.getDataAsInteger(); clearAnswer(); LEAVE( "RnpClientComm::executeSetFormat() -> " << status ); return status; } //---------------------------------------------------------- int RnpClientComm::sendAndReturnStatus() throw (r_Error) { ENTER( "RnpClientComm::sendAndReturnStatus()" ); sendRequestGetAnswer(); int status = decoder.getDataAsInteger(); clearAnswer(); LEAVE( "RnpClientComm::sendAndReturnStatus() -> " << status ); return status; } void RnpClientComm::sendRequestGetAnswer() throw (r_Error) { ENTER( "RnpClientComm::sendRequestGetAnswer()" ); RnpBaseClientComm::setMaxRetry(RNP_MAX_RETRY); // defined in raslib/rminit.hh -- PB 2005-sep-01 if(RnpBaseClientComm::sendRequestGetAnswer() == false) { clearAnswer(); LEAVE( "RnpClientComm::sendRequestGetAnswer(): exception, sendRequestGetAnswer() == false" ); throw r_Error( r_Error::r_Error_TransferFailed); } detectErrors(); if(decoder.countParameters() > 0) decoder.getFirstParameter(); LEAVE( "RnpClientComm::sendRequestGetAnswer()" ); } void RnpClientComm::helper012d(const char* caller) throw (r_Error) { int status = sendAndReturnStatus(); switch( status ) { case 0: break; case 1: TALK( "RnpClientComm::helper012d( " << (caller?caller:"(null)") << " ): error: status = " << status ); throw r_Error( r_Error::r_Error_ClientUnknown ); break; case 2: TALK( "RnpClientComm::helper012d( " << (caller?caller:"(null)") << " ): error: status = " << status ); throw r_Error( r_Error::r_Error_ObjectUnknown ); break; default: TALK( "RnpClientComm::helper012d( " << (caller?caller:"(null)") << " ): error: status = " << status ); throw r_Error( r_Error::r_Error_General ); break; } } bool RnpClientComm::detectErrors() { if(decoder.getFragmentType() != Rnp::fgt_Error) return false; reassemble_r_Error() ; return true; } void RnpClientComm::reassemble_r_Error() throw (r_Error) { decoder.getFirstParameter(); if(decoder.getParameterType() != Rnp::ert_Other) return; decoder.getNextParameter(); r_Error *temp = r_Error::getAnyError((char*)decoder.getDataAsString()); r_Error err = *temp; delete temp; TALK( "npClientComm::reassemble_r_Error() throwing exception: " << (char*)decoder.getDataAsString() ); throw err; } void RnpClientComm::setTimeoutInterval(int seconds) { akg::NbJob::setTimeoutInterval(seconds); } int RnpClientComm::getTimeoutInterval() { return akg::NbJob::getTimeoutInterval(); } //## unofficial functions r_OId RnpClientComm::createCollection(const char *collName, const char *collTypeName) throw(r_Error) { ENTER( "RnpClientComm::createCollection( collName=" << (collName?collName:"(null)") << ", collTypeName=" << (collTypeName?collTypeName:"(null)") << " )" ); checkForRwTransaction(); startRequest(RnpRasserver::cmd_createcollection); encoder.addInt32Parameter( RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_collname, collName); encoder.addStringParameter(RnpRasserver::pmt_typename, collTypeName); TALK( "request RnpRasserver::cmd_createcollection with ..., clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); r_OId oid(decoder.getDataAsString()); clearAnswer(); LEAVE( "RnpClientComm::createCollection() -> " << oid ); return oid; } r_OId RnpClientComm::createMDD(const char* collName, const char* mddTypeName, const char* definitionDomain, const char *tileDomain, bool rcindex) throw(r_Error) { ENTER( "RnpClientComm::createMDD( collName=" << (collName?collName:"(null)") << "; mddTypeName=" << (mddTypeName?mddTypeName:"(null)") << ", definitionDomain=" << (definitionDomain?definitionDomain:"(null)") << ", tileDomain=" << (tileDomain?tileDomain:"(null)") << ", rcindex=" << rcindex << " )" ); checkForRwTransaction(); startRequest(RnpRasserver::cmd_createmdd); encoder.addInt32Parameter( RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_collname, collName); encoder.addStringParameter(RnpRasserver::pmt_typename, mddTypeName); encoder.addStringParameter(RnpRasserver::pmt_domain, definitionDomain); encoder.addInt32Parameter( RnpRasserver::pmt_indextype, rcindex); encoder.addStringParameter(RnpRasserver::pmt_domain, tileDomain); TALK( "request RnpRasserver::cmd_createmdd with collName " << collName << ", mddTypeName " << mddTypeName << ", definitionDomain " << definitionDomain << ", rcindex " << rcindex << ", tileDomain " << tileDomain << ", clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); r_OId oid(decoder.getDataAsString()); TALK( "RnpClientComm::createMDD() receiving oid " << oid ); clearAnswer(); LEAVE( "RnpClientComm::createMDD() -> " << oid ); return oid; } void RnpClientComm::extendMDD(r_OId mddOId, const char *stripeDomain, const char* tileDomain) throw(r_Error) { ENTER( "RnpClientComm::extendMDD( mddOId=" << mddOId << ", stripeDomain=" << (stripeDomain?stripeDomain:"(null)") << ", tileDomain=" << (tileDomain?tileDomain:"(null)") << " )" ); checkForRwTransaction(); startRequest(RnpRasserver::cmd_extendmdd); encoder.addInt32Parameter( RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_oidstring, mddOId.get_string_representation()); encoder.addStringParameter(RnpRasserver::pmt_domain, stripeDomain); encoder.addStringParameter(RnpRasserver::pmt_domain, tileDomain); TALK( "request RnpRasserver::cmd_extendmdd with oid " << mddOId.get_string_representation() << ", stripeDomain " << stripeDomain << ", tileDomain " << tileDomain << ", clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); clearAnswer(); LEAVE( "RnpClientComm::extendMDD()" ); } vector RnpClientComm::getOIdsFromCollection( const char* collName ) throw( r_Error ) { ENTER( "RnpClientComm::getOIdsFromCollection( collName=" << (collName?collName:"(null)") << " )" ); vector result = executeGetOIdsFromCollection ( collName, r_OId()); LEAVE( "RnpClientComm::getOIdsFromCollection()" ); return result; } vector RnpClientComm::getOIdsFromCollection( const r_OId& oid ) throw( r_Error ) { ENTER( "RnpClientComm::getOIdsFromCollection( oid=" << oid << " )" ); vector result = executeGetOIdsFromCollection ( 0, oid ); LEAVE( "RnpClientComm::getOIdsFromCollection()" ); return result; } vector RnpClientComm::executeGetOIdsFromCollection ( const char* collName, const r_OId& oid ) throw( r_Error ) { ENTER( "RnpClientComm::executeGetOIdsFromCollection( collName=" << (collName?collName:"(null)") << ", oid=" << oid << " )" ); startRequest(RnpRasserver::cmd_getcolloids); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); TALK( "request RnpRasserver::cmd_getcolloids with clientID 0x" << hex << clientID << dec ); if( collName != NULL) { encoder.addStringParameter(RnpRasserver::pmt_collname, collName); TALK( "RnpClientComm::executeGetOIdsFromCollection() adding collName " << collName ); } else { encoder.addStringParameter(RnpRasserver::pmt_oidstring, oid.get_string_representation()); TALK( "RnpClientComm::executeGetOIdsFromCollection() adding oid " << oid.get_string_representation() ); } sendRequestGetAnswer(); int status = decoder.getDataAsInteger(); // we have to read all this, but we don't use them here decoder.getNextParameter(); const char *typeName = decoder.getDataAsString(); TALK( "RnpClientComm::executeGetOIdsFromCollection() received typeName " << typeName ); decoder.getNextParameter(); const char *typeStructure = decoder.getDataAsString(); TALK( "RnpClientComm::executeGetOIdsFromCollection() received typeStructure " << typeStructure ); decoder.getNextParameter(); const char *oidstring = decoder.getDataAsString(); TALK( "RnpClientComm::executeGetOIdsFromCollection() received oid " << oidstring ); decoder.getNextParameter(); const char *collectionName= decoder.getDataAsString(); TALK( "RnpClientComm::executeGetOIdsFromCollection() received collectionName " << collectionName ); if( status != 0 && status != 1 ) { r_Error err; switch( status ) { case 2: LEAVE( "RnpClientComm::executeGetOIdsFromCollection(): exception, status = " << status ); err = r_Error( r_Error::r_Error_ObjectUnknown ); break; case 3: LEAVE( "RnpClientComm::executeGetOIdsFromCollection(): exception, status = " << status ); err = r_Error( r_Error::r_Error_ClientUnknown ); break; default: LEAVE( "RnpClientComm::executeGetOIdsFromCollection(): exception, status = " << status ); err = r_Error( r_Error::r_Error_TransferFailed ); break; } clearAnswer(); throw err; } // create the set vector result; // fill set with oids if( status == 0 ) { while(decoder.getNextParameter() != 0) { r_OId roid( decoder.getDataAsString() ); TALK( "RnpClientComm::executeGetOIdsFromCollection() received oid set component " << roid ); result.push_back(roid); } } clearAnswer(); LEAVE( "RnpClientComm::executeGetOIdsFromCollection()" ); return result; } vector RnpClientComm::getTileDomains(r_OId mddOId, const char *stripeDomain) throw( r_Error ) { ENTER( "RnpClientComm::getTileDomains( mddOId=" << mddOId << ", stripeDomain=" << (stripeDomain?stripeDomain:"(null)") << " )" ); startRequest(RnpRasserver::cmd_gettiledomains); encoder.addInt32Parameter(RnpRasserver::pmt_clientid, clientID); encoder.addStringParameter(RnpRasserver::pmt_oidstring, mddOId.get_string_representation()); encoder.addStringParameter(RnpRasserver::pmt_domain, stripeDomain); TALK( "request RnpRasserver::cmd_gettiledomains with oid " << mddOId.get_string_representation() << ", stripeDomain " << stripeDomain << ", clientID 0x" << hex << clientID << dec ); sendRequestGetAnswer(); vector result; const RnpParameter *currParam = decoder.getFirstParameter(); while(currParam) { r_Minterval interval(decoder.getDataAsString()); TALK( "RnpClientComm::getTileDomains() received minterval " << interval ); result.push_back(interval); currParam = decoder.getNextParameter(); } clearAnswer(); LEAVE( "RnpClientComm::getTileDomains() -> " << result ); return result; }