Version: 9.12.0
SALOMESDS_DataScopeServer.hxx
Go to the documentation of this file.
1 // Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony GEAY (EDF R&D)
20 
21 #ifndef __SALOMESDS_DATASCOPEERVER_HXX__
22 #define __SALOMESDS_DATASCOPEERVER_HXX__
23 
24 #include "SALOMEconfig.h"
25 #include CORBA_SERVER_HEADER(SALOME_SDS)
26 
31 #include "SALOMESDS_Auto.hxx"
32 #include "SALOMESDS_Defines.hxx"
33 #include "SALOME_CPythonHelper.hxx"
34 
35 #include <Python.h>
36 
37 #include <string>
38 #include <vector>
39 #include <list>
40 
42 
43 namespace SALOMESDS
44 {
45  class SALOMESDS_EXPORT DataScopeKiller : public POA_SALOME::DataScopeKiller
46  {
47  public:
48  DataScopeKiller(CORBA::ORB_ptr orb):_orb(CORBA::ORB::_duplicate(orb)) { }
49  void shutdown();
50  private:
51  CORBA::ORB_var _orb;
52  };
53 
55 
60  class SALOMESDS_EXPORT RequestSwitcher : public RequestSwitcherBase, public virtual POA_SALOME::RequestSwitcher
61  {
62  public:
63  RequestSwitcher(CORBA::ORB_ptr orb, DataScopeServerTransaction *ds);
64  SALOME::StringVec *listVars();
65  SALOME::ByteVec *fetchSerializedContent(const char *varName);
66  void fetchAndGetAccessOfVar(const char *varName, CORBA::String_out access, SALOME::ByteVec_out data);
67  private:
70  };
71 
72  class KeyWaiter;
74 
75  class SALOMESDS_EXPORT DataScopeServerBase : public virtual POA_SALOME::DataScopeServerBase, public POAHolder
76  {
77  public:
78  DataScopeServerBase(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName, SALOME_NamingService_Container_Abstract *ns);
80  public: // remote access methods
81  void ping();
82  char *getScopeName();
83  SALOME::StringVec *listVars();
84  CORBA::Boolean existVar(const char *varName);
85  SALOME::BasicDataServer_ptr retrieveVarInternal(const char *varName);
86  void deleteVar(const char *varName);
87  CORBA::Boolean shutdownIfNotHostedByDSM(SALOME::DataScopeKiller_out killer);
88  SALOME::ByteVec *fetchSerializedContent(const char *varName);
89  SALOME::SeqOfByteVec *getAllKeysOfVarWithTypeDict(const char *varName);
90  SALOME::ByteVec *getValueOfVarWithTypeDict(const char *varName, const SALOME::ByteVec& constKey);
91  void takeANap(CORBA::Double napDurationInSec);
92  public:
94  BasicDataServer *retrieveVarInternal2(const std::string& varName);
95  void registerToSalomePiDict() const;
96  void setPOA(PortableServer::POA_var poa);
97  void registerInNS(SALOME::DataScopeServerBase_ptr ptr);
98  PyObject *getGlobals() const { return _pyHelper->getGlobals(); }
99  PyObject *getLocals() const { return _pyHelper->getLocals(); }
100  PyObject *getPickler() const { return _pyHelper->getPickler(); }
101  PortableServer::POA_var getPOA() const { return _poa; }
102  CORBA::ORB_var getORB() { return _orb; }
103  std::string getScopeNameCpp() const { return _name; }
104  static std::string BuildTmpVarNameFrom(const std::string& varName);
105  public:
106  std::vector< std::string> getAllVarNames() const;
107  bool isExistingVar(const std::string& varName) const;
108  void checkNotAlreadyExistingVar(const std::string& varName) const;
109  void checkExistingVar(const std::string& varName) const;
110  PickelizedPyObjServer *checkVarExistingAndDict(const std::string& varName);
111  public:
112  void moveStatusOfVarFromRdWrToRdOnly(const std::string& varName);
113  void moveStatusOfVarFromRdOnlyToRdWr(const std::string& varName);
114  void moveStatusOfVarFromRdExtOrRdExtInitToRdExtInit(const std::string& varName);
115  void moveStatusOfVarFromRdExtOrRdExtInitToRdExt(const std::string& varName);
116  protected:
117  std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::const_iterator retrieveVarInternal3(const std::string& varName) const;
118  std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > >::iterator retrieveVarInternal4(const std::string& varName);
119  protected:
121  const SALOME_CPythonHelper *_pyHelper = nullptr;
122  PortableServer::POA_var _poa;
123  CORBA::ORB_var _orb;
124  std::string _name;
125  std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > > _vars;
126  SALOME::DataScopeKiller_var _killer;
127  static std::size_t COUNTER;
128  };
129 
130  class SALOMESDS_EXPORT DataScopeServer : public DataScopeServerBase, public virtual POA_SALOME::DataScopeServer
131  {
132  public:
133  DataScopeServer(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName, SALOME_NamingService_Container_Abstract *ns);
134  DataScopeServer(const DataScopeServer& other);
135  SALOME::BasicDataServer_ptr retrieveVar(const char *varName) { return retrieveVarInternal(varName); }
136  SALOME::PickelizedPyObjRdOnlyServer_ptr createRdOnlyVar(const char *varName, const SALOME::ByteVec& constValue);
137  SALOME::PickelizedPyObjRdExtServer_ptr createRdExtVar(const char *varName, const SALOME::ByteVec& constValue);
138  SALOME::PickelizedPyObjRdWrServer_ptr createRdWrVar(const char *typeName, const char *varName);
139  ~DataScopeServer();
140  };
141 
142  class SALOMESDS_EXPORT DataScopeServerTransaction : public DataScopeServerBase, public virtual POA_SALOME::DataScopeServerTransaction
143  {
144  public://not remotely callable
145  DataScopeServerTransaction(const SALOME_CPythonHelper *pyHelper, CORBA::ORB_ptr orb, SALOME::DataScopeKiller_var killer, const std::string& scopeName, SALOME_NamingService_Container_Abstract *ns);
148  void createRdOnlyVarInternal(const std::string& varName, const SALOME::ByteVec& constValue);
149  void createRdExtVarInternal(const std::string& varName, const SALOME::ByteVec& constValue);
150  void createRdExtVarFreeStyleInternal(const std::string& varName, const SALOME::ByteVec& constValue, std::string&& compareFuncContent, SALOME::AutoPyRef&& compareFunc);
151  void createRdExtInitVarInternal(const std::string& varName, const SALOME::ByteVec& constValue);
152  void createRdWrVarInternal(const std::string& varName, const SALOME::ByteVec& constValue);
153  PortableServer::POA_var getPOA4KeyWaiter() const { return _poa_for_key_waiter; }
154  void addWaitKey(KeyWaiter *kw);
155  void pingKey(PyObject *keyObj);
156  void notifyKey(const std::string& varName, PyObject *keyObj, PyObject *valueObj);
157  SALOME::ByteVec *waitForMonoThrRev(SALOME::KeyWaiter_ptr kw);
158  SALOME::ByteVec *waitForAndKill(SALOME::KeyWaiter_ptr kw);
159  public://remotely callable
160  char *getAccessOfVar(const char *varName);
161  void fetchAndGetAccessOfVar(const char *varName, CORBA::String_out access, SALOME::ByteVec_out data);
162  SALOME::Transaction_ptr createRdOnlyVarTransac(const char *varName, const SALOME::ByteVec& constValue);
163  SALOME::Transaction_ptr createRdExtVarTransac(const char *varName, const SALOME::ByteVec& constValue);
164  SALOME::Transaction_ptr createRdExtVarFreeStyleTransac(const char *varName, const SALOME::ByteVec& constValue, const char *compareFuncContent);
165  SALOME::Transaction_ptr createRdExtInitVarTransac(const char *varName, const SALOME::ByteVec& constValue);
166  SALOME::Transaction_ptr createRdWrVarTransac(const char *varName, const SALOME::ByteVec& constValue);
167  SALOME::Transaction_ptr addKeyValueInVarHard(const char *varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value);
168  SALOME::Transaction_ptr addKeyValueInVarErrorIfAlreadyExisting(const char *varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value);
169  SALOME::TransactionMultiKeyAddSession_ptr addMultiKeyValueSession(const char *varName);
170  SALOME::Transaction_ptr removeKeyInVarErrorIfNotAlreadyExisting(const char *varName, const SALOME::ByteVec& key);
171  SALOME::TransactionRdWrAccess_ptr createWorkingVarTransac(const char *varName, const SALOME::ByteVec& constValue);
172  SALOME::Transaction_ptr killVarTransac(const char *varName);
173  SALOME::KeyWaiter_ptr waitForKeyInVar(const char *varName, const SALOME::ByteVec& keyVal);
174  SALOME::KeyWaiter_ptr waitForKeyInVarAndKillIt(const char *varName, const SALOME::ByteVec& keyVal, SALOME::Transaction_out transac);
175  void atomicApply(const SALOME::ListOfTransaction& transactions);
176  SALOME::RequestSwitcher_ptr getRequestSwitcher();
177  private:
178  PortableServer::POA_var _poa_for_key_waiter;
179  std::list< KeyWaiter * > _waiting_keys;
181  };
182 }
183 
184 #endif
static PortableServer::POA_var _poa
Definition: SALOMEDS_Study_i.cxx:70
#define SALOMESDS_EXPORT
Definition: SALOMESDS_Defines.hxx:30
Definition: SALOMESDS_AutoRefCountPtr.hxx:110
Definition: SALOMESDS_BasicDataServer.hxx:36
Definition: SALOMESDS_DataScopeServer.hxx:46
DataScopeKiller(CORBA::ORB_ptr orb)
Definition: SALOMESDS_DataScopeServer.hxx:48
CORBA::ORB_var _orb
Definition: SALOMESDS_DataScopeServer.hxx:51
Definition: SALOMESDS_DataScopeServer.hxx:76
PortableServer::POA_var getPOA() const
Definition: SALOMESDS_DataScopeServer.hxx:101
PyObject * getGlobals() const
Definition: SALOMESDS_DataScopeServer.hxx:98
std::list< std::pair< SALOME::BasicDataServer_var, BasicDataServer * > > _vars
Definition: SALOMESDS_DataScopeServer.hxx:125
CORBA::ORB_var getORB()
Definition: SALOMESDS_DataScopeServer.hxx:102
std::string getScopeNameCpp() const
Definition: SALOMESDS_DataScopeServer.hxx:103
PortableServer::POA_var _poa
Definition: SALOMESDS_DataScopeServer.hxx:122
static std::size_t COUNTER
Definition: SALOMESDS_DataScopeServer.hxx:127
CORBA::ORB_var _orb
Definition: SALOMESDS_DataScopeServer.hxx:123
std::string _name
Definition: SALOMESDS_DataScopeServer.hxx:124
PyObject * getLocals() const
Definition: SALOMESDS_DataScopeServer.hxx:99
PyObject * getPickler() const
Definition: SALOMESDS_DataScopeServer.hxx:100
SALOME::DataScopeKiller_var _killer
Definition: SALOMESDS_DataScopeServer.hxx:126
Definition: SALOMESDS_DataScopeServer.hxx:143
std::list< KeyWaiter * > _waiting_keys
Definition: SALOMESDS_DataScopeServer.hxx:179
PortableServer::POA_var getPOA4KeyWaiter() const
Definition: SALOMESDS_DataScopeServer.hxx:153
AutoServantPtr< RequestSwitcher > _rs
Definition: SALOMESDS_DataScopeServer.hxx:180
PortableServer::POA_var _poa_for_key_waiter
Definition: SALOMESDS_DataScopeServer.hxx:178
Definition: SALOMESDS_DataScopeServer.hxx:131
SALOME::BasicDataServer_ptr retrieveVar(const char *varName)
Definition: SALOMESDS_DataScopeServer.hxx:135
Definition: SALOMESDS_KeyWaiter.hxx:41
Definition: SALOMESDS_AutoRefCountPtr.hxx:31
Definition: SALOMESDS_PickelizedPyObjServer.hxx:36
Servant activated by a specific POA (single thread) having itself its specific POA_manager.
Definition: SALOMESDS_RequestSwitcher.hxx:36
Servant activated by a specific POA (single thread) having itself its specific POA_manager.
Definition: SALOMESDS_DataScopeServer.hxx:61
DataScopeServerTransaction * _ds
handle on its creator to give access to services when _poa_manager_under_control is in hold mode.
Definition: SALOMESDS_DataScopeServer.hxx:69
Definition: SALOMESDS_Auto.hxx:28
Definition: SALOME_CPythonHelper.hxx:31
Definition: SALOME_NamingService_Abstract.hxx:32
Definition: SALOMESDS_AutoRefCountPtr.hxx:29
poa
Definition: SALOME_ContainerPy.py:377
sequence< string > StringVec
Definition: SALOME_CommonTypes.idl:26
sequence< ByteVec > SeqOfByteVec
Definition: SALOME_SDS.idl:31
@ shutdown
Session is shutting down.
Definition: SALOME_Session.idl:41
sequence< octet > ByteVec
Definition: SALOME_CommonTypes.idl:28
sequence< Transaction > ListOfTransaction
Definition: SALOME_SDS.idl:132
string scopeName
Definition: TestSalomeSDSHelper0.py:24
string varName
Definition: TestSalomeSDSHelper0.py:25
orb
Definition: salome.py:122