Advertisement
Guest User

Untitled

a guest
Feb 7th, 2016
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 74.80 KB | None | 0 0
  1. /*
  2. * This file is part of rasdaman community.
  3. *
  4. * Rasdaman community is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * Rasdaman community is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with rasdaman community. If not, see <http://www.gnu.org/licenses/>.
  16. *
  17. * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
  18. rasdaman GmbH.
  19. *
  20. * For more information please see <http://www.rasdaman.org>
  21. * or contact Peter Baumann via <baumann@rasdaman.com>.
  22. */
  23.  
  24. #include <cstring>
  25. #include <fstream>
  26. #include <chrono>
  27.  
  28. #include <grpc++/grpc++.h>
  29. #include <grpc++/security/credentials.h>
  30.  
  31. #include "../rasodmg/transaction.hh"
  32. #include "../rasodmg/database.hh"
  33. #include "../rasodmg/iterator.hh"
  34. #include "../rasodmg/set.hh"
  35. #include "../rasodmg/ref.hh"
  36. #include "../rasodmg/storagelayout.hh"
  37. #include "../rasodmg/tiling.hh"
  38.  
  39. #include "../raslib/minterval.hh"
  40. #include "../raslib/rminit.hh"
  41. #include "../raslib/primitivetype.hh"
  42. #include "../raslib/complextype.hh"
  43. #include "../raslib/structuretype.hh"
  44. #include "../raslib/primitive.hh"
  45. #include "../raslib/complex.hh"
  46. #include "../raslib/structure.hh"
  47. #include "../raslib/parseparams.hh"
  48. #include "../mymalloc/mymalloc.h"
  49.  
  50. #include "../debug/debug.hh"
  51.  
  52. #include "../common/src/crypto/crypto.hh"
  53. #include "../common/src/uuid/uuid.hh"
  54. #include "../common/src/grpc/grpcutils.hh"
  55. #include <easylogging++.h>
  56.  
  57. #include "common/src/grpc/messages/error.pb.h"
  58.  
  59. #include "globals.hh"
  60. #include "rasnetclientcomm.hh"
  61.  
  62.  
  63. using boost::scoped_ptr;
  64. using boost::shared_ptr;
  65. using boost::shared_mutex;
  66. using boost::unique_lock;
  67. using boost::thread;
  68.  
  69. using common::UUID;
  70. using common::GrpcUtils;
  71.  
  72. using grpc::Channel;
  73. using grpc::ClientContext;
  74. using grpc::Status;
  75.  
  76. using std::chrono::system_clock;
  77. using std::chrono::milliseconds;
  78.  
  79. using rasnet::service::OpenServerDatabaseReq;
  80. using rasnet::service::OpenServerDatabaseRepl;
  81. using rasnet::service::CloseServerDatabaseReq;
  82. using rasnet::service::AbortTransactionRepl;
  83. using rasnet::service::AbortTransactionReq;
  84. using rasnet::service::BeginTransactionRepl;
  85. using rasnet::service::BeginTransactionReq;
  86. using rasnet::service::CloseDbReq;
  87. using rasnet::service::CloseDbReq;
  88. using rasnet::service::ConnectReq;
  89. using rasnet::service::ConnectRepl;
  90. using rasnet::service::OpenDbReq;
  91. using rasnet::service::OpenDbRepl;
  92. using rasnet::service::DisconnectReq;
  93. using rasnet::service::Void;
  94. using rasnet::service::CommitTransactionRepl;
  95. using rasnet::service::CommitTransactionReq;
  96. using rasnet::service::DeleteCollectionByNameRepl;
  97. using rasnet::service::DeleteCollectionByNameReq;
  98. using rasnet::service::DeleteCollectionByOidRepl;
  99. using rasnet::service::DeleteCollectionByOidReq;
  100. using rasnet::service::EndInsertMDDRepl;
  101. using rasnet::service::EndInsertMDDReq;
  102. using rasnet::service::EndTransferRepl;
  103. using rasnet::service::EndTransferReq;
  104. using rasnet::service::ExecuteQueryRepl;
  105. using rasnet::service::ExecuteQueryReq;
  106. using rasnet::service::ExecuteUpdateQueryRepl;
  107. using rasnet::service::ExecuteUpdateQueryReq;
  108. using rasnet::service::ExecuteInsertQueryReq;
  109. using rasnet::service::ExecuteInsertQueryRepl;
  110. using rasnet::service::GetCollOidsByNameOrOidRepl;
  111. using rasnet::service::GetCollOidsByNameOrOidReq;
  112. using rasnet::service::GetCollectionByNameOrOidRepl;
  113. using rasnet::service::GetCollectionByNameOrOidReq;
  114. using rasnet::service::GetNewOidRepl;
  115. using rasnet::service::GetNewOidReq;
  116. using rasnet::service::GetNextElementRepl;
  117. using rasnet::service::GetNextElementReq;
  118. using rasnet::service::GetNextMDDRepl;
  119. using rasnet::service::GetNextMDDReq;
  120. using rasnet::service::GetNextTileRepl;
  121. using rasnet::service::GetNextTileReq;
  122. using rasnet::service::GetObjectTypeRepl;
  123. using rasnet::service::GetObjectTypeReq;
  124. using rasnet::service::GetTypeStructureRepl;
  125. using rasnet::service::GetTypeStructureReq;
  126. using rasnet::service::InitUpdateRepl;
  127. using rasnet::service::InitUpdateReq;
  128. using rasnet::service::InsertCollectionRepl;
  129. using rasnet::service::InsertCollectionReq;
  130. using rasnet::service::InsertTileRepl;
  131. using rasnet::service::InsertTileReq;
  132. using rasnet::service::RemoveObjectFromCollectionRepl;
  133. using rasnet::service::RemoveObjectFromCollectionReq;
  134. using rasnet::service::SetFormatRepl;
  135. using rasnet::service::SetFormatReq;
  136. using rasnet::service::StartInsertMDDRepl;
  137. using rasnet::service::StartInsertMDDReq;
  138. using rasnet::service::StartInsertTransMDDRepl;
  139. using rasnet::service::StartInsertTransMDDReq;
  140. using rasnet::service::KeepAliveReq;
  141. using rasnet::service::KeepAliveRequest;
  142. using rasnet::service::TurboQueryRequest;
  143. using rasnet::service::TurboQueryResponse;
  144. using rasnet::service::TurboQueryResultObject;
  145. using common::ErrorMessage;
  146.  
  147. using std::string;
  148.  
  149. const unsigned int CLIENT_COMMUNICATION_FAILURE = 237;
  150.  
  151. RasnetClientComm::RasnetClientComm(string rasmgrHost, int rasmgrPort):
  152. transferFormatParams(NULL),
  153. storageFormatParams(NULL)
  154. {
  155. this->clientId = 0;
  156.  
  157. clientParams = new r_Parse_Params();
  158.  
  159. this->rasmgrHost = GrpcUtils::constructAddressString(rasmgrHost, rasmgrPort);
  160.  
  161. this->initializedRasMgrService = false;
  162. this->initializedRasServerService = false;
  163. }
  164.  
  165. RasnetClientComm::~RasnetClientComm() throw()
  166. {
  167. this->stopRasMgrKeepAlive();
  168. this->stopRasServerKeepAlive();
  169.  
  170. closeRasmgrService();
  171. closeRasserverService();
  172.  
  173. if (clientParams != NULL)
  174. {
  175. delete clientParams;
  176. clientParams = NULL;
  177. }
  178. }
  179.  
  180. int RasnetClientComm::connectClient(string userName, string passwordHash)
  181. {
  182. ConnectReq connectReq;
  183. ConnectRepl connectRepl;
  184.  
  185. connectReq.set_username(userName);
  186. connectReq.set_passwordhash(passwordHash);
  187.  
  188. ClientContext context;
  189. grpc::Status status = this->getRasMgrService()->Connect(&context, connectReq, &connectRepl);
  190.  
  191. if (!status.ok())
  192. {
  193. handleError(status.error_message());
  194. }
  195.  
  196. //Kept for backwards compatibility
  197. this->clientId = static_cast<long unsigned int>(common::UUID::generateIntId());
  198. this->clientUUID = connectRepl.clientuuid();
  199.  
  200. // Send keep alive messages to rasmgr until openDB is called
  201. this->keepAliveTimeout = connectRepl.keepalivetimeout();
  202. this->startRasMgrKeepAlive();
  203.  
  204. return 0;
  205. }
  206.  
  207. int RasnetClientComm::disconnectClient()
  208. {
  209. DisconnectReq disconnectReq;
  210. Void disconnectRepl;
  211.  
  212. disconnectReq.set_clientuuid(this->clientUUID);
  213.  
  214. ClientContext context;
  215. grpc::Status status = this->getRasMgrService()->Disconnect(&context, disconnectReq, &disconnectRepl);
  216.  
  217. this->stopRasMgrKeepAlive();
  218. this->closeRasmgrService();
  219.  
  220. if (!status.ok())
  221. {
  222. handleError(status.error_message());
  223. }
  224.  
  225. return 0;
  226. }
  227.  
  228. int RasnetClientComm::openDB(const char *database)
  229. {
  230. int retval = 0;
  231.  
  232. OpenDbReq openDatabaseReq;
  233. OpenDbRepl openDatabaseRepl;
  234.  
  235. openDatabaseReq.set_clientid(this->clientId);
  236. openDatabaseReq.set_clientuuid(this->clientUUID.c_str());
  237. openDatabaseReq.set_databasename(database);
  238.  
  239. ClientContext openDbContext;
  240. grpc::Status openDbStatus = this->getRasMgrService()->OpenDb(&openDbContext, openDatabaseReq, &openDatabaseRepl);
  241.  
  242. this->remoteClientUUID = openDatabaseRepl.clientsessionid();
  243. // If the allocated server belongs to the current rasmgr,
  244. // We can stop sending keep alive messages to the current rasmgr.
  245.  
  246. if(this->remoteClientUUID==this->clientUUID)
  247. {
  248. LDEBUG<<"Stopping rasmgr keep alive.";
  249. //stop sending keep alive messages to rasmgr
  250. this->stopRasMgrKeepAlive();
  251. }
  252.  
  253. if (!openDbStatus.ok())
  254. {
  255. string errorText = openDbStatus.error_message();
  256. handleError(errorText);
  257. }
  258.  
  259. this->rasServerHost = openDatabaseRepl.serverhostname();
  260. this->rasServerPort = openDatabaseRepl.port();
  261. this->sessionId = openDatabaseRepl.dbsessionid();
  262.  
  263. OpenServerDatabaseReq openServerDatabaseReq;
  264. OpenServerDatabaseRepl openServerDatabaseRepl;
  265.  
  266. openServerDatabaseReq.set_client_id(this->clientId);
  267. openServerDatabaseReq.set_database_name(database);
  268.  
  269. grpc::ClientContext openServerDbContext;
  270. grpc::Status openServerDbStatus = this->getRasServerService()->OpenServerDatabase(&openServerDbContext, openServerDatabaseReq, &openServerDatabaseRepl);
  271.  
  272. if (!openServerDbStatus.ok())
  273. {
  274. handleError(openServerDbStatus.error_message());
  275. }
  276.  
  277. // Send keep alive messages to rasserver until openDB is called
  278. this->startRasServerKeepAlive();
  279.  
  280. return retval;
  281. }
  282.  
  283. int RasnetClientComm::closeDB()
  284. {
  285. int retval = 0;
  286.  
  287. try
  288. {
  289. CloseServerDatabaseReq closeServerDatabaseReq;
  290. CloseDbReq closeDbReq;
  291. Void closeDatabaseRepl;
  292.  
  293. closeServerDatabaseReq.set_client_id(this->clientId);
  294. closeDbReq.set_clientid(this->clientId);
  295.  
  296. // The remoteClientUUID identifies local and remote sessions
  297. closeDbReq.set_clientuuid(this->remoteClientUUID);
  298. closeDbReq.set_dbsessionid(this->sessionId);
  299.  
  300. grpc::ClientContext closeServerDbContext;
  301. grpc::Status closeServerDbStatus = this->getRasServerService()->CloseServerDatabase(&closeServerDbContext, closeServerDatabaseReq, &closeDatabaseRepl);
  302. if(!closeServerDbStatus.ok())
  303. {
  304. handleError(closeServerDbStatus.error_message());
  305. }
  306.  
  307. grpc::ClientContext closeDbContext;
  308. grpc::Status closeDbStatus = this->getRasMgrService()->CloseDb(&closeDbContext, closeDbReq, &closeDatabaseRepl);
  309. if(!closeDbStatus.ok())
  310. {
  311. handleError(closeDbStatus.error_message());
  312. }
  313.  
  314. this->stopRasServerKeepAlive();
  315.  
  316. this->disconnectClient();
  317.  
  318. this->closeRasserverService();
  319. }
  320. catch(...)
  321. {
  322. LDEBUG<<"Closing database failed.";
  323. }
  324.  
  325. return retval;
  326. }
  327.  
  328. int RasnetClientComm::createDB(const char *name) throw (r_Error)
  329. {
  330. char* errorStr = strdup("Not implemented exception;");
  331. r_Error* error = r_Error::getAnyError(errorStr);
  332. r_Error tmp = *error;
  333. delete error;
  334. delete errorStr;
  335. throw tmp;
  336. }
  337.  
  338. int RasnetClientComm::destroyDB(const char *name) throw (r_Error)
  339. {
  340. char* errorStr = strdup("Not implemented exception;");
  341. r_Error* error = r_Error::getAnyError(errorStr);
  342. r_Error tmp = *error;
  343. delete error;
  344. delete errorStr;
  345. throw tmp;
  346. }
  347.  
  348. int RasnetClientComm::openTA(unsigned short readOnly) throw (r_Error)
  349. {
  350. int retval = 1;
  351.  
  352. BeginTransactionReq beginTransactionReq;
  353. BeginTransactionRepl beginTransactionRepl;
  354.  
  355. beginTransactionReq.set_rw(readOnly == 0);
  356. beginTransactionReq.set_client_id(this->clientId);
  357.  
  358. grpc::ClientContext context;
  359. grpc::Status beginTransationStatus = this->getRasServerService()->BeginTransaction(&context, beginTransactionReq, &beginTransactionRepl);
  360. if (!beginTransationStatus.ok())
  361. {
  362. const char* errorText = beginTransationStatus.error_message().c_str();
  363. throw r_Ebase_dbms(r_Error::r_Error_TransactionOpen, errorText);
  364. }
  365.  
  366. return retval;
  367. }
  368.  
  369. int RasnetClientComm::commitTA() throw (r_Error)
  370. {
  371. int retval = 1;
  372.  
  373. CommitTransactionReq commitTransactionReq;
  374. CommitTransactionRepl commitTransactionRepl;
  375.  
  376. commitTransactionReq.set_client_id(this->clientId);
  377.  
  378. grpc::ClientContext context;
  379. grpc::Status commitStatus = this->getRasServerService()->CommitTransaction(&context, commitTransactionReq, &commitTransactionRepl);
  380.  
  381. if (!commitStatus.ok())
  382. {
  383. handleError(commitStatus.error_message());
  384. }
  385.  
  386. return retval;
  387. }
  388.  
  389. int RasnetClientComm::abortTA()
  390. {
  391. try
  392. {
  393. AbortTransactionReq abortTransactionReq;
  394. AbortTransactionRepl AbortTransactionRepl;
  395.  
  396. abortTransactionReq.set_client_id(this->clientId);
  397.  
  398. grpc::ClientContext context;
  399. grpc::Status abortTransactionStatus = this->getRasServerService()->AbortTransaction(&context, abortTransactionReq, &AbortTransactionRepl);
  400. if (!abortTransactionStatus.ok())
  401. {
  402. handleError(abortTransactionStatus.error_message());
  403. }
  404. }
  405. catch(...)
  406. {
  407. LDEBUG<<"Aborting transaction failed.";
  408. }
  409.  
  410. return 0;
  411. }
  412.  
  413. void RasnetClientComm::insertMDD(const char *collName, r_GMarray *mar) throw (r_Error)
  414. {
  415. checkForRwTransaction();
  416.  
  417. r_Minterval spatdom;
  418. r_Bytes marBytes;
  419. RPCMarray* rpcMarray;
  420. r_Bytes tileSize = 0;
  421.  
  422. // get the spatial domain of the r_GMarray
  423. spatdom = mar->spatial_domain();
  424.  
  425. // determine the amount of data to be transferred
  426. marBytes = mar->get_array_size();
  427.  
  428. const r_Base_Type* baseType = mar->get_base_type_schema();
  429.  
  430. // if the MDD is too large for being transfered as one block, it has to be
  431. // divided in tiles
  432. const r_Tiling* til = mar->get_storage_layout()->get_tiling();
  433. r_Tiling_Scheme scheme = til->get_tiling_scheme();
  434. if (scheme == r_NoTiling)
  435. tileSize = RMInit::RMInit::clientTileSize;
  436. else
  437. //allowed because the only subclass of tiling without size is no tiling
  438. tileSize = ((const r_Size_Tiling*)til)->get_tile_size();
  439.  
  440.  
  441. // initiate composition of MDD at server side
  442. int status = executeStartInsertPersMDD(collName, mar); //rpcStatusPtr = rpcstartinsertpersmdd_1( params, binding_h );
  443.  
  444. switch( status )
  445. {
  446. case 0:
  447. break; // OK
  448. case 2:
  449. throw r_Error( r_Error::r_Error_DatabaseClassUndefined );
  450. break;
  451. case 3:
  452. throw r_Error( r_Error::r_Error_CollectionElementTypeMismatch );
  453. break;
  454. case 4:
  455. throw r_Error( r_Error::r_Error_TypeInvalid );
  456. break;
  457. default:
  458. throw r_Error( r_Error::r_Error_TransferFailed );
  459. break;
  460. }
  461.  
  462. r_Set< r_GMarray* >* bagOfTiles;
  463.  
  464. bagOfTiles = mar->get_storage_layout()->decomposeMDD( mar );
  465.  
  466. LTRACE << "decomposing into " << bagOfTiles->cardinality() << " tiles";
  467.  
  468. r_Iterator< r_GMarray* > iter = bagOfTiles->create_iterator();
  469. r_GMarray *origTile;
  470.  
  471. for(iter.reset(); iter.not_done(); iter.advance() )
  472. {
  473. origTile = *iter;
  474.  
  475. LTRACE << "inserting Tile with domain " << origTile->spatial_domain() << ", " << origTile->spatial_domain().cell_count() * origTile->get_type_length() << " bytes";
  476.  
  477. getMarRpcRepresentation( origTile, rpcMarray, mar->get_storage_layout()->get_storage_format(), baseType );
  478.  
  479. status = executeInsertTile(true, rpcMarray);
  480.  
  481. // free rpcMarray structure (rpcMarray->data.confarray_val is freed somewhere else)
  482. freeMarRpcRepresentation( origTile, rpcMarray );
  483.  
  484. // delete current tile (including data block)
  485. delete origTile;
  486.  
  487. if( status > 0 )
  488. {
  489. throw r_Error( r_Error::r_Error_TransferFailed );
  490. }
  491. }
  492.  
  493. executeEndInsertMDD(true); //rpcendinsertmdd_1( params3, binding_h );
  494.  
  495. // delete transient data
  496. bagOfTiles->remove_all();
  497. delete bagOfTiles;
  498. }
  499.  
  500. r_Ref_Any RasnetClientComm::getMDDByOId(const r_OId &oid) throw (r_Error)
  501. {
  502. LDEBUG << "Internal error: RasnetClientComm::getMDDByOId() not implemented, returning empty r_Ref_Any().";
  503. return r_Ref_Any();
  504. }
  505.  
  506. void RasnetClientComm::insertColl(const char *collName, const char *typeName, const r_OId &oid) throw (r_Error)
  507. {
  508. checkForRwTransaction();
  509.  
  510. InsertCollectionReq insertCollectionReq;
  511. InsertCollectionRepl insertCollectionRepl;
  512.  
  513. insertCollectionReq.set_client_id(this->clientId);
  514. insertCollectionReq.set_collection_name(collName);
  515. insertCollectionReq.set_type_name(typeName);
  516. insertCollectionReq.set_oid(oid.get_string_representation());
  517.  
  518. grpc::ClientContext context;
  519. grpc::Status insertStatus = this->getRasServerService()->InsertCollection(&context, insertCollectionReq, &insertCollectionRepl);
  520. if (!insertStatus .ok())
  521. {
  522. handleError(insertStatus.error_message());
  523. }
  524.  
  525. int status = insertCollectionRepl.status();
  526.  
  527. handleStatusCode(status, "insertColl");
  528. }
  529.  
  530. void RasnetClientComm::deleteCollByName(const char *collName) throw (r_Error)
  531. {
  532. checkForRwTransaction();
  533.  
  534. DeleteCollectionByNameReq deleteCollectionByNameReq;
  535. DeleteCollectionByNameRepl deleteCollectionByNameRepl;
  536.  
  537. deleteCollectionByNameReq.set_client_id(this->clientId);
  538. deleteCollectionByNameReq.set_collection_name(collName);
  539.  
  540. grpc::ClientContext context;
  541. grpc::Status deleteCollectionStatus = this->getRasServerService()->DeleteCollectionByName(&context, deleteCollectionByNameReq, &deleteCollectionByNameRepl);
  542. if (!deleteCollectionStatus.ok())
  543. {
  544. handleError(deleteCollectionStatus.error_message());
  545. }
  546.  
  547. handleStatusCode(deleteCollectionByNameRepl.status(), "deleteCollByName");
  548. }
  549.  
  550. void RasnetClientComm::deleteObjByOId(const r_OId &oid) throw (r_Error)
  551. {
  552. checkForRwTransaction();
  553.  
  554. DeleteCollectionByOidReq deleteCollectionByOidReq;
  555. DeleteCollectionByOidRepl deleteCollectionByOidRepl;
  556.  
  557. deleteCollectionByOidReq.set_client_id(this->clientId);
  558. deleteCollectionByOidReq.set_oid(oid.get_string_representation());
  559.  
  560. grpc::ClientContext context;
  561. grpc::Status deleteCollectionStatus = this->getRasServerService()->DeleteCollectionByOid(&context, deleteCollectionByOidReq, &deleteCollectionByOidRepl);
  562. if (!deleteCollectionStatus.ok())
  563. {
  564. handleError(deleteCollectionStatus.error_message());
  565. }
  566.  
  567. handleStatusCode(deleteCollectionByOidRepl.status(), "deleteCollByName");
  568. }
  569.  
  570. void RasnetClientComm::removeObjFromColl(const char *name, const r_OId &oid) throw (r_Error)
  571. {
  572. checkForRwTransaction();
  573.  
  574. RemoveObjectFromCollectionReq removeObjectFromCollectionReq;
  575. RemoveObjectFromCollectionRepl removeObjectFromCollectionRepl;
  576.  
  577. removeObjectFromCollectionReq.set_client_id(this->clientId);
  578. removeObjectFromCollectionReq.set_collection_name(name);
  579. removeObjectFromCollectionReq.set_oid(oid.get_string_representation());
  580.  
  581. grpc::ClientContext context;
  582. grpc::Status removeObjectStatus = this->getRasServerService()->RemoveObjectFromCollection(&context, removeObjectFromCollectionReq, &removeObjectFromCollectionRepl);
  583. if (!removeObjectStatus.ok())
  584. {
  585. handleError(removeObjectStatus.error_message());
  586. }
  587.  
  588. int status = removeObjectFromCollectionRepl.status();
  589. handleStatusCode(status, "removeObjFromColl");
  590. }
  591.  
  592. r_Ref_Any RasnetClientComm::getCollByName(const char *name) throw (r_Error)
  593. {
  594. r_Ref_Any result = executeGetCollByNameOrOId ( name, r_OId() );
  595. return result;
  596. }
  597.  
  598. r_Ref_Any RasnetClientComm::getCollByOId(const r_OId &oid) throw (r_Error)
  599. {
  600. r_Ref_Any result = executeGetCollByNameOrOId ( NULL, oid );
  601.  
  602. return result;
  603. }
  604.  
  605. r_Ref_Any RasnetClientComm::getCollOIdsByName(const char *name) throw (r_Error)
  606. {
  607. r_Ref_Any result = executeGetCollOIdsByNameOrOId ( name, r_OId() );
  608.  
  609. return result;
  610. }
  611.  
  612. r_Ref_Any RasnetClientComm::getCollOIdsByOId(const r_OId &oid) throw (r_Error)
  613. {
  614. r_Ref_Any result = executeGetCollOIdsByNameOrOId ( NULL, oid );
  615.  
  616. return result;
  617. }
  618.  
  619. void RasnetClientComm::executeQuery(const r_OQL_Query &query, r_Set<r_Ref_Any> &result) throw (r_Error)
  620. {
  621. sendMDDConstants(query);
  622. int status = executeExecuteQuery( query.get_query(), result );
  623.  
  624. switch(status)
  625. {
  626. case 0:
  627. getMDDCollection( result, 1 );
  628. break; // 1== isQuery
  629. case 1:
  630. getElementCollection( result );
  631. break;
  632. case 2:
  633. // Status 2 - empty result. Should not be treated as default.
  634. break;
  635. default:
  636. LDEBUG << "Internal error: RasnetClientComm::executeQuery(): illegal status value " << status;
  637. }
  638.  
  639. }
  640.  
  641. void RasnetClientComm::executeQuery(const r_OQL_Query &query) throw (r_Error)
  642. {
  643. checkForRwTransaction();
  644.  
  645. sendMDDConstants(query);
  646.  
  647. executeExecuteUpdateQuery(query.get_query());
  648. }
  649.  
  650. void RasnetClientComm::executeQuery(const r_OQL_Query &query, r_Set<r_Ref_Any> &result, int dummy) throw (r_Error)
  651. {
  652. checkForRwTransaction();
  653.  
  654. sendMDDConstants(query);
  655.  
  656. int status = executeExecuteUpdateQuery(query.get_query(), result);
  657.  
  658. LDEBUG <<"executeUpdateQuery (retrieval) returns " << status;
  659.  
  660. switch(status)
  661. {
  662. case 0:
  663. getMDDCollection( result, 1 );
  664. break; // 1== isQuery
  665. case 1:
  666. getElementCollection( result );
  667. break;
  668. case 2:
  669. // empty result, should not be treated as default case
  670. break;
  671. default:
  672. LDEBUG << "Internal error: RasnetClientComm::executeQuery(): illegal status value " << status;
  673. }
  674.  
  675. }
  676.  
  677. r_OId RasnetClientComm::getNewOId(unsigned short objType) throw (r_Error)
  678. {
  679. GetNewOidReq getNewOidReq;
  680. GetNewOidRepl getNewOidRepl;
  681.  
  682. getNewOidReq.set_client_id(this->clientId);
  683. getNewOidReq.set_object_type(objType);
  684.  
  685. grpc::ClientContext context;
  686. grpc::Status getOidStatus = this->getRasServerService()->GetNewOid(&context, getNewOidReq, &getNewOidRepl);
  687. if (!getOidStatus.ok())
  688. {
  689. handleError(getOidStatus.error_message());
  690. }
  691.  
  692. r_OId oid(getNewOidRepl.oid().c_str());
  693. return oid;
  694. }
  695.  
  696. unsigned short RasnetClientComm::getObjectType(const r_OId &oid) throw (r_Error)
  697. {
  698. GetObjectTypeReq getObjectTypeReq;
  699. GetObjectTypeRepl getObjectTypeRepl;
  700.  
  701. getObjectTypeReq.set_client_id(this->clientId);
  702. getObjectTypeReq.set_oid(oid.get_string_representation());
  703.  
  704. grpc::ClientContext context;
  705. grpc::Status getObjectTypeStatus = this->getRasServerService()->GetObjectType(&context, getObjectTypeReq, &getObjectTypeRepl);
  706. if (!getObjectTypeStatus.ok())
  707. {
  708. handleError(getObjectTypeStatus.error_message());
  709. }
  710.  
  711. int status = getObjectTypeRepl.status();
  712. handleStatusCode(status, "getObjectType");
  713.  
  714. unsigned short objectType = getObjectTypeRepl.object_type();
  715. return objectType;
  716. }
  717.  
  718. char* RasnetClientComm::getTypeStructure(const char *typeName, r_Type_Type typeType) throw (r_Error)
  719. {
  720. GetTypeStructureReq getTypeStructureReq;
  721. GetTypeStructureRepl getTypeStructureRepl;
  722.  
  723. getTypeStructureReq.set_client_id(this->clientId);
  724. getTypeStructureReq.set_type_name(typeName);
  725. getTypeStructureReq.set_type_type(typeType);
  726.  
  727. grpc::ClientContext context;
  728. grpc::Status getTypesStructuresStatus = this
  729. ->getRasServerService()
  730. ->GetTypeStructure(&context, getTypeStructureReq, &getTypeStructureRepl);
  731. if (!getTypesStructuresStatus.ok())
  732. {
  733. handleError(getTypesStructuresStatus.error_message());
  734. }
  735.  
  736. int status = getTypeStructureRepl.status();
  737. handleStatusCode(status, "getTypeStructure");
  738.  
  739. char* typeStructure = strdup(getTypeStructureRepl.type_structure().c_str());
  740. return typeStructure;
  741. }
  742.  
  743. int RasnetClientComm::setTransferFormat(r_Data_Format format, const char *formatParams)
  744. {
  745. storageFormat = format;
  746.  
  747. if (storageFormatParams != NULL)
  748. {
  749. free(storageFormatParams);
  750. storageFormatParams = NULL;
  751. }
  752. if (formatParams != NULL)
  753. {
  754. storageFormatParams = (char*)mymalloc(strlen(formatParams) + 1);
  755. strcpy(storageFormatParams, formatParams);
  756. // extract ``compserver'' if present
  757. clientParams->process(storageFormatParams);
  758. }
  759.  
  760. int result = executeSetFormat( false, format, formatParams);
  761.  
  762. return result;
  763. }
  764.  
  765. int RasnetClientComm::setStorageFormat(r_Data_Format format, const char *formatParams)
  766. {
  767. transferFormat = format;
  768.  
  769. if (transferFormatParams != NULL)
  770. {
  771. free(transferFormatParams);
  772. transferFormatParams = NULL;
  773. }
  774. if (formatParams != NULL)
  775. {
  776. transferFormatParams = (char*)mymalloc(strlen(formatParams)+1);
  777. strcpy(transferFormatParams, formatParams);
  778. // extract ``exactformat'' if present
  779. clientParams->process(transferFormatParams);
  780. }
  781.  
  782. int result = executeSetFormat( true, format, formatParams);
  783. return result;
  784. }
  785.  
  786.  
  787. void RasnetClientComm::initRasserverService()
  788. {
  789. boost::unique_lock<boost::shared_mutex> lock(this->rasServerServiceMtx);
  790. if (!this->initializedRasServerService)
  791. {
  792. try
  793. {
  794. std::string rasServerAddress = GrpcUtils::constructAddressString(rasServerHost, rasServerPort);
  795. std::shared_ptr<grpc::Channel> channel( grpc::CreateChannel(rasServerAddress, grpc::InsecureCredentials()));
  796.  
  797. this->rasserverService.reset(new ::rasnet::service::ClientRassrvrService::Stub(channel));
  798. this->rasserverHealthService.reset(new common::HealthService::Stub(channel));
  799. this->initializedRasServerService = true;
  800. }
  801. catch(std::exception& ex)
  802. {
  803. LERROR<<ex.what();
  804. handleError(ex.what());
  805. }
  806. }
  807. }
  808.  
  809. boost::shared_ptr<rasnet::service::ClientRassrvrService::Stub> RasnetClientComm::getRasServerService(bool throwIfConnectionFailed)
  810. {
  811. this->initRasserverService();
  812.  
  813. // Check if the rasmgr is serving
  814. if(!GrpcUtils::isServerAlive(this->rasserverHealthService, SERVICE_CALL_TIMEOUT) && throwIfConnectionFailed)
  815. {
  816. LERROR<<"The client failed to connect to rasserver.";
  817. handleConnectionFailure();
  818. }
  819.  
  820. return this->rasserverService;
  821. }
  822.  
  823. void RasnetClientComm::closeRasserverService()
  824. {
  825. boost::unique_lock<shared_mutex> lock(this->rasServerServiceMtx);
  826. if (this->initializedRasServerService)
  827. {
  828. this->initializedRasServerService = false;
  829. this->rasserverService.reset();
  830. this->rasserverHealthService.reset();
  831. }
  832. }
  833.  
  834. boost::shared_ptr<rasnet::service::RasMgrClientService::Stub> RasnetClientComm::getRasMgrService(bool throwIfConnectionFailed)
  835. {
  836. this->initRasmgrService();
  837.  
  838. // Check if the rasmgr is serving
  839. if(!GrpcUtils::isServerAlive(this->rasmgrHealthService, SERVICE_CALL_TIMEOUT) && throwIfConnectionFailed)
  840. {
  841. LERROR<<"The client failed to connect to rasmgr.";
  842. handleConnectionFailure();
  843. }
  844.  
  845. return this->rasmgrService;
  846. }
  847.  
  848. void RasnetClientComm::initRasmgrService()
  849. {
  850. boost::unique_lock<shared_mutex> lock(this->rasMgrServiceMtx);
  851. if (!this->initializedRasMgrService)
  852. {
  853. try
  854. {
  855. std::shared_ptr<Channel> channel( grpc::CreateChannel(rasmgrHost, grpc::InsecureCredentials()));
  856. this->rasmgrService.reset(new ::rasnet::service::RasMgrClientService::Stub(channel));
  857. this->rasmgrHealthService.reset(new common::HealthService::Stub(channel));
  858.  
  859. this->initializedRasMgrService = true;
  860. }
  861. catch(std::exception& ex)
  862. {
  863. LERROR<<ex.what();
  864. handleError(ex.what());
  865. }
  866. }
  867. }
  868.  
  869. void RasnetClientComm::closeRasmgrService()
  870. {
  871. boost::unique_lock<boost::shared_mutex> lock(this->rasMgrServiceMtx);
  872. if (this->initializedRasMgrService)
  873. {
  874. this->initializedRasMgrService = false;
  875. this->rasmgrService.reset();
  876. this->rasmgrHealthService.reset();
  877. }
  878. }
  879.  
  880.  
  881. int RasnetClientComm::executeStartInsertPersMDD(const char *collName, r_GMarray *mar)
  882. {
  883. StartInsertMDDReq startInsertMDDReq;
  884. StartInsertMDDRepl startInsertMDDRepl;
  885.  
  886. startInsertMDDReq.set_client_id(this->clientId);
  887. startInsertMDDReq.set_collname(collName);
  888. startInsertMDDReq.set_domain(mar->spatial_domain().get_string_representation());
  889. startInsertMDDReq.set_type_length(mar->get_type_length());
  890. startInsertMDDReq.set_type_name(mar->get_type_name());
  891. startInsertMDDReq.set_oid(mar->get_oid().get_string_representation());
  892.  
  893. grpc::ClientContext context;
  894. grpc::Status startInsertStatus = this->getRasServerService()->StartInsertMDD(&context, startInsertMDDReq, &startInsertMDDRepl);
  895. if (!startInsertStatus.ok())
  896. {
  897. handleError(startInsertStatus.error_message());
  898. }
  899.  
  900. return startInsertMDDRepl.status();
  901. }
  902.  
  903. int RasnetClientComm::executeInsertTile(bool persistent, RPCMarray *tile)
  904. {
  905. InsertTileReq insertTileReq;
  906. InsertTileRepl insertTileRepl;
  907.  
  908. insertTileReq.set_client_id(this->clientId);
  909. insertTileReq.set_persistent(persistent);
  910. insertTileReq.set_domain(tile->domain);
  911. insertTileReq.set_type_length(tile->cellTypeLength);
  912. insertTileReq.set_current_format(tile->currentFormat);
  913. insertTileReq.set_storage_format(tile->storageFormat);
  914. insertTileReq.set_data(tile->data.confarray_val, tile->data.confarray_len);
  915. insertTileReq.set_data_length(tile->data.confarray_len);
  916.  
  917. grpc::ClientContext context;
  918. grpc::Status insertTileStatus = this->getRasServerService()->InsertTile(&context, insertTileReq, &insertTileRepl);
  919. if (!insertTileStatus.ok())
  920. {
  921. handleError(insertTileStatus.error_message());
  922. }
  923.  
  924. return insertTileRepl.status();
  925. }
  926.  
  927. void RasnetClientComm::executeEndInsertMDD(bool persistent)
  928. {
  929. EndInsertMDDReq endInsertMDDReq;
  930. EndInsertMDDRepl endInsertMDDRepl;
  931.  
  932. endInsertMDDReq.set_client_id(this->clientId);
  933. endInsertMDDReq.set_persistent(persistent);
  934.  
  935. grpc::ClientContext context;
  936. grpc::Status endInsertMDDStatus = this->getRasServerService()->EndInsertMDD(&context, endInsertMDDReq, &endInsertMDDRepl);
  937. if (!endInsertMDDStatus.ok())
  938. {
  939. handleError(endInsertMDDStatus.error_message());
  940. }
  941.  
  942. handleStatusCode(endInsertMDDRepl.status(), "executeEndInsertMDD");
  943. }
  944.  
  945. void RasnetClientComm::getMDDCollection(r_Set<r_Ref_Any> &mddColl, unsigned int isQuery) throw (r_Error)
  946. {
  947. unsigned short tileStatus=0;
  948. unsigned short mddStatus = 0;
  949.  
  950. while( mddStatus == 0 ) // repeat until all MDDs are transferred
  951. {
  952. r_Ref<r_GMarray> mddResult;
  953.  
  954. // Get spatial domain of next MDD
  955. GetMDDRes* thisResult = executeGetNextMDD();
  956.  
  957. mddStatus = thisResult->status;
  958.  
  959. if( mddStatus == 2 )
  960. {
  961. LFATAL << "Error: getMDDCollection(...) - no transfer collection or empty transfer collection";
  962. throw r_Error( r_Error::r_Error_TransferFailed );
  963. }
  964.  
  965. tileStatus = getMDDCore(mddResult, thisResult, isQuery);
  966.  
  967. // finally, insert the r_Marray into the set
  968.  
  969. mddColl.insert_element( mddResult, 1 );
  970.  
  971. free(thisResult->domain);
  972. free(thisResult->typeName);
  973. free(thisResult->typeStructure);
  974. free(thisResult->oid);
  975. delete thisResult;
  976.  
  977. if( tileStatus == 0 ) // if this is true, we're done with this collection
  978. break;
  979.  
  980. } // end while( mddStatus == 0 )
  981.  
  982. executeEndTransfer();
  983. }
  984.  
  985. int RasnetClientComm::executeEndTransfer()
  986. {
  987. EndTransferReq endTransferReq;
  988. EndTransferRepl endTransferRepl;
  989.  
  990. endTransferReq.set_client_id(this->clientId);
  991.  
  992. grpc::ClientContext context;
  993. grpc::Status endTransferStatus = this->getRasServerService()->EndTransfer(&context, endTransferReq, &endTransferRepl);
  994. if (!endTransferStatus.ok())
  995. {
  996. handleError(endTransferStatus.error_message());
  997. }
  998.  
  999. return endTransferRepl.status();
  1000. }
  1001.  
  1002. GetMDDRes* RasnetClientComm::executeGetNextMDD()
  1003. {
  1004. GetNextMDDReq getNextMDDReq;
  1005. GetNextMDDRepl getNextMDDRepl;
  1006.  
  1007. getNextMDDReq.set_client_id(this->clientId);
  1008.  
  1009. grpc::ClientContext context;
  1010. grpc::Status getNextMDD = this->getRasServerService()->GetNextMDD(&context, getNextMDDReq, &getNextMDDRepl);
  1011. if (!getNextMDD.ok())
  1012. {
  1013. handleError(getNextMDD.error_message());
  1014. }
  1015.  
  1016. GetMDDRes* result = new GetMDDRes();
  1017. result->status = getNextMDDRepl.status();
  1018. result->domain = strdup(getNextMDDRepl.domain().c_str());
  1019. result->typeName = strdup(getNextMDDRepl.type_name().c_str());
  1020. result->typeStructure = strdup(getNextMDDRepl.type_structure().c_str());
  1021. result->oid = strdup(getNextMDDRepl.oid().c_str());
  1022. result->currentFormat = getNextMDDRepl.current_format();
  1023.  
  1024. return result;
  1025. }
  1026.  
  1027. unsigned short RasnetClientComm::getMDDCore(r_Ref<r_GMarray> &mdd, GetMDDRes *thisResult, unsigned int isQuery) throw (r_Error)
  1028. {
  1029. // create r_Minterval and oid
  1030. r_Minterval mddDomain( thisResult->domain );
  1031. r_OId rOId ( thisResult->oid );
  1032. r_GMarray *marray;
  1033.  
  1034. if( isQuery )
  1035. marray = new( r_Database::actual_database, r_Object::transient, rOId ) r_GMarray();
  1036. else
  1037. marray = new( r_Database::actual_database, r_Object::read , rOId ) r_GMarray();
  1038.  
  1039. marray->set_spatial_domain( mddDomain );
  1040. marray->set_type_by_name ( thisResult->typeName );
  1041. marray->set_type_structure( thisResult->typeStructure );
  1042.  
  1043. r_Data_Format currentFormat = static_cast<r_Data_Format>(thisResult->currentFormat);
  1044. // currentFormat = r_Array;
  1045. marray->set_current_format( currentFormat );
  1046.  
  1047. r_Data_Format decompFormat;
  1048.  
  1049. const r_Base_Type *baseType = marray->get_base_type_schema();
  1050. unsigned long marrayOffset = 0;
  1051.  
  1052. // Variables needed for tile transfer
  1053. GetTileRes* tileRes=0;
  1054. unsigned short mddDim = mddDomain.dimension(); // we assume that each tile has the same dimensionality as the MDD
  1055. r_Minterval tileDomain;
  1056. r_GMarray* tile; // for temporary tile
  1057. char* memCopy;
  1058. unsigned long memCopyLen;
  1059. int tileCntr = 0;
  1060. unsigned short tileStatus = 0;
  1061.  
  1062. tileStatus = 2; // call rpcgetnexttile_1 at least once
  1063.  
  1064. while( tileStatus == 2 || tileStatus == 3 ) // while( for all tiles of the current MDD )
  1065. {
  1066. tileRes = executeGetNextTile();
  1067.  
  1068. tileStatus = tileRes->status;
  1069.  
  1070. if( tileStatus == 4 )
  1071. {
  1072. freeGetTileRes(tileRes);
  1073. LFATAL << "Error: rpcGetNextTile(...) - no tile to transfer or empty transfer collection";
  1074. throw r_Error( r_Error::r_Error_TransferFailed );
  1075. }
  1076.  
  1077. // take cellTypeLength for current MDD of the first tile
  1078. if( tileCntr == 0 )
  1079. marray->set_type_length( tileRes->marray->cellTypeLength );
  1080. tileCntr++;
  1081.  
  1082. tileDomain = r_Minterval( tileRes->marray->domain );
  1083.  
  1084. if (currentFormat == r_Array)
  1085. {
  1086. memCopyLen = tileDomain.cell_count() * marray->get_type_length(); // cell type length of the tile must be the same
  1087. if (memCopyLen < tileRes->marray->data.confarray_len)
  1088. memCopyLen = tileRes->marray->data.confarray_len; // may happen when compression expands
  1089. memCopy = new char[ memCopyLen ];
  1090.  
  1091. // create temporary tile
  1092. tile = new r_GMarray();
  1093. tile->set_spatial_domain( tileDomain );
  1094. tile->set_array( memCopy );
  1095. tile->set_array_size( memCopyLen );
  1096. tile->set_type_length( tileRes->marray->cellTypeLength );
  1097.  
  1098. // Variables needed for block transfer of a tile
  1099. unsigned long blockOffset = 0;
  1100. unsigned short subStatus = 3;
  1101. currentFormat = static_cast<r_Data_Format>(tileRes->marray->currentFormat);
  1102.  
  1103. switch( tileStatus )
  1104. {
  1105. case 3: // at least one block of the tile is left
  1106.  
  1107. // Tile arrives in several blocks -> put them together
  1108. concatArrayData(tileRes->marray->data.confarray_val, tileRes->marray->data.confarray_len, memCopy, memCopyLen, blockOffset);
  1109. freeGetTileRes(tileRes);
  1110.  
  1111. tileRes = executeGetNextTile();//rpcgetnexttile_1( &clientID, binding_h );
  1112.  
  1113. subStatus = tileRes->status;
  1114.  
  1115. if( subStatus == 4 )
  1116. {
  1117. freeGetTileRes(tileRes);
  1118. throw r_Error( r_Error::r_Error_TransferFailed );
  1119. }
  1120.  
  1121. concatArrayData(tileRes->marray->data.confarray_val, tileRes->marray->data.confarray_len, memCopy, memCopyLen, blockOffset);
  1122. freeGetTileRes(tileRes);
  1123.  
  1124. tileStatus = subStatus;
  1125. break;
  1126.  
  1127. default: // tileStatus = 0,3 last block of the current tile
  1128.  
  1129. // Tile arrives as one block.
  1130. concatArrayData(tileRes->marray->data.confarray_val, tileRes->marray->data.confarray_len, memCopy, memCopyLen, blockOffset);
  1131. freeGetTileRes(tileRes);
  1132.  
  1133. break;
  1134. }
  1135.  
  1136. char* marrayData = NULL;
  1137. // Now the tile is transferred completely, insert it into current MDD
  1138. if( tileStatus < 2 && tileCntr == 1 && (tile->spatial_domain() == marray->spatial_domain()))
  1139. {
  1140. // MDD consists of just one tile that is the same size of the mdd
  1141.  
  1142. // simply take the data memory of the tile
  1143. marray->set_array( tile->get_array() );
  1144. marray->set_array_size( tile->get_array_size() );
  1145. tile->set_array( 0 );
  1146. }
  1147. else
  1148. {
  1149. // MDD consists of more than one tile or the tile does not cover the whole domain
  1150.  
  1151. r_Bytes size = mddDomain.cell_count() * marray->get_type_length();
  1152.  
  1153. if( tileCntr == 1 )
  1154. {
  1155. // allocate memory for the MDD
  1156. marrayData = new char[ size ];
  1157. memset(marrayData, 0, size);
  1158.  
  1159. marray->set_array( marrayData );
  1160. }
  1161. else
  1162. marrayData = marray->get_array();
  1163.  
  1164.  
  1165. // copy tile data into MDD data space (optimized, relying on the internal representation of an MDD )
  1166. char* mddBlockPtr;
  1167. char* tileBlockPtr = tile->get_array();
  1168. unsigned long blockCells = static_cast<unsigned long>(tileDomain[tileDomain.dimension()-1].high()-tileDomain[tileDomain.dimension()-1].low()+1);
  1169. unsigned long blockSize = blockCells * marray->get_type_length();
  1170. unsigned long blockNo = tileDomain.cell_count() / blockCells;
  1171.  
  1172. for( unsigned long blockCtr = 0; blockCtr < blockNo; blockCtr++ )
  1173. {
  1174. mddBlockPtr = marrayData + marray->get_type_length()*mddDomain.cell_offset( tileDomain.cell_point( blockCtr * blockCells ) );
  1175. memcpy( mddBlockPtr, tileBlockPtr, blockSize );
  1176. tileBlockPtr += blockSize;
  1177. }
  1178.  
  1179. marray->set_array_size( size );
  1180. }
  1181.  
  1182. // delete temporary tile
  1183. delete tile;
  1184. }
  1185. else
  1186. {
  1187. //
  1188. // handle encoded data
  1189. //
  1190. char* marrayData = NULL;
  1191. if( tileCntr == 1 )
  1192. {
  1193. // allocate memory for the MDD
  1194. r_Bytes size = mddDomain.cell_count() * marray->get_type_length();
  1195. marrayData = new char[ size ];
  1196. memset(marrayData, 0, size);
  1197. marray->set_array( marrayData );
  1198. marray->set_array_size( size );
  1199. }
  1200. else
  1201. marrayData = marray->get_array();
  1202.  
  1203. unsigned long blockSize = tileRes->marray->data.confarray_len;
  1204. char* mddBlockPtr = marrayData + marrayOffset;
  1205. char* tileBlockPtr = tileRes->marray->data.confarray_val;
  1206. memcpy(mddBlockPtr, tileBlockPtr, blockSize);
  1207. marrayOffset += blockSize;
  1208.  
  1209. free(tileRes->marray->domain);
  1210. free(tileRes->marray->data.confarray_val);
  1211. delete tileRes->marray;
  1212. delete tileRes;
  1213. tileRes = NULL;
  1214. }
  1215.  
  1216. } // end while( MDD is not transferred completely )
  1217.  
  1218.  
  1219. mdd = r_Ref<r_GMarray>( marray->get_oid(), marray );
  1220.  
  1221. return tileStatus;
  1222. }
  1223.  
  1224. GetTileRes* RasnetClientComm::executeGetNextTile()
  1225. {
  1226. GetNextTileReq getNextTileReq;
  1227. GetNextTileRepl getNextTileRepl;
  1228.  
  1229. getNextTileReq.set_client_id(this->clientId);
  1230.  
  1231. grpc::ClientContext context;
  1232. grpc::Status getNextTileStatus = this->getRasServerService()->GetNextTile(&context, getNextTileReq, &getNextTileRepl);
  1233. if (!getNextTileStatus.ok())
  1234. {
  1235. handleError(getNextTileStatus.error_message());
  1236. }
  1237.  
  1238. GetTileRes* result = new GetTileRes();
  1239. result->marray = new RPCMarray();
  1240.  
  1241. result->status = getNextTileRepl.status();
  1242. result->marray->domain = strdup(getNextTileRepl.domain().c_str());
  1243. result->marray->cellTypeLength = getNextTileRepl.cell_type_length();
  1244. result->marray->currentFormat = getNextTileRepl.current_format();
  1245. result->marray->storageFormat = getNextTileRepl.storage_format();
  1246.  
  1247. int length = getNextTileRepl.data_length();
  1248. result->marray->data.confarray_len = length;
  1249. result->marray->data.confarray_val = (char*) mymalloc(length);
  1250. memcpy(result->marray->data.confarray_val, getNextTileRepl.data().c_str(), length);
  1251.  
  1252. return result;
  1253. }
  1254.  
  1255. void RasnetClientComm::getMarRpcRepresentation(const r_GMarray *mar, RPCMarray *&rpcMarray, r_Data_Format initStorageFormat, const r_Base_Type *baseType)
  1256. {
  1257. // allocate memory for the RPCMarray data structure and assign its fields
  1258. rpcMarray = (RPCMarray*)mymalloc( sizeof(RPCMarray) );
  1259. rpcMarray->domain = mar->spatial_domain().get_string_representation();
  1260. rpcMarray->cellTypeLength = mar->get_type_length();
  1261. rpcMarray->currentFormat = initStorageFormat;
  1262. rpcMarray->data.confarray_len = mar->get_array_size();
  1263. rpcMarray->data.confarray_val = const_cast<char*>(mar->get_array());
  1264. rpcMarray->storageFormat = initStorageFormat;
  1265. }
  1266.  
  1267.  
  1268. void RasnetClientComm::freeMarRpcRepresentation(const r_GMarray *mar, RPCMarray *rpcMarray)
  1269. {
  1270. if (rpcMarray->data.confarray_val != mar->get_array())
  1271. {
  1272. delete[] rpcMarray->data.confarray_val;
  1273. }
  1274.  
  1275. free( rpcMarray->domain );
  1276. free( rpcMarray );
  1277. }
  1278.  
  1279. int RasnetClientComm::concatArrayData( const char *source, unsigned long srcSize, char *&dest, unsigned long &destSize, unsigned long &blockOffset )
  1280. {
  1281. if (blockOffset + srcSize > destSize)
  1282. {
  1283. // need to extend dest
  1284. unsigned long newSize = blockOffset + srcSize;
  1285. char *newArray;
  1286.  
  1287. // allocate a little extra if we have to extend
  1288. newSize = newSize + newSize / 16;
  1289.  
  1290. // LTRACE << need to extend from " << destSize << " to " << newSize;
  1291.  
  1292. if ((newArray = new char[newSize]) == NULL)
  1293. {
  1294. return -1;
  1295. }
  1296.  
  1297. memcpy(newArray, dest, blockOffset);
  1298. delete [] dest;
  1299. dest = newArray;
  1300. destSize = newSize;
  1301. }
  1302.  
  1303. memcpy(dest + blockOffset, source, srcSize);
  1304. blockOffset += srcSize;
  1305.  
  1306. return 0;
  1307. }
  1308.  
  1309. void RasnetClientComm::freeGetTileRes(GetTileRes *ptr)
  1310. {
  1311. if(ptr->marray->domain)
  1312. free(ptr->marray->domain);
  1313. if(ptr->marray->data.confarray_val)
  1314. free(ptr->marray->data.confarray_val);
  1315. delete ptr->marray;
  1316. delete ptr;
  1317. }
  1318.  
  1319. r_Ref_Any RasnetClientComm::executeGetCollByNameOrOId(const char *collName, const r_OId &oid) throw( r_Error )
  1320. {
  1321. GetCollectionByNameOrOidReq getCollectionByNameOrOidReq;
  1322. GetCollectionByNameOrOidRepl getCollectionByNameOrOidRepl;
  1323.  
  1324.  
  1325. getCollectionByNameOrOidReq.set_client_id(this->clientId);
  1326.  
  1327. if (collName != NULL)
  1328. {
  1329. getCollectionByNameOrOidReq.set_collection_identifier(collName);
  1330. getCollectionByNameOrOidReq.set_is_name(true);
  1331. }
  1332. else
  1333. {
  1334. getCollectionByNameOrOidReq.set_collection_identifier(oid.get_string_representation());
  1335. getCollectionByNameOrOidReq.set_is_name(false);
  1336. }
  1337.  
  1338. grpc::ClientContext context;
  1339. grpc::Status rasServerStatus = this->getRasServerService()->GetCollectionByNameOrOid(&context, getCollectionByNameOrOidReq, &getCollectionByNameOrOidRepl);
  1340. if (!rasServerStatus.ok())
  1341. {
  1342. handleError(rasServerStatus.error_message());
  1343. }
  1344.  
  1345. int status = getCollectionByNameOrOidRepl.status();
  1346. handleStatusCode(status, "getCollByName");
  1347.  
  1348. r_OId rOId(getCollectionByNameOrOidRepl.oid().c_str());
  1349. r_Set< r_Ref_Any >* set = new ( r_Database::actual_database, r_Object::read, rOId ) r_Set< r_Ref_Any >;
  1350.  
  1351. set->set_type_by_name(getCollectionByNameOrOidRepl.type_name().c_str());
  1352. set->set_type_structure(getCollectionByNameOrOidRepl.type_structure().c_str());
  1353. set->set_object_name(getCollectionByNameOrOidRepl.collection_name().c_str());
  1354.  
  1355. if( status == 0 )
  1356. getMDDCollection( *set, 0 );
  1357. // else rpcStatus == 1 -> Result collection is empty and nothing has to be got.
  1358.  
  1359. r_Ref_Any result = r_Ref_Any( set->get_oid(), set );
  1360. return result;
  1361. }
  1362.  
  1363. r_Ref_Any RasnetClientComm::executeGetCollOIdsByNameOrOId(const char *collName, const r_OId &oid) throw( r_Error )
  1364. {
  1365. GetCollOidsByNameOrOidReq getCollOidsByNameOrOidReq;
  1366. GetCollOidsByNameOrOidRepl getCollOidsByNameOrOidRepl;
  1367.  
  1368. getCollOidsByNameOrOidReq.set_client_id(this->clientId);
  1369.  
  1370. if (collName != NULL)
  1371. {
  1372. getCollOidsByNameOrOidReq.set_collection_identifier(collName);
  1373. getCollOidsByNameOrOidReq.set_is_name(true);
  1374. }
  1375. else
  1376. {
  1377. getCollOidsByNameOrOidReq.set_collection_identifier(oid.get_string_representation());
  1378. getCollOidsByNameOrOidReq.set_is_name(false);
  1379. }
  1380.  
  1381. grpc::ClientContext context;
  1382. grpc::Status getCollOidsStatus = this->getRasServerService()->GetCollOidsByNameOrOid(&context, getCollOidsByNameOrOidReq, &getCollOidsByNameOrOidRepl);
  1383. if (!getCollOidsStatus.ok())
  1384. {
  1385. handleError(getCollOidsStatus.error_message());
  1386. }
  1387.  
  1388. int status = getCollOidsByNameOrOidRepl.status();
  1389.  
  1390. if (status != 0 && status != 1)
  1391. {
  1392. handleStatusCode(status, "executeGetCollOIdsByNameOrOId");
  1393. }
  1394.  
  1395. const char* typeName = getCollOidsByNameOrOidRepl.type_name().c_str();
  1396. const char* typeStructure = getCollOidsByNameOrOidRepl.type_structure().c_str();
  1397. const char* oidString = getCollOidsByNameOrOidRepl.oids_string().c_str();
  1398. const char* collectionName = getCollOidsByNameOrOidRepl.collection_name().c_str();
  1399.  
  1400. r_OId rOId(oidString);
  1401. r_Set< r_Ref<r_GMarray> >* set = new ( r_Database::actual_database, r_Object::read, rOId ) r_Set< r_Ref< r_GMarray > >;
  1402.  
  1403. set->set_type_by_name ( typeName );
  1404. set->set_type_structure( typeStructure );
  1405. set->set_object_name ( collName );
  1406.  
  1407. for (int i = 0; i < getCollOidsByNameOrOidRepl.oid_set_size(); ++i)
  1408. {
  1409. r_OId roid(getCollOidsByNameOrOidRepl.oid_set(i).c_str());
  1410. set->insert_element(r_Ref<r_GMarray>(roid), 1);
  1411. }
  1412.  
  1413. r_Ref_Any result = r_Ref_Any( set->get_oid(), set );
  1414. return result;
  1415. }
  1416.  
  1417. void RasnetClientComm::sendMDDConstants( const r_OQL_Query& query ) throw( r_Error )
  1418. {
  1419. unsigned short status;
  1420.  
  1421. if( query.get_constants() )
  1422. {
  1423. r_Set< r_GMarray* >* mddConstants = const_cast<r_Set< r_GMarray* >*>(query.get_constants());
  1424.  
  1425. // in fact executeInitUpdate prepares server structures for MDD transfer
  1426. if(executeInitUpdate() != 0)
  1427. {
  1428. throw r_Error( r_Error::r_Error_TransferFailed );
  1429. }
  1430.  
  1431. r_Iterator<r_GMarray*> iter = mddConstants->create_iterator();
  1432.  
  1433. for( iter.reset(); iter.not_done(); iter++ )
  1434. {
  1435. r_GMarray* mdd = *iter;
  1436.  
  1437. const r_Base_Type* baseType = mdd->get_base_type_schema();
  1438.  
  1439. if( mdd )
  1440. {
  1441. status = executeStartInsertTransMDD(mdd);
  1442. switch( status )
  1443. {
  1444. case 0:
  1445. break; // OK
  1446. case 2:
  1447. throw r_Error( r_Error::r_Error_DatabaseClassUndefined );
  1448. break;
  1449. case 3:
  1450. throw r_Error( r_Error::r_Error_TypeInvalid );
  1451. break;
  1452. default:
  1453. throw r_Error( r_Error::r_Error_TransferFailed );
  1454. break;
  1455. }
  1456.  
  1457.  
  1458. r_Set< r_GMarray* >* bagOfTiles = NULL;
  1459.  
  1460. if (mdd->get_array())
  1461. {
  1462. bagOfTiles = mdd->get_storage_layout()->decomposeMDD( mdd );
  1463. }
  1464. else
  1465. {
  1466. bagOfTiles = mdd->get_tiled_array();
  1467. }
  1468.  
  1469. r_Iterator< r_GMarray* > iter2 = bagOfTiles->create_iterator();
  1470.  
  1471. for(iter2.reset(); iter2.not_done(); iter2.advance())
  1472. {
  1473. RPCMarray* rpcMarray;
  1474.  
  1475. r_GMarray *origTile = *iter2;
  1476.  
  1477. getMarRpcRepresentation( origTile, rpcMarray, mdd->get_storage_layout()->get_storage_format(), baseType );
  1478.  
  1479. status = executeInsertTile(false, rpcMarray);
  1480.  
  1481. // free rpcMarray structure (rpcMarray->data.confarray_val is freed somewhere else)
  1482. freeMarRpcRepresentation( origTile, rpcMarray );
  1483.  
  1484. // delete current tile (including data block)
  1485. delete origTile;
  1486. origTile = NULL;
  1487.  
  1488. if( status > 0 )
  1489. {
  1490. throw r_Error( r_Error::r_Error_TransferFailed );
  1491. }
  1492. }
  1493.  
  1494. bagOfTiles->remove_all();
  1495. delete bagOfTiles;
  1496. bagOfTiles = NULL;
  1497.  
  1498. executeEndInsertMDD(false);
  1499. }
  1500. }
  1501. }
  1502. }
  1503.  
  1504. int RasnetClientComm::executeStartInsertTransMDD(r_GMarray *mdd)
  1505. {
  1506. StartInsertTransMDDReq startInsertTransMDDReq;
  1507. StartInsertTransMDDRepl startInsertTransMDDRepl;
  1508.  
  1509. startInsertTransMDDReq.set_client_id(this->clientId);
  1510. startInsertTransMDDReq.set_domain(mdd->spatial_domain().get_string_representation());
  1511. startInsertTransMDDReq.set_type_length(mdd->get_type_length());
  1512. startInsertTransMDDReq.set_type_name(mdd->get_type_name());
  1513.  
  1514. grpc::ClientContext context;
  1515. grpc::Status startInsertTransMDDStatus = this->getRasServerService()->StartInsertTransMDD(&context, startInsertTransMDDReq, &startInsertTransMDDRepl);
  1516. if (!startInsertTransMDDStatus.ok())
  1517. {
  1518. handleError(startInsertTransMDDStatus.error_message());
  1519. }
  1520.  
  1521. return startInsertTransMDDRepl.status();
  1522. }
  1523.  
  1524. int RasnetClientComm::executeInitUpdate()
  1525. {
  1526. InitUpdateReq initUpdateReq;
  1527. InitUpdateRepl initUpdateRepl;
  1528.  
  1529. initUpdateReq.set_client_id(this->clientId);
  1530.  
  1531. grpc::ClientContext context;
  1532. grpc::Status initUpdataStatus = this->getRasServerService()->InitUpdate(&context, initUpdateReq, &initUpdateRepl);
  1533. if (!initUpdataStatus.ok())
  1534. {
  1535. handleError(initUpdataStatus.error_message());
  1536. }
  1537.  
  1538. return initUpdateRepl.status();
  1539. }
  1540.  
  1541.  
  1542. int RasnetClientComm::executeExecuteQuery(const char *query, r_Set<r_Ref_Any> &result) throw( r_Error )
  1543. {
  1544. ExecuteQueryReq executeQueryReq;
  1545. ExecuteQueryRepl executeQueryRepl;
  1546.  
  1547. executeQueryReq.set_client_id(this->clientId);
  1548. executeQueryReq.set_query(query);
  1549.  
  1550. grpc::ClientContext context;
  1551. grpc::Status executeQueryStatus = this->getRasServerService()->ExecuteQuery(&context, executeQueryReq, &executeQueryRepl);
  1552. if (!executeQueryStatus.ok())
  1553. {
  1554. handleError(executeQueryStatus.error_message());
  1555. }
  1556.  
  1557. int status = executeQueryRepl.status();
  1558. int errNo = executeQueryRepl.err_no();
  1559. int lineNo = executeQueryRepl.line_no();
  1560. int colNo = executeQueryRepl.col_no();
  1561. const char* token = executeQueryRepl.token().c_str();
  1562. const char* typeName = executeQueryRepl.type_name().c_str();
  1563. const char* typeStructure = executeQueryRepl.type_structure().c_str();
  1564.  
  1565. if(status == 0 || status == 1)
  1566. {
  1567. result.set_type_by_name( typeName );
  1568. result.set_type_structure( typeStructure );
  1569. }
  1570.  
  1571. if( status == 4 || status == 5 )
  1572. {
  1573. r_Equery_execution_failed err( errNo, lineNo, colNo, token );
  1574. throw err;
  1575. }
  1576.  
  1577. return status;
  1578. }
  1579.  
  1580. GetElementRes* RasnetClientComm::executeGetNextElement()
  1581. {
  1582. GetNextElementReq getNextElementReq;
  1583. GetNextElementRepl getNextElementRepl;
  1584.  
  1585. getNextElementReq.set_client_id(this->clientId);
  1586.  
  1587. grpc::ClientContext context;
  1588. grpc::Status getNextElementStatus = this->getRasServerService()->GetNextElement(&context, getNextElementReq, &getNextElementRepl);
  1589. if (!getNextElementStatus.ok())
  1590. {
  1591. handleError(getNextElementStatus.error_message());
  1592. }
  1593.  
  1594. GetElementRes* result = new GetElementRes();
  1595.  
  1596. result->data.confarray_len = getNextElementRepl.data_length();
  1597. result->data.confarray_val = new char[getNextElementRepl.data_length()];
  1598. memcpy(result->data.confarray_val, getNextElementRepl.data().c_str(), getNextElementRepl.data_length());
  1599. result->status = getNextElementRepl.status();
  1600.  
  1601. return result;
  1602. }
  1603.  
  1604. void RasnetClientComm::getElementCollection( r_Set< r_Ref_Any >& resultColl ) throw(r_Error)
  1605. {
  1606. unsigned short rpcStatus = 0;
  1607.  
  1608. LDEBUG << "got set of type " << resultColl.get_type_structure();
  1609.  
  1610. while( rpcStatus == 0 ) // repeat until all elements are transferred
  1611. {
  1612. GetElementRes* thisResult = executeGetNextElement();
  1613.  
  1614. rpcStatus = thisResult->status;
  1615.  
  1616. if( rpcStatus == 2 )
  1617. {
  1618. throw r_Error( r_Error::r_Error_TransferFailed );
  1619. }
  1620. // create new collection element, use type of collection resultColl
  1621. r_Ref_Any element;
  1622. const r_Type* elementType = resultColl.get_element_type_schema();
  1623.  
  1624. switch( elementType->type_id() )
  1625. {
  1626. case r_Type::BOOL:
  1627. case r_Type::CHAR:
  1628. case r_Type::OCTET:
  1629. case r_Type::SHORT:
  1630. case r_Type::USHORT:
  1631. case r_Type::LONG:
  1632. case r_Type::ULONG:
  1633. case r_Type::FLOAT:
  1634. case r_Type::DOUBLE:
  1635. element = new r_Primitive( thisResult->data.confarray_val, static_cast<r_Primitive_Type*>(const_cast<r_Type*>(elementType)) );
  1636. r_Transaction::actual_transaction->add_object_list( r_Transaction::SCALAR, (void*) element );
  1637. break;
  1638.  
  1639. case r_Type::COMPLEXTYPE1:
  1640. case r_Type::COMPLEXTYPE2:
  1641. element = new r_Complex(thisResult->data.confarray_val, static_cast<r_Complex_Type *>(const_cast<r_Type*>(elementType)) );
  1642. r_Transaction::actual_transaction->add_object_list(r_Transaction::SCALAR, (void *)element);
  1643. break;
  1644.  
  1645. case r_Type::STRUCTURETYPE:
  1646. element = new r_Structure( thisResult->data.confarray_val, static_cast<r_Structure_Type*>(const_cast<r_Type*>(elementType)) );
  1647. r_Transaction::actual_transaction->add_object_list( r_Transaction::SCALAR, (void*) element );
  1648. break;
  1649.  
  1650. case r_Type::POINTTYPE:
  1651. {
  1652. char* stringRep = new char[thisResult->data.confarray_len+1];
  1653. strncpy( stringRep, thisResult->data.confarray_val, thisResult->data.confarray_len );
  1654. stringRep[thisResult->data.confarray_len] = '\0';
  1655.  
  1656. r_Point* typedElement = new r_Point( stringRep );
  1657. element = typedElement;
  1658. r_Transaction::actual_transaction->add_object_list( r_Transaction::POINT, (void*) typedElement );
  1659. delete [] stringRep;
  1660. }
  1661. break;
  1662.  
  1663. case r_Type::SINTERVALTYPE:
  1664. {
  1665. char* stringRep = new char[thisResult->data.confarray_len+1];
  1666. strncpy( stringRep, thisResult->data.confarray_val, thisResult->data.confarray_len );
  1667. stringRep[thisResult->data.confarray_len] = '\0';
  1668.  
  1669. r_Sinterval* typedElement = new r_Sinterval( stringRep );
  1670. element = typedElement;
  1671. r_Transaction::actual_transaction->add_object_list( r_Transaction::SINTERVAL, (void*) typedElement );
  1672. delete [] stringRep;
  1673. }
  1674. break;
  1675.  
  1676. case r_Type::MINTERVALTYPE:
  1677. {
  1678. char* stringRep = new char[thisResult->data.confarray_len+1];
  1679. strncpy( stringRep, thisResult->data.confarray_val, thisResult->data.confarray_len );
  1680. stringRep[thisResult->data.confarray_len] = '\0';
  1681.  
  1682. r_Minterval* typedElement = new r_Minterval( stringRep );
  1683. element = typedElement;
  1684. r_Transaction::actual_transaction->add_object_list( r_Transaction::MINTERVAL, (void*) typedElement );
  1685. delete [] stringRep;
  1686. }
  1687. break;
  1688.  
  1689. case r_Type::OIDTYPE:
  1690. {
  1691. char* stringRep = new char[thisResult->data.confarray_len+1];
  1692. strncpy( stringRep, thisResult->data.confarray_val, thisResult->data.confarray_len );
  1693. stringRep[thisResult->data.confarray_len] = '\0';
  1694.  
  1695. r_OId* typedElement = new r_OId( stringRep );
  1696. element = typedElement;
  1697. r_Transaction::actual_transaction->add_object_list( r_Transaction::OID, (void*) typedElement );
  1698. delete [] stringRep;
  1699. }
  1700. break;
  1701. default:
  1702. break;
  1703. }
  1704.  
  1705. LDEBUG << "got an element";
  1706.  
  1707. // insert element into result set
  1708. resultColl.insert_element( element, 1 );
  1709.  
  1710. delete[] thisResult->data.confarray_val;
  1711. delete thisResult;
  1712. }
  1713.  
  1714. executeEndTransfer();
  1715. }
  1716.  
  1717. int RasnetClientComm::executeExecuteUpdateQuery(const char *query) throw( r_Error )
  1718. {
  1719. ExecuteUpdateQueryReq executeUpdateQueryReq;
  1720. ExecuteUpdateQueryRepl executeUpdateQueryRepl;
  1721.  
  1722. executeUpdateQueryReq.set_client_id(this->clientId);
  1723. executeUpdateQueryReq.set_query(query);
  1724.  
  1725. grpc::ClientContext context;
  1726. grpc::Status executeUpdateQueryStatus = this->getRasServerService()->ExecuteUpdateQuery(&context, executeUpdateQueryReq, &executeUpdateQueryRepl);
  1727. if (!executeUpdateQueryStatus.ok())
  1728. {
  1729. handleError(executeUpdateQueryStatus.error_message());
  1730. }
  1731.  
  1732. int status = executeUpdateQueryRepl.status();
  1733. int errNo = executeUpdateQueryRepl.errono();
  1734. int lineNo = executeUpdateQueryRepl.lineno();
  1735. int colNo = executeUpdateQueryRepl.colno();
  1736.  
  1737. string token = executeUpdateQueryRepl.token();
  1738.  
  1739. if( status == 2 || status == 3 )
  1740. {
  1741. throw r_Equery_execution_failed( errNo, lineNo, colNo, token.c_str() );
  1742. }
  1743.  
  1744. if( status == 1 )
  1745. {
  1746. throw r_Error( r_Error::r_Error_ClientUnknown );
  1747. }
  1748.  
  1749. if( status > 3 )
  1750. {
  1751. throw r_Error( r_Error::r_Error_TransferFailed );
  1752. }
  1753.  
  1754. return status;
  1755. }
  1756.  
  1757. int RasnetClientComm::executeExecuteUpdateQuery(const char *query, r_Set< r_Ref_Any >& result) throw(r_Error)
  1758. {
  1759. ExecuteInsertQueryReq executeInsertQueryReq;
  1760. ExecuteInsertQueryRepl executeInsertQueryRepl;
  1761.  
  1762. executeInsertQueryReq.set_client_id(this->clientId);
  1763. executeInsertQueryReq.set_query(query);
  1764.  
  1765. grpc::ClientContext context;
  1766. grpc::Status executeInsertStatus = this->getRasServerService()->ExecuteInsertQuery(&context, executeInsertQueryReq, &executeInsertQueryRepl);
  1767. if (!executeInsertStatus.ok())
  1768. {
  1769. handleError(executeInsertStatus.error_message());
  1770. }
  1771.  
  1772. int status = executeInsertQueryRepl.status();
  1773. int errNo = executeInsertQueryRepl.errono();
  1774. int lineNo = executeInsertQueryRepl.lineno();
  1775. int colNo = executeInsertQueryRepl.colno();
  1776. string token = executeInsertQueryRepl.token();
  1777. const char* typeName = executeInsertQueryRepl.type_name().c_str();
  1778. const char* typeStructure = executeInsertQueryRepl.type_structure().c_str();
  1779.  
  1780. if(status == 0 || status == 1 || status == 2)
  1781. {
  1782. result.set_type_by_name( typeName );
  1783. result.set_type_structure( typeStructure );
  1784. }
  1785.  
  1786. // status == 2 - empty result
  1787.  
  1788. if( status == 4 || status == 5 )
  1789. {
  1790. throw r_Equery_execution_failed( errNo, lineNo, colNo, token.c_str() );
  1791. }
  1792.  
  1793. return status;
  1794. }
  1795.  
  1796. int RasnetClientComm::executeSetFormat(bool lTransferFormat, r_Data_Format format, const char *formatParams)
  1797. {
  1798. SetFormatReq setFormatReq;
  1799. SetFormatRepl setFormatRepl;
  1800.  
  1801. setFormatReq.set_client_id(this->clientId);
  1802. setFormatReq.set_transfer_format((lTransferFormat ? 1 : 0));
  1803. setFormatReq.set_format(format);
  1804. setFormatReq.set_format_params(formatParams);
  1805.  
  1806. grpc::ClientContext context;
  1807. grpc::Status setFormatStatus = this->getRasServerService()->SetFormat(&context, setFormatReq, &setFormatRepl);
  1808. if (!setFormatStatus.ok())
  1809. {
  1810. handleError(setFormatStatus.error_message());
  1811. }
  1812.  
  1813. return setFormatRepl.status();
  1814. }
  1815.  
  1816. void RasnetClientComm::checkForRwTransaction() throw( r_Error )
  1817. {
  1818. r_Transaction *trans = r_Transaction::actual_transaction;
  1819. if( trans == 0 || trans->get_mode() == r_Transaction::read_only )
  1820. {
  1821. LDEBUG << "RasnetClientComm::checkForRwTransaction(): throwing exception from failed TA rw check.";
  1822. throw r_Error( r_Error::r_Error_TransactionReadOnly );
  1823. }
  1824. }
  1825.  
  1826. void RasnetClientComm::handleError(string error)
  1827. {
  1828. ErrorMessage message;
  1829.  
  1830. if(message.ParseFromString(error))
  1831. {
  1832. if (message.type() == ErrorMessage::RERROR)
  1833. {
  1834. LDEBUG<<"Throwing error received from the server:"<<message.DebugString();
  1835. throw r_Error(static_cast<r_Error::kind>(message.kind()), message.error_no());
  1836. }
  1837. else
  1838. {
  1839. LDEBUG<<"Throwing error received from the server:"<<message.DebugString();
  1840.  
  1841. throw r_EGeneral("General error received from the server.");
  1842. }
  1843. }
  1844. else
  1845. {
  1846. LERROR<<"Client failed with error:"<<error;
  1847.  
  1848. throw r_EGeneral("The client failed to contact the server.");
  1849. }
  1850. }
  1851.  
  1852. void RasnetClientComm::handleConnectionFailure()
  1853. {
  1854. throw r_EGeneral("The client failed to contact the server.");
  1855. }
  1856.  
  1857. void RasnetClientComm::handleStatusCode(int status, string method) throw( r_Error )
  1858. {
  1859. switch( status )
  1860. {
  1861. case 0:
  1862. break;
  1863. case 1:
  1864. LDEBUG << "RasnetClientComm::" << method << ": error: status = " << status;
  1865. throw r_Error( r_Error::r_Error_ClientUnknown );
  1866. break;
  1867. case 2:
  1868. LDEBUG << "RasnetClientComm::" << method << ": error: status = " << status;
  1869. throw r_Error( r_Error::r_Error_ObjectUnknown );
  1870. break;
  1871. case 3:
  1872. throw r_Error( r_Error::r_Error_ClientUnknown );
  1873. break;
  1874. default:
  1875. LDEBUG << "RasnetClientComm::" << method << ": error: status = " << status;
  1876. throw r_Error( r_Error::r_Error_General );
  1877. break;
  1878. }
  1879. }
  1880.  
  1881. bool RasnetClientComm::effectivTypeIsRNP() throw()
  1882. {
  1883. char* errorMsg = strdup("Not implemented exception;");
  1884. r_Error* error = r_Error::getAnyError(errorMsg);
  1885. r_Error tmp = *error;
  1886. delete error;
  1887. delete errorMsg;
  1888. throw tmp;
  1889. }
  1890.  
  1891. long unsigned int RasnetClientComm::getClientID() const
  1892. {
  1893. return this->clientId;
  1894. }
  1895.  
  1896. void RasnetClientComm::triggerAliveSignal()
  1897. {
  1898. char* errorMsg = strdup("Not implemented exception;");
  1899. r_Error* error = r_Error::getAnyError(errorMsg);
  1900. r_Error tmp = *error;
  1901. delete error;
  1902. delete errorMsg;
  1903. throw tmp;
  1904. }
  1905.  
  1906. void RasnetClientComm::sendAliveSignal()
  1907. {
  1908. char* errorMsg = strdup("Not implemented exception;");
  1909. r_Error* error = r_Error::getAnyError(errorMsg);
  1910. r_Error tmp = *error;
  1911. delete error;
  1912. delete errorMsg;
  1913. throw tmp;
  1914. }
  1915.  
  1916. const char* RasnetClientComm::getExtendedErrorInfo() throw (r_Error)
  1917. {
  1918. char* errorMsg = strdup("Not implemented exception;");
  1919. r_Error* error = r_Error::getAnyError(errorMsg);
  1920. r_Error tmp = *error;
  1921. delete error;
  1922. delete errorMsg;
  1923. throw tmp;
  1924. }
  1925.  
  1926. void RasnetClientComm::setUserIdentification(const char *userName, const char *plainTextPassword)
  1927. {
  1928.  
  1929. connectClient(string(userName), common::Crypto::messageDigest(string(plainTextPassword), DEFAULT_DIGEST));
  1930. }
  1931.  
  1932. void RasnetClientComm::setMaxRetry(unsigned int newMaxRetry)
  1933. {
  1934. char* errorMsg = strdup("Not implemented exception;");
  1935. r_Error* error = r_Error::getAnyError(errorMsg);
  1936. r_Error tmp = *error;
  1937. delete error;
  1938. delete errorMsg;
  1939. throw tmp;
  1940. }
  1941.  
  1942. unsigned int RasnetClientComm::getMaxRetry()
  1943. {
  1944. char* errorMsg = strdup("Not implemented exception;");
  1945. r_Error* error = r_Error::getAnyError(errorMsg);
  1946. r_Error tmp = *error;
  1947. delete error;
  1948. delete errorMsg;
  1949. throw tmp;
  1950. }
  1951.  
  1952. void RasnetClientComm::setTimeoutInterval(int seconds)
  1953. {
  1954. char* errorMsg = strdup("Not implemented exception;");
  1955. r_Error* error = r_Error::getAnyError(errorMsg);
  1956. r_Error tmp = *error;
  1957. delete error;
  1958. delete errorMsg;
  1959. throw tmp;
  1960. }
  1961.  
  1962. int RasnetClientComm::getTimeoutInterval()
  1963. {
  1964. char* errorMsg = strdup("Not implemented exception;");
  1965. r_Error* error = r_Error::getAnyError(errorMsg);
  1966. r_Error tmp = *error;
  1967. delete error;
  1968. delete errorMsg;
  1969. throw tmp;
  1970. }
  1971.  
  1972. std::vector<boost::shared_ptr<TurboQueryResult> >* RasnetClientComm::turboExecuteRetrievalQuery(const string &userName, const string &password, const string& databaseName, const string &query)
  1973. {
  1974. LINFO << "rasnetclientcomm";
  1975. LINFO << __LINE__;
  1976. LDEBUG<<"User:"<<userName;
  1977. LDEBUG<<"Password:"<<password;
  1978.  
  1979. LDEBUG<<"Database:"<<databaseName;
  1980. LDEBUG<<"Query:"<<query;
  1981.  
  1982. bool isClientConnected = false;
  1983. bool isDbOpen = false;
  1984. bool isTAOpen = false;
  1985.  
  1986. std::vector<boost::shared_ptr<TurboQueryResult> >* turboResult = new std::vector<boost::shared_ptr<TurboQueryResult> >();
  1987.  
  1988. try
  1989. {
  1990. LDEBUG<<"Connecting;";
  1991. LINFO << __LINE__;
  1992. this->connectClient(userName, common::Crypto::messageDigest(password, DEFAULT_DIGEST));
  1993. LINFO << __LINE__;
  1994. isClientConnected = true;
  1995. LDEBUG<<"Opening DB";
  1996. LINFO << __LINE__;
  1997. this->openDB(databaseName.c_str());
  1998. isDbOpen = true;
  1999. LINFO << __LINE__;
  2000. LDEBUG<<"Opening TA";
  2001. this->openTA(true);
  2002. isTAOpen = true;
  2003. LINFO << __LINE__;
  2004. LDEBUG<<"Executing TURBO";
  2005. TurboQueryResponse response;
  2006. TurboQueryRequest request;
  2007. LINFO << __LINE__;
  2008. request.set_query(query);
  2009. LINFO << __LINE__;
  2010. grpc::ClientContext clientContext;
  2011. grpc::Status turboQueryStatus = this->getRasServerService()->ExecuteTurboQuery(&clientContext, request, &response);
  2012. if(!turboQueryStatus.ok())
  2013. {
  2014. LERROR<<turboQueryStatus.error_message();
  2015.  
  2016. handleError(turboQueryStatus.error_message());
  2017. }
  2018. LINFO << __LINE__;
  2019. for(int i=0; i<response.mdd_objects_size(); ++i)
  2020. {
  2021. LINFO << __LINE__;
  2022. size_t rawDataSize = response.mdd_objects(i).raw_data().size();
  2023. LINFO << __LINE__;
  2024. char* rawData = new char[rawDataSize];
  2025. LINFO << __LINE__;
  2026. memcpy(rawData, response.mdd_objects(i).raw_data().c_str(), rawDataSize);
  2027. LINFO << __LINE__;
  2028. r_Data_Format dataFormat = static_cast<r_Data_Format>(response.mdd_objects(i).data_format());
  2029. LINFO << __LINE__;
  2030. turboResult->push_back(boost::make_shared<TurboQueryResult>(rawData, rawDataSize, dataFormat, response.mdd_objects(i).domain()));
  2031. LINFO << __LINE__;
  2032. }
  2033. LINFO << __LINE__;
  2034. LDEBUG<<"Returned a result with "<<turboResult->size() <<" items.";
  2035.  
  2036. }
  2037. catch(std::exception& ex)
  2038. {
  2039. LERROR<<ex.what();
  2040.  
  2041. }
  2042. catch(...)
  2043. {
  2044. LERROR<<"Turbo execute query failed for an unknown reason.";
  2045. }
  2046.  
  2047. try
  2048. {
  2049. if(isTAOpen)
  2050. {
  2051. this->commitTA();
  2052. this->closeDB();
  2053. this->disconnectClient();
  2054. }
  2055. }
  2056. catch(std::exception& ex)
  2057. {
  2058. LWARNING<<ex.what();
  2059. }
  2060. LINFO << __LINE__;
  2061. return turboResult;
  2062. }
  2063.  
  2064. /* START: KEEP ALIVE */
  2065.  
  2066. /* RASMGR */
  2067. void RasnetClientComm::startRasMgrKeepAlive()
  2068. {
  2069. boost::lock_guard<boost::mutex> lock(this->rasmgrKeepAliveMutex);
  2070.  
  2071. //TODO-GM
  2072. this->isRasmgrKeepAliveRunning = true;
  2073. this->rasMgrKeepAliveManagementThread.reset(new thread(&RasnetClientComm::clientRasMgrKeepAliveRunner, this));
  2074.  
  2075. }
  2076.  
  2077. void RasnetClientComm::stopRasMgrKeepAlive()
  2078. {
  2079. try
  2080. {
  2081. {
  2082. boost::unique_lock<boost::mutex> lock(this->rasmgrKeepAliveMutex);
  2083. this->isRasmgrKeepAliveRunning = false;
  2084. }
  2085.  
  2086. if(!rasMgrKeepAliveManagementThread)
  2087. {
  2088. LDEBUG<<"Thread that sends messages from client to rasmgr is not running.";
  2089. }
  2090. else
  2091. {
  2092.  
  2093. this->isRasmgrKeepAliveRunningCondition.notify_one();
  2094.  
  2095. if (this->rasMgrKeepAliveManagementThread->joinable())
  2096. {
  2097. LDEBUG<<"Joining rasmgr keep alive management thread.";
  2098. this->rasMgrKeepAliveManagementThread->join();
  2099. LDEBUG<<"Joined rasmgr keep alive management thread.";
  2100. }
  2101. else
  2102. {
  2103. LDEBUG<<"Interrupting rasmgr keep alive management thread.";
  2104. this->rasMgrKeepAliveManagementThread->interrupt();
  2105. LDEBUG<<"Interrupted rasmgr keep alive management thread.";
  2106. }
  2107.  
  2108. }
  2109. }
  2110. catch (std::exception& ex)
  2111. {
  2112. LERROR<<ex.what();
  2113. }
  2114. catch (...)
  2115. {
  2116. LERROR<<"Stoping rasmgr keep alive has failed";
  2117. }
  2118. }
  2119.  
  2120. void RasnetClientComm::clientRasMgrKeepAliveRunner()
  2121. {
  2122. boost::posix_time::time_duration timeToSleepFor = boost::posix_time::milliseconds(this->keepAliveTimeout);
  2123.  
  2124. boost::unique_lock<boost::mutex> threadLock(this->rasmgrKeepAliveMutex);
  2125. while (this->isRasmgrKeepAliveRunning)
  2126. {
  2127. try
  2128. {
  2129. // Wait on the condition variable to be notified from the
  2130. // destructor when it is time to stop the worker thread
  2131. if(!this->isRasmgrKeepAliveRunningCondition.timed_wait(threadLock, timeToSleepFor))
  2132. {
  2133. KeepAliveReq keepAliveReq;
  2134. Void keepAliveRepl;
  2135.  
  2136. keepAliveReq.set_clientuuid(this->clientUUID);
  2137.  
  2138. grpc::ClientContext context;
  2139.  
  2140. // We do not want this thread to block forever
  2141. system_clock::time_point deadline = system_clock::now() + milliseconds(SERVICE_CALL_TIMEOUT);
  2142. context.set_deadline(deadline);
  2143.  
  2144. grpc::Status keepAliveStatus = this->getRasMgrService(false)->KeepAlive(&context, keepAliveReq, &keepAliveRepl);
  2145.  
  2146. if (!keepAliveStatus.ok())
  2147. {
  2148. LERROR<<"Failed to send keep alive message to rasmgr:"<<keepAliveStatus.error_message();
  2149. LDEBUG<<"Stopping client-rasmgr keep alive thread.";
  2150. this->isRasmgrKeepAliveRunning = false;
  2151. }
  2152. }
  2153. }
  2154. catch (std::exception& ex)
  2155. {
  2156. this->isRasmgrKeepAliveRunning = false;
  2157.  
  2158. LERROR<<"Rasmgr Keep Alive thread has failed";
  2159. LERROR<<ex.what();
  2160. }
  2161. catch (...)
  2162. {
  2163. this->isRasmgrKeepAliveRunning = false;
  2164.  
  2165. LERROR<<"Rasmgr Keep Alive thread failed for unknown reason.";
  2166. }
  2167. }
  2168. }
  2169.  
  2170. /* RASSERVER */
  2171. void RasnetClientComm::startRasServerKeepAlive()
  2172. {
  2173. boost::lock_guard<boost::mutex> lock(this->rasserverKeepAliveMutex);
  2174.  
  2175. this->isRasserverKeepAliveRunning = true;
  2176. this->rasServerKeepAliveManagementThread.reset(
  2177. new thread(&RasnetClientComm::clientRasServerKeepAliveRunner, this));
  2178. }
  2179.  
  2180. void RasnetClientComm::stopRasServerKeepAlive()
  2181. {
  2182. try
  2183. {
  2184. {
  2185. boost::unique_lock<boost::mutex> lock(this->rasserverKeepAliveMutex);
  2186. // Change the condition and notify the variable
  2187. this->isRasserverKeepAliveRunning = false;
  2188. }
  2189.  
  2190. if(!rasServerKeepAliveManagementThread)
  2191. {
  2192. LDEBUG<<"Thread that sends messages from client to rasserver is not running.";
  2193. }
  2194. else
  2195. {
  2196. this->isRasserverKeepAliveRunningCondition.notify_one();
  2197.  
  2198. if (this->rasServerKeepAliveManagementThread->joinable())
  2199. {
  2200. LDEBUG<<"Joining rasserver keep alive management thread.";
  2201. this->rasServerKeepAliveManagementThread->join();
  2202. LDEBUG<<"Joined rasserver keep alive management thread.";
  2203. }
  2204. else
  2205. {
  2206. LDEBUG<<"Interrupting rasserver keep alive management thread.";
  2207. this->rasServerKeepAliveManagementThread->interrupt();
  2208. LDEBUG<<"Interrupted rasserver keep alive management thread.";
  2209. }
  2210.  
  2211. }
  2212. }
  2213. catch (std::exception& ex)
  2214. {
  2215. LERROR<<ex.what();
  2216. }
  2217. catch (...)
  2218. {
  2219. LERROR<<"Stoping rasmgr keep alive has failed";
  2220. }
  2221. }
  2222.  
  2223. void RasnetClientComm::clientRasServerKeepAliveRunner()
  2224. {
  2225. boost::posix_time::time_duration timeToSleepFor = boost::posix_time::milliseconds(this->keepAliveTimeout);
  2226.  
  2227. boost::unique_lock<boost::mutex> threadLock(this->rasserverKeepAliveMutex);
  2228. while (this->isRasserverKeepAliveRunning)
  2229. {
  2230. try
  2231. {
  2232. // Wait on the condition variable to be notified from the
  2233. // destructor when it is time to stop the worker thread
  2234. if(!this->isRasserverKeepAliveRunningCondition.timed_wait(threadLock, timeToSleepFor))
  2235. {
  2236. ::rasnet::service::KeepAliveRequest keepAliveReq;
  2237. Void keepAliveRepl;
  2238.  
  2239. keepAliveReq.set_client_uuid(this->remoteClientUUID);
  2240. keepAliveReq.set_session_id(this->sessionId);
  2241.  
  2242. grpc::ClientContext context;
  2243.  
  2244. // We do not want this thread to block forever
  2245. system_clock::time_point deadline = system_clock::now() + milliseconds(SERVICE_CALL_TIMEOUT);
  2246. context.set_deadline(deadline);
  2247.  
  2248. grpc::Status keepAliveStatus = this->getRasServerService(false)->KeepAlive(&context, keepAliveReq, &keepAliveRepl);
  2249.  
  2250. if (!keepAliveStatus.ok())
  2251. {
  2252. LERROR<<"Failed to send keep alive message to rasserver:"<<keepAliveStatus.error_message();
  2253. LDEBUG<<"Stopping client-rasserver keep alive thread.";
  2254. this->isRasserverKeepAliveRunning = false;
  2255. }
  2256. }
  2257. }
  2258. catch (std::exception& ex)
  2259. {
  2260. this->isRasserverKeepAliveRunning = false;
  2261.  
  2262. LERROR<<"RasServer Keep Alive thread has failed";
  2263. LERROR<<ex.what();
  2264. }
  2265. catch (...)
  2266. {
  2267. this->isRasserverKeepAliveRunning = false;
  2268. LERROR<<"RasServer Keep Alive thread failed for unknown reason.";
  2269. }
  2270. }
  2271.  
  2272. }
  2273. /* END: KEEP ALIVE */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement