1 // Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 // Author : Anthony GEAY (EDF R&D)
21 #include "SALOMESDS_DataScopeServer.hxx"
22 #include "SALOMESDS_DataServerManager.hxx"
23 #include "SALOMESDS_PickelizedPyObjRdOnlyServer.hxx"
24 #include "SALOMESDS_PickelizedPyObjRdExtServer.hxx"
25 #include "SALOMESDS_PickelizedPyObjRdWrServer.hxx"
26 #include "SALOMESDS_PickelizedPyObjRdExtInitServer.hxx"
27 #include "SALOMESDS_TrustTransaction.hxx"
28 #include "SALOMESDS_KeyWaiter.hxx"
29 #include "SALOMESDS_Transaction.hxx"
30 #include "SALOME_NamingService_Abstract.hxx"
31 #include "SALOMESDS_Exception.hxx"
37 // agy : awful, to be factorized with ContainerManager.
42 #define getpid _getpid
45 using namespace SALOMESDS;
47 std::size_t DataScopeServerBase::COUNTER=0;
49 void DataScopeKiller::shutdown()
55 RequestSwitcher::RequestSwitcher(CORBA::ORB_ptr orb, DataScopeServerTransaction *ds):RequestSwitcherBase(orb),_ds(ds)
59 SALOME::StringVec *RequestSwitcher::listVars()
61 return _ds->listVars();
64 SALOME::ByteVec *RequestSwitcher::fetchSerializedContent(const char *varName)
66 return _ds->fetchSerializedContent(varName);
69 void RequestSwitcher::fetchAndGetAccessOfVar(const char *varName, CORBA::String_out access, SALOME::ByteVec_out data)
71 return _ds->fetchAndGetAccessOfVar(varName,access,data);
74 DataScopeServerBase::DataScopeServerBase(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName, SALOME_NamingService_Container_Abstract *ns):_ns(ns),_pyHelper(pyHelper),_orb(CORBA::ORB::_duplicate(orb)),_name(scopeName),_killer(killer)
78 DataScopeServerBase::DataScopeServerBase(const DataScopeServerBase& other):omniServant(other),ServantBase(other),_ns(other._ns->clone()),_pyHelper(other._pyHelper),_name(other._name),_vars(other._vars),_killer(other._killer)
82 DataScopeServerBase::~DataScopeServerBase()
84 for(std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator it=_vars.begin();it!=_vars.end();it++)
86 BasicDataServer *obj((*it).second);
96 * Called remotely -> to protect against throw
98 void DataScopeServerBase::ping()
103 * Called remotely -> to protect against throw
105 char *DataScopeServerBase::getScopeName()
107 return CORBA::string_dup(_name.c_str());
111 * Called remotely -> to protect against throw
113 SALOME::StringVec *DataScopeServerBase::listVars()
115 SALOME::StringVec *ret(new SALOME::StringVec);
116 std::size_t sz(_vars.size());
117 ret->length((CORBA::ULong)sz); //!< TODO: size_t to CORBA::ULong
118 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator it(_vars.begin());
119 for(std::size_t i=0;i<sz;it++,i++)
121 BasicDataServer *obj((*it).second);
122 std::string name(obj->getVarNameCpp());
123 (*ret)[(CORBA::ULong)i]=CORBA::string_dup(name.c_str()); //!< TODO: size_t to CORBA::ULong
128 CORBA::Boolean DataScopeServerBase::existVar(const char *varName)
130 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator it(_vars.begin());
131 for(;it!=_vars.end();it++)
132 if((*it).second->getVarNameCpp()==varName)
137 SALOME::BasicDataServer_ptr DataScopeServerBase::retrieveVarInternal(const char *varName)
139 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator it0(retrieveVarInternal3(varName));
140 return SALOME::BasicDataServer::_duplicate((*it0).first);
143 BasicDataServer *DataScopeServerBase::retrieveVarInternal2(const std::string& varName)
145 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator it0(retrieveVarInternal3(varName));
146 return (*it0).second;
149 void DataScopeServerBase::deleteVar(const char *varName)
151 std::string varNameCpp(varName);
152 std::vector<std::string> allNames(getAllVarNames());
153 std::vector<std::string>::iterator it(std::find(allNames.begin(),allNames.end(),varNameCpp));
154 if(it==allNames.end())
156 std::ostringstream oss; oss << "DataScopeServerBase::deleteVar : name \"" << varNameCpp << "\" does not exists ! Possibilities are :";
157 std::copy(allNames.begin(),allNames.end(),std::ostream_iterator<std::string>(oss,", "));
158 throw Exception(oss.str());
160 std::size_t pos(std::distance(allNames.begin(),it));
161 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator it0(_vars.begin());
162 for(std::size_t ii=0;ii<pos;ii++,it0++);
163 (*it0).second->decrRef();
167 CORBA::Boolean DataScopeServerBase::shutdownIfNotHostedByDSM(SALOME::DataScopeKiller_out killer)
169 CORBA::Object_var obj(_ns->Resolve(DataServerManager::NAME_IN_NS));
170 SALOME::DataServerManager_var dsm(SALOME::DataServerManager::_narrow(obj));
171 if(CORBA::is_nil(dsm))
172 throw Exception("Unable to reach in the NS the unique DataServerManager instance of the Session !");
173 // destroy ref in the naming service
174 std::string fullScopeName(SALOMESDS::DataServerManager::CreateAbsNameInNSFromScopeName(_name));
175 _ns->Destroy_Name(fullScopeName.c_str());
176 // establish if dsm and this shared the same POA. If yes dsm and this are collocated !
177 PortableServer::ServantBase *ret(0);
180 ret=_poa->reference_to_servant(dsm);
182 catch(...) { ret=0; }
187 killer=SALOME::DataScopeKiller::_duplicate(_killer);
194 killer=SALOME::DataScopeKiller::_duplicate(_killer);
199 SALOME::ByteVec *DataScopeServerBase::fetchSerializedContent(const char *varName)
201 BasicDataServer *var(retrieveVarInternal2(varName));
202 PickelizedPyObjServer *varc(dynamic_cast<PickelizedPyObjServer *>(var));
205 std::ostringstream oss; oss << "DataScopeServerBase::fetchSerializedContent : var \"" << varName << "\" exists but it is not serialized !";
206 throw Exception(oss.str());
208 return varc->fetchSerializedContent();
211 SALOME::SeqOfByteVec *DataScopeServerBase::getAllKeysOfVarWithTypeDict(const char *varName)
213 BasicDataServer *var(retrieveVarInternal2(varName));
214 PickelizedPyObjServer *varc(dynamic_cast<PickelizedPyObjServer *>(var));
217 std::ostringstream oss; oss << "DataScopeServerBase::getAllKeysOfVarWithTypeDict : var \"" << varName << "\" exists but it is not serialized !";
218 throw Exception(oss.str());
222 std::ostringstream oss; oss << "DataScopeServerBase::getAllKeysOfVarWithTypeDict : var \"" << varName << "\" exists but it is not a PyDict !";
223 throw Exception(oss.str());
225 PyObject *keys(PyDict_Keys(varc->getPyObj()));
226 if(!PyList_Check(keys))
228 std::ostringstream oss; oss << "DataScopeServerBase::getAllKeysOfVarWithTypeDict : var \"" << varName << "\" has keys but not of type list !";
229 throw Exception(oss.str());
231 Py_ssize_t sz(PyList_Size(keys));
232 SALOME::SeqOfByteVec *ret(new SALOME::SeqOfByteVec);
233 ret->length((CORBA::ULong)sz); //!< TODO: convert Py_ssize_t in CORBA::ULong
234 for(Py_ssize_t i=0;i<sz;i++)
236 PyObject *item(PyList_GetItem(keys,i));
238 std::string pickel(varc->pickelize(item));//item consumed
239 PickelizedPyObjServer::FromCppToByteSeq(pickel,(*ret)[(CORBA::ULong)i]); //!< TODO: convert Py_ssize_t in CORBA::ULong
245 SALOME::ByteVec *DataScopeServerBase::getValueOfVarWithTypeDict(const char *varName, const SALOME::ByteVec& constKey)
247 BasicDataServer *var(retrieveVarInternal2(varName));
248 PickelizedPyObjServer *varc(dynamic_cast<PickelizedPyObjServer *>(var));
251 std::ostringstream oss; oss << "DataScopeServerBase::getValueOfVarWithTypeDict : var \"" << varName << "\" exists but it is not serialized !";
252 throw Exception(oss.str());
256 std::ostringstream oss; oss << "DataScopeServerBase::getValueOfVarWithTypeDict : var \"" << varName << "\" exists but it is not a PyDict !";
257 throw Exception(oss.str());
261 PickelizedPyObjServer::FromByteSeqToCpp(constKey,keyCpp);
262 SALOME::AutoPyRef key(PickelizedPyObjServer::GetPyObjFromPickled(keyCpp,this));
263 PyObject *value(PyDict_GetItem(varc->getPyObj(),key.get()));//borrowed
266 std::ostringstream oss; oss << "DataScopeServerBase::getValueOfVarWithTypeDict : var \"" << varName << "\" seems to not have key specified !";
267 throw Exception(oss.str());
270 std::string ret(PickelizedPyObjServer::Pickelize(value,this));//value is consumed
271 return PickelizedPyObjServer::FromCppToByteSeq(ret);
274 void DataScopeServerBase::takeANap(CORBA::Double napDurationInSec)
276 if(napDurationInSec<0.)
277 throw Exception("DataScopeServerBase::takeANap : negative value !");
279 struct timespec req,rem;
280 long nbSec((long)napDurationInSec);
281 double remainTime(napDurationInSec-(double)nbSec);
283 req.tv_nsec=(long)(remainTime*1000000.);
284 int ret(nanosleep(&req,&rem));
286 throw Exception("DataScopeServerBase::takeANap : nap not finished as expected !");
288 throw Exception("DataScopeServerBase::takeANap : not implemented for Windows !");
292 void DataScopeServerBase::registerToSalomePiDict() const
294 _pyHelper->registerToSalomePiDict("SALOME_DataScopeServerBase",getpid());
297 void DataScopeServerBase::setPOA(PortableServer::POA_var poa)
302 void DataScopeServerBase::registerInNS(SALOME::DataScopeServerBase_ptr ptr)
304 std::string fullScopeName(SALOMESDS::DataServerManager::CreateAbsNameInNSFromScopeName(_name));
305 _ns->Register(ptr,fullScopeName.c_str());
308 std::string DataScopeServerBase::BuildTmpVarNameFrom(const std::string& varName)
310 std::ostringstream oss;
311 oss << varName << "@" << COUNTER++;
315 std::vector< std::string > DataScopeServerBase::getAllVarNames() const
317 std::size_t sz(_vars.size());
318 std::vector<std::string> ret(sz);
319 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator it(_vars.begin());
320 for(std::size_t i=0;i<sz;it++,i++)
321 ret[i]=(*it).second->getVarNameCpp();
325 bool DataScopeServerBase::isExistingVar(const std::string& varName) const
327 std::vector<std::string> allNames(getAllVarNames());
328 std::vector<std::string>::iterator it(std::find(allNames.begin(),allNames.end(),varName));
329 return it!=allNames.end();
332 void DataScopeServerBase::checkNotAlreadyExistingVar(const std::string& varName) const
334 if(isExistingVar(varName))
336 std::ostringstream oss; oss << "DataScopeServerBase::checkNotAlreadyExistingVar : name \"" << varName << "\" already exists !";
337 throw Exception(oss.str());
341 void DataScopeServerBase::checkExistingVar(const std::string& varName) const
343 std::vector<std::string> allNames(getAllVarNames());
344 std::vector<std::string>::iterator it(std::find(allNames.begin(),allNames.end(),varName));
345 if(it==allNames.end())
347 std::ostringstream oss; oss << "DataScopeServerBase::checkExistingVar : name \"" << varName << "\" does not exist !";
348 throw Exception(oss.str());
352 PickelizedPyObjServer *DataScopeServerBase::checkVarExistingAndDict(const std::string& varName)
354 checkExistingVar(varName);
355 BasicDataServer *var(retrieveVarInternal2(varName.c_str()));
356 PickelizedPyObjServer *ret(dynamic_cast<PickelizedPyObjServer *>(var));
359 std::ostringstream oss; oss << "TransactionAddKeyValueHard::prepareRollBackInCaseOfFailure : var \"" << varName << "\"exists but it is not serialized !";
360 throw Exception(oss.str());
364 std::ostringstream oss; oss << "TransactionAddKeyValueHard::prepareRollBackInCaseOfFailure : var \"" << varName << "\"exists but it is not a Dict !";
365 throw Exception(oss.str());
370 void DataScopeServerBase::moveStatusOfVarFromRdWrToRdOnly(const std::string& varName)
372 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator it(retrieveVarInternal4(varName));
373 std::pair< SALOME::BasicDataServer_var, BasicDataServer * >& p(*it);
374 PickelizedPyObjRdWrServer *varc(dynamic_cast<PickelizedPyObjRdWrServer *>(p.second));
376 throw Exception("DataScopeServerBase::moveStatusOfVarFromRdWrToRdOnly : var is not a RdWr !");
377 PyObject *pyobj(varc->getPyObj()); Py_XINCREF(pyobj);
378 PickelizedPyObjRdOnlyServer *newVar(new PickelizedPyObjRdOnlyServer(this,varName,pyobj));
379 CORBA::Object_var obj(newVar->activate());
380 SALOME::BasicDataServer_var obj2(SALOME::BasicDataServer::_narrow(obj));
381 p.first=obj2; p.second=newVar;
385 void DataScopeServerBase::moveStatusOfVarFromRdOnlyToRdWr(const std::string& varName)
387 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator it(retrieveVarInternal4(varName));
388 std::pair< SALOME::BasicDataServer_var, BasicDataServer * >& p(*it);
389 PickelizedPyObjRdOnlyServer *varc(dynamic_cast<PickelizedPyObjRdOnlyServer *>(p.second));
391 throw Exception("DataScopeServerBase::moveStatusOfVarFromRdOnlyToRdWr : var is not a RdWr !");
392 PyObject *pyobj(varc->getPyObj()); Py_XINCREF(pyobj);
393 PickelizedPyObjRdWrServer *newVar(new PickelizedPyObjRdWrServer(this,varName,pyobj));
394 CORBA::Object_var obj(newVar->activate());
395 SALOME::BasicDataServer_var obj2(SALOME::BasicDataServer::_narrow(obj));
396 p.first=obj2; p.second=newVar;
400 void DataScopeServerBase::moveStatusOfVarFromRdExtOrRdExtInitToRdExtInit(const std::string& varName)
402 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator it(retrieveVarInternal4(varName));
403 std::pair< SALOME::BasicDataServer_var, BasicDataServer * >& p(*it);
404 PickelizedPyObjRdExtServer *varc0(dynamic_cast<PickelizedPyObjRdExtServer *>(p.second));
405 PickelizedPyObjRdExtInitServer *varc1(dynamic_cast<PickelizedPyObjRdExtInitServer *>(p.second));
407 throw Exception("DataScopeServerBase::moveStatusOfVarFromRdExtOrRdExtInitToRdExtInit : var is neither RdExt nor RdExtInit !");
410 PickelizedPyObjRdExtInitServer *newVar(varc0->buildInitInstanceFrom(varName));
411 newVar->incrNbClients();
412 CORBA::Object_var obj(newVar->activate());
413 SALOME::BasicDataServer_var obj2(SALOME::BasicDataServer::_narrow(obj));
414 p.first=obj2; p.second=newVar;
418 varc1->incrNbClients();
421 void DataScopeServerBase::moveStatusOfVarFromRdExtOrRdExtInitToRdExt(const std::string& varName)
423 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator it(retrieveVarInternal4(varName));
424 std::pair< SALOME::BasicDataServer_var, BasicDataServer * >& p(*it);
425 PickelizedPyObjRdExtInitServer *varc0(dynamic_cast<PickelizedPyObjRdExtInitServer *>(p.second));
426 PickelizedPyObjRdExtServer *varc1(dynamic_cast<PickelizedPyObjRdExtServer *>(p.second));
428 throw Exception("DataScopeServerBase::moveStatusOfVarFromRdExtOrRdExtInitToRdExt : var is not a RdExtInit !");
431 if(varc0->decrNbClients())
433 PickelizedPyObjRdExtServer *newVar(varc0->buildStdInstanceFrom(varName));
434 CORBA::Object_var obj(newVar->activate());
435 SALOME::BasicDataServer_var obj2(SALOME::BasicDataServer::_narrow(obj));
436 p.first=obj2; p.second=newVar;
442 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator DataScopeServerBase::retrieveVarInternal3(const std::string& varName) const
444 std::vector<std::string> allNames(getAllVarNames());
445 std::vector<std::string>::iterator it(std::find(allNames.begin(),allNames.end(),varName));
446 if(it==allNames.end())
448 std::ostringstream oss; oss << "DataScopeServerBase::retrieveVarInternal3 : name \"" << varName << "\" does not exists ! Possibilities are :";
449 std::copy(allNames.begin(),allNames.end(),std::ostream_iterator<std::string>(oss,", "));
450 throw Exception(oss.str());
452 std::size_t pos(std::distance(allNames.begin(),it));
453 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator it0(_vars.begin());
454 for(std::size_t i=0;i<pos;i++,it0++);
458 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator DataScopeServerBase::retrieveVarInternal4(const std::string& varName)
460 std::vector<std::string> allNames(getAllVarNames());
461 std::vector<std::string>::iterator it(std::find(allNames.begin(),allNames.end(),varName));
462 if(it==allNames.end())
464 std::ostringstream oss; oss << "DataScopeServerBase::retrieveVarInternal4 : name \"" << varName << "\" does not exists ! Possibilities are :";
465 std::copy(allNames.begin(),allNames.end(),std::ostream_iterator<std::string>(oss,", "));
466 throw Exception(oss.str());
468 std::size_t pos(std::distance(allNames.begin(),it));
469 std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator it0(_vars.begin());
470 for(std::size_t i=0;i<pos;i++,it0++);
476 DataScopeServer::DataScopeServer(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName, SALOME_NamingService_Container_Abstract *ns):DataScopeServerBase(pyHelper,orb,killer,scopeName,ns)
480 DataScopeServer::DataScopeServer(const DataScopeServer& other):omniServant(other),ServantBase(other),DataScopeServerBase(other)
484 SALOME::PickelizedPyObjRdOnlyServer_ptr DataScopeServer::createRdOnlyVar(const char *varName, const SALOME::ByteVec& constValue)
486 std::string varNameCpp(varName);
487 checkNotAlreadyExistingVar(varNameCpp);
488 PickelizedPyObjRdOnlyServer *tmp(new PickelizedPyObjRdOnlyServer(this,varNameCpp,constValue));
489 CORBA::Object_var ret(tmp->activate());
490 std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(ret),tmp);
492 return SALOME::PickelizedPyObjRdOnlyServer::_narrow(ret);
495 SALOME::PickelizedPyObjRdExtServer_ptr DataScopeServer::createRdExtVar(const char *varName, const SALOME::ByteVec& constValue)
497 std::string varNameCpp(varName);
498 checkNotAlreadyExistingVar(varNameCpp);
499 PickelizedPyObjRdExtServer *tmp(new PickelizedPyObjRdExtServer(this,varNameCpp,constValue));
500 CORBA::Object_var ret(tmp->activate());
501 std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(ret),tmp);
503 return SALOME::PickelizedPyObjRdExtServer::_narrow(ret);
506 SALOME::PickelizedPyObjRdWrServer_ptr DataScopeServer::createRdWrVar(const char *typeName, const char *varName)
508 std::string varNameCpp(varName),typeNameCpp(typeName);
509 checkNotAlreadyExistingVar(varNameCpp);
510 PickelizedPyObjRdWrServer *tmp(new PickelizedPyObjRdWrServer(this,typeNameCpp,varNameCpp));
511 CORBA::Object_var ret(tmp->activate());
512 std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(ret),tmp);
514 return SALOME::PickelizedPyObjRdWrServer::_narrow(ret);
517 DataScopeServer::~DataScopeServer()
523 DataScopeServerTransaction::DataScopeServerTransaction(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName, SALOME_NamingService_Container_Abstract *ns):DataScopeServerBase(pyHelper,orb,killer,scopeName,ns)
525 CORBA::Object_var obj(_orb->resolve_initial_references("RootPOA"));
526 PortableServer::POA_var poa(PortableServer::POA::_narrow(obj));
528 PortableServer::POAManager_var mgr(poa->the_POAManager());
529 CORBA::PolicyList policies;
531 PortableServer::ThreadPolicy_var threadPol(poa->create_thread_policy(PortableServer::ORB_CTRL_MODEL));
532 policies[0]=PortableServer::ThreadPolicy::_duplicate(threadPol);
533 PortableServer::POA_var poa2(poa->create_POA("POAForWaiters",mgr,policies));
534 threadPol->destroy();
536 _poa_for_key_waiter=poa2;
539 DataScopeServerTransaction::DataScopeServerTransaction(const DataScopeServerTransaction& other):omniServant(other),ServantBase(other),DataScopeServerBase(other),_poa_for_key_waiter(other.getPOA4KeyWaiter())
543 char *DataScopeServerTransaction::getAccessOfVar(const char *varName)
545 std::string varNameCpp(varName);
546 checkExistingVar(varNameCpp);
547 BasicDataServer *var(retrieveVarInternal2(varName));
549 throw Exception("DataScopeServerTransaction::getAccessOfVar : variable is NULL !");
550 PickelizedPyObjServer *varc(dynamic_cast<PickelizedPyObjServer *>(var));
552 throw Exception("DataScopeServerTransaction::getAccessOfVar : variable is not of type PickelizedPyObjServer !");
553 std::string ret(varc->getAccessStr());
554 return CORBA::string_dup(ret.c_str());
558 * This method is here to retrieve atomically accessStr and picklization.
560 void DataScopeServerTransaction::fetchAndGetAccessOfVar(const char *varName, CORBA::String_out access, SALOME::ByteVec_out data)
562 access=getAccessOfVar(varName);
563 data=fetchSerializedContent(varName);
566 void DataScopeServerTransaction::createRdOnlyVarInternal(const std::string& varName, const SALOME::ByteVec& constValue)
568 checkNotAlreadyExistingVar(varName);
569 PickelizedPyObjRdOnlyServer *tmp(new PickelizedPyObjRdOnlyServer(this,varName,constValue));
570 CORBA::Object_var ret(tmp->activate());
571 std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(ret),tmp);
575 void DataScopeServerTransaction::createRdExtVarInternal(const std::string& varName, const SALOME::ByteVec& constValue)
577 checkNotAlreadyExistingVar(varName);
578 PickelizedPyObjRdExtServer *tmp(new PickelizedPyObjRdExtServer(this,varName,constValue));
579 CORBA::Object_var ret(tmp->activate());
580 std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(ret),tmp);
584 void DataScopeServerTransaction::createRdExtVarFreeStyleInternal(const std::string& varName, const SALOME::ByteVec& constValue, std::string&& compareFuncContent, SALOME::AutoPyRef&& compareFunc)
586 if(!isExistingVar(varName))
588 PickelizedPyObjRdExtFreeStyleServer *tmp(new PickelizedPyObjRdExtFreeStyleServer(this,varName,constValue,std::move(compareFuncContent),std::move(compareFunc)));
589 CORBA::Object_var ret(tmp->activate());
590 std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(ret),tmp);
595 BasicDataServer *ds(retrieveVarInternal2(varName));
598 std::ostringstream oss;
599 oss << "DataScopeServerTransaction::createRdExtVarFreeStyleInternal : internal error 1 for varname \"" << varName << "\"!";
600 throw Exception(oss.str());
602 Sha1Keeper *ds2(dynamic_cast<Sha1Keeper *>(ds));
605 std::ostringstream oss;
606 oss << "DataScopeServerTransaction::createRdExtVarFreeStyleInternal : varname \"" << varName << "\" already exists with a non Sha1Keeper type !";
607 throw Exception(oss.str());
609 PickelizedPyObjServer *ds3(dynamic_cast<PickelizedPyObjServer *>(ds));
612 std::ostringstream oss;
613 oss << "DataScopeServerTransaction::createRdExtVarFreeStyleInternal : varname \"" << varName << "\" already exists with a non PickelizedPyObjServer type !";
614 throw Exception(oss.str());
616 std::vector<unsigned char> constValueAsCpp;
617 Transaction::FromByteSeqToVB(constValue,constValueAsCpp);
618 SALOME::AutoPyRef newObj(PickelizedPyObjServer::GetPyObjFromPickled(constValueAsCpp,this));
621 std::ostringstream oss;
622 oss << "DataScopeServerTransaction::createRdExtVarFreeStyleInternal : varname \"" << varName << "\" already exists but input pickelized object is not loadable !";
623 throw Exception(oss.str());
625 ds2->checkSame(varName,compareFuncContent,ds3->getPyObj(),newObj);
629 void DataScopeServerTransaction::createRdExtInitVarInternal(const std::string& varName, const SALOME::ByteVec& constValue)
631 checkNotAlreadyExistingVar(varName);
632 PickelizedPyObjRdExtInitServer *tmp(new PickelizedPyObjRdExtInitServer(this,varName,constValue));
633 CORBA::Object_var ret(tmp->activate());
634 std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(ret),tmp);
638 void DataScopeServerTransaction::createRdWrVarInternal(const std::string& varName, const SALOME::ByteVec& constValue)
640 checkNotAlreadyExistingVar(varName);
641 PickelizedPyObjRdWrServer *tmp(new PickelizedPyObjRdWrServer(this,varName,constValue));
642 CORBA::Object_var ret(tmp->activate());
643 std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(ret),tmp);
647 SALOME::Transaction_ptr DataScopeServerTransaction::createRdOnlyVarTransac(const char *varName, const SALOME::ByteVec& constValue)
649 checkNotAlreadyExistingVar(varName);
650 TransactionRdOnlyVarCreate *ret(new TransactionRdOnlyVarCreate(this,varName,constValue));
651 CORBA::Object_var obj(ret->activate());
652 return SALOME::Transaction::_narrow(obj);
655 SALOME::Transaction_ptr DataScopeServerTransaction::createRdExtVarTransac(const char *varName, const SALOME::ByteVec& constValue)
657 checkNotAlreadyExistingVar(varName);
658 TransactionRdExtVarCreate *ret(new TransactionRdExtVarCreate(this,varName,constValue));
659 CORBA::Object_var obj(ret->activate());
660 return SALOME::Transaction::_narrow(obj);
663 SALOME::Transaction_ptr DataScopeServerTransaction::createRdExtVarFreeStyleTransac(const char *varName, const SALOME::ByteVec& constValue, const char *compareFuncContent)
664 {// no check on varName done here. Will be done on perform
665 TransactionRdExtVarFreeStyleCreate *ret(new TransactionRdExtVarFreeStyleCreate(this,varName,constValue,compareFuncContent));
666 CORBA::Object_var obj(ret->activate());
667 return SALOME::Transaction::_narrow(obj);
670 SALOME::Transaction_ptr DataScopeServerTransaction::createRdExtInitVarTransac(const char *varName, const SALOME::ByteVec& constValue)
672 checkNotAlreadyExistingVar(varName);
673 TransactionRdExtInitVarCreate *ret(new TransactionRdExtInitVarCreate(this,varName,constValue));
674 CORBA::Object_var obj(ret->activate());
675 return SALOME::Transaction::_narrow(obj);
678 SALOME::Transaction_ptr DataScopeServerTransaction::createRdWrVarTransac(const char *varName, const SALOME::ByteVec& constValue)
680 checkNotAlreadyExistingVar(varName);
681 TransactionRdWrVarCreate *ret(new TransactionRdWrVarCreate(this,varName,constValue));
682 CORBA::Object_var obj(ret->activate());
683 return SALOME::Transaction::_narrow(obj);
686 void DataScopeServerTransaction::addWaitKey(KeyWaiter *kw)
689 throw Exception("DataScopeServerTransaction::addWaitKey : NULL input object !");
690 _waiting_keys.push_back(kw);
693 void DataScopeServerTransaction::pingKey(PyObject *keyObj)
696 // this part does nothing except to be sure that in notify key all will be OK.
697 PyObject *args(PyTuple_New(1));
698 PyTuple_SetItem(args,0,keyObj); Py_XINCREF(keyObj);
699 for(std::list< KeyWaiter *>::iterator it=_waiting_keys.begin();it!=_waiting_keys.end();it++,ii++)
701 PyObject *waitKey((*it)->getKeyPyObj());
702 PyObject *meth(PyObject_GetAttrString(waitKey,"__eq__"));
705 std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " no __eq__ in pyobj !";
706 throw Exception(oss.str());
708 PyObject *res(PyObject_CallObject(meth,args));
712 std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " error during cmp(k,wk[i]) !";
713 throw Exception(oss.str());
718 std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " error during interpretation of cmp(k,wk[i]) !";
719 throw Exception(oss.str());
726 void DataScopeServerTransaction::notifyKey(const std::string& varName, PyObject *keyObj, PyObject *valueObj)
729 PyObject *args(PyTuple_New(1));
730 PyTuple_SetItem(args,0,keyObj); Py_XINCREF(keyObj);
731 std::list< KeyWaiter *> newList,listOfEltToWakeUp;
732 for(std::list< KeyWaiter *>::iterator it=_waiting_keys.begin();it!=_waiting_keys.end();it++,ii++)
734 if((*it)->getVarName()!=varName)
736 newList.push_back(*it);
739 PyObject *waitKey((*it)->getKeyPyObj());
740 PyObject *meth(PyObject_GetAttrString(waitKey,"__eq__"));
743 std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " no __eq__ in pyobj !";
744 throw Exception(oss.str());
746 PyObject *res(PyObject_CallObject(meth,args));
748 if(!PyBool_Check(res))
750 std::ostringstream oss; oss << "DataScopeServerTransaction::pingKey : for object id #" << ii << " no __eq__ in pyobj !";
751 throw Exception(oss.str());
755 std::ostringstream oss; oss << "DataScopeServerTransaction::notifyKey : MAIN INTERNAL ERROR ! for object id #" << ii << " error during interpretation of cmp(k,wk[i]) !";
756 throw Exception(oss.str());
759 listOfEltToWakeUp.push_back(*it);
761 newList.push_back(*it);
765 for(std::list< KeyWaiter *>::iterator it=listOfEltToWakeUp.begin();it!=listOfEltToWakeUp.end();it++)
766 (*it)->valueJustCome(valueObj);
767 for(std::list< KeyWaiter *>::iterator it=listOfEltToWakeUp.begin();it!=listOfEltToWakeUp.end();it++)
769 _waiting_keys=newList;
772 SALOME::Transaction_ptr DataScopeServerTransaction::addKeyValueInVarHard(const char *varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value)
774 checkVarExistingAndDict(varName);
775 TransactionAddKeyValueHard *ret(new TransactionAddKeyValueHard(this,varName,key,value));
776 CORBA::Object_var obj(ret->activate());
777 return SALOME::Transaction::_narrow(obj);
780 SALOME::Transaction_ptr DataScopeServerTransaction::addKeyValueInVarErrorIfAlreadyExisting(const char *varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value)
782 checkVarExistingAndDict(varName);
783 TransactionAddKeyValueErrorIfAlreadyExisting *ret(new TransactionAddKeyValueErrorIfAlreadyExisting(this,varName,key,value));
784 CORBA::Object_var obj(ret->activate());
785 return SALOME::Transaction::_narrow(obj);
788 SALOME::TransactionMultiKeyAddSession_ptr DataScopeServerTransaction::addMultiKeyValueSession(const char *varName)
790 checkVarExistingAndDict(varName);
791 TransactionMultiKeyAddSession *ret(new TransactionMultiKeyAddSession(this,varName));
792 CORBA::Object_var obj(ret->activate());
793 return SALOME::TransactionMultiKeyAddSession::_narrow(obj);
796 SALOME::Transaction_ptr DataScopeServerTransaction::removeKeyInVarErrorIfNotAlreadyExisting(const char *varName, const SALOME::ByteVec& key)
798 checkVarExistingAndDict(varName);
799 TransactionRemoveKeyInVarErrorIfNotAlreadyExisting *ret(new TransactionRemoveKeyInVarErrorIfNotAlreadyExisting(this,varName,key));
800 CORBA::Object_var obj(ret->activate());
801 return SALOME::Transaction::_narrow(obj);
804 SALOME::TransactionRdWrAccess_ptr DataScopeServerTransaction::createWorkingVarTransac(const char *varName, const SALOME::ByteVec& constValue)
806 std::string varNameCpp(varName);
807 checkNotAlreadyExistingVar(varName);
808 PickelizedPyObjRdWrServer *tmp(new PickelizedPyObjRdWrServer(this,varNameCpp,constValue));
809 CORBA::Object_var obj(tmp->activate());
810 std::pair< SALOME::BasicDataServer_var, BasicDataServer * > p(SALOME::BasicDataServer::_narrow(obj),tmp);
813 TransactionMorphRdWrIntoRdOnly *ret(new TransactionMorphRdWrIntoRdOnly(this,varName));
814 CORBA::Object_var obj2(ret->activate());
815 return SALOME::TransactionRdWrAccess::_narrow(obj2);
818 SALOME::Transaction_ptr DataScopeServerTransaction::killVarTransac(const char *varName)
820 std::string varNameCpp(varName);
821 checkExistingVar(varNameCpp);
823 TransactionKillVar *ret(new TransactionKillVar(this,varName));
824 CORBA::Object_var obj2(ret->activate());
825 return SALOME::Transaction::_narrow(obj2);
828 SALOME::KeyWaiter_ptr DataScopeServerTransaction::waitForKeyInVar(const char *varName, const SALOME::ByteVec& keyVal)
830 PickelizedPyObjServer *pickelObj(checkVarExistingAndDict(varName));
831 KeyWaiter *ret(new KeyWaiter(pickelObj,keyVal));
832 CORBA::Object_var obj(ret->activate());//KeyWaiter instance activated inside a multithread POA contrary to all of objects in SALOMESDS in single thread !
833 return SALOME::KeyWaiter::_narrow(obj);
836 SALOME::KeyWaiter_ptr DataScopeServerTransaction::waitForKeyInVarAndKillIt(const char *varName, const SALOME::ByteVec& keyVal, SALOME::Transaction_out transac)
838 PickelizedPyObjServer *pickelObj(checkVarExistingAndDict(varName));
839 KeyWaiter *ret0(new KeyWaiter(pickelObj,keyVal));
840 CORBA::Object_var obj(ret0->activate());//KeyWaiter instance activated inside a multithread POA contrary to all of objects in SALOMESDS in single thread !
842 TransactionRemoveKeyInVarErrorIfNotAlreadyExisting *ret1(new TransactionRemoveKeyInVarErrorIfNotAlreadyExisting(this,varName,keyVal));
843 CORBA::Object_var obj2(ret1->activate());
844 transac=SALOME::Transaction::_narrow(obj2);
846 return SALOME::KeyWaiter::_narrow(obj);
849 SALOME::ByteVec *DataScopeServerTransaction::waitForMonoThrRev(SALOME::KeyWaiter_ptr kw)
851 PortableServer::ServantBase *ret(0);
854 ret=_poa_for_key_waiter->reference_to_servant(kw);// Warning ref cnt of ret has been incremented !
856 catch(...) { ret=0; }
857 KeyWaiter *retc(dynamic_cast<KeyWaiter *>(ret));
859 throw Exception("DataScopeServerTransaction::invokeMonoThr : internal error 1 !");
860 retc->_remove_ref();// restore the counter after _poa_for_key_waiter->reference_to_servant(kw)
861 SALOME::ByteVec *zeRet(retc->waitForMonoThr());
862 retc->enforcedRelease();
866 SALOME::ByteVec *DataScopeServerTransaction::waitForAndKill(SALOME::KeyWaiter_ptr kw)
868 PortableServer::ServantBase *ret(0);
871 ret=_poa_for_key_waiter->reference_to_servant(kw);// Warning ref cnt of ret has been incremented !
873 catch(...) { ret=0; }
874 KeyWaiter *retc(dynamic_cast<KeyWaiter *>(ret));
876 throw Exception("DataScopeServerTransaction::invokeMonoThr : internal error 1 !");
877 retc->_remove_ref();// restore the counter after _poa_for_key_waiter->reference_to_servant(kw)
878 SALOME::ByteVec *zeRet(retc->waitForAndKill());
879 retc->enforcedRelease();
883 void DataScopeServerTransaction::atomicApply(const SALOME::ListOfTransaction& transactions)
885 std::size_t sz(transactions.length());
888 std::vector< AutoServantPtr<Transaction> > transactionsCpp(sz);
889 for(std::size_t i=0;i<sz;i++)
891 PortableServer::ServantBase *eltBase(0);
895 eltBase=_poa->reference_to_servant(transactions[(CORBA::ULong)i]); //!< TODO: size_t to CORBA::ULong
896 elt=dynamic_cast<Transaction *>(eltBase);
900 std::ostringstream oss; oss << "DataScopeServerTransaction::atomicApply : the elt #" << i << " is invalid !";
901 throw Exception(oss.str());
905 std::ostringstream oss; oss << "DataScopeServerTransaction::atomicApply : the elt #" << i << " is null ?";
906 throw Exception(oss.str());
909 transactionsCpp[i]=elt;
911 {// important do not merge loops !
912 std::vector<TrustTransaction> transactions2(sz);
913 bool mustRollback(true);
914 for(std::size_t i=0;i<sz;i++)
915 transactions2[i].setTransaction(transactionsCpp[i],&mustRollback);
916 for(std::size_t i=0;i<sz;i++)
917 transactions2[i].operate();
920 for(std::size_t i=0;i<sz;i++)
921 transactionsCpp[i]->notify();
924 DataScopeServerTransaction::~DataScopeServerTransaction()
928 SALOME::RequestSwitcher_ptr DataScopeServerTransaction::getRequestSwitcher()
932 _rs=new RequestSwitcher(_orb,this);
934 CORBA::Object_var obj(_rs->activate());
935 return SALOME::RequestSwitcher::_narrow(obj);