1 // Copyright (C) 2007-2016 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_Transaction.hxx"
22 #include "SALOMESDS_Exception.hxx"
23 #include "SALOMESDS_PickelizedPyObjServer.hxx"
24 #include "SALOMESDS_PickelizedPyObjRdWrServer.hxx"
25 #include "SALOMESDS_PickelizedPyObjRdExtServer.hxx"
26 #include "SALOMESDS_TrustTransaction.hxx"
30 using namespace SALOMESDS;
32 void Transaction::FromByteSeqToVB(const SALOME::ByteVec& bsToBeConv, std::vector<unsigned char>& ret)
34 std::size_t sz(bsToBeConv.length());
36 unsigned char *buf(const_cast<unsigned char *>(&ret[0]));
37 for(std::size_t i=0;i<sz;i++)
41 void Transaction::FromVBToByteSeq(const std::vector<unsigned char>& bsToBeConv, SALOME::ByteVec& ret)
43 std::size_t sz(bsToBeConv.size());
45 for(std::size_t i=0;i<sz;i++)
49 Transaction::~Transaction()
53 TransactionVarCreate::TransactionVarCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue):Transaction(dsct,varName)
55 FromByteSeqToVB(constValue,_data);
58 void TransactionVarCreate::prepareRollBackInCaseOfFailure()
60 checkNotAlreadyExisting();
63 void TransactionVarCreate::rollBack()
65 if(_dsct->existVar(_var_name.c_str()))
66 _dsct->deleteVar(_var_name.c_str());
70 * no implementation it is not a bug !
72 void TransactionVarCreate::notify()
76 void TransactionRdOnlyVarCreate::perform()
78 SALOME::ByteVec data2;
79 FromVBToByteSeq(_data,data2);
80 _dsct->createRdOnlyVarInternal(_var_name,data2);
83 void TransactionRdExtVarCreate::perform()
85 SALOME::ByteVec data2;
86 FromVBToByteSeq(_data,data2);
87 _dsct->createRdExtVarInternal(_var_name,data2);
90 TransactionRdExtVarFreeStyleCreate::TransactionRdExtVarFreeStyleCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue, const char *compareFuncContent):_cmp_func_content(compareFuncContent),_cmp_func(nullptr),TransactionRdExtVarCreate(dsct,varName,constValue)
92 constexpr char EXPECTED_COMPARE_FUNC_NAME[]="comptchev";
93 SALOME::AutoPyRef context(PyDict_New());
94 SALOME::AutoPyRef res(PyRun_String(compareFuncContent,Py_file_input,_dsct->getGlobals(),context));
97 std::ostringstream oss; oss << "TransactionRdExtVarFreeStyleCreate ctor : Fail to parse and evaluate \"" << compareFuncContent << "\" as python function !";
98 throw Exception(oss.str());
100 PyObject *func(PyDict_GetItemString(context,EXPECTED_COMPARE_FUNC_NAME));//borrowed
103 std::ostringstream oss; oss << "TransactionRdExtVarFreeStyleCreate ctor : Parsing of func is OK but not func called \"" << EXPECTED_COMPARE_FUNC_NAME << "\" is the given parsed string !";
104 throw Exception(oss.str());
106 _cmp_func = func; Py_XINCREF(func);
107 if(PyDict_DelItemString(context,EXPECTED_COMPARE_FUNC_NAME)!=0)
109 std::ostringstream oss; oss << "TransactionRdExtVarFreeStyleCreate ctor : Internal error during suppression of \"" << EXPECTED_COMPARE_FUNC_NAME << "\" key that exepect to be present ! Smells bad !";
110 throw Exception(oss.str());
114 void TransactionRdExtVarFreeStyleCreate::prepareRollBackInCaseOfFailure()
115 {//nothing it is not a bug
118 void TransactionRdExtVarFreeStyleCreate::rollBack()
119 {// nothing to be done here. Fress style means I don t care. Do not remove var.
121 TransactionRdExtVarCreate::rollBack();
124 void TransactionRdExtVarFreeStyleCreate::perform()
126 SALOME::ByteVec data2;
127 FromVBToByteSeq(_data,data2);
130 _dsct->createRdExtVarFreeStyleInternal(_var_name,data2,std::move(_cmp_func_content),std::move(_cmp_func));
132 catch(NotSameException& e)
134 _null_rollback = true;
139 void TransactionRdExtInitVarCreate::perform()
141 SALOME::ByteVec data2;
142 FromVBToByteSeq(_data,data2);
143 _dsct->createRdExtInitVarInternal(_var_name,data2);
146 void TransactionRdWrVarCreate::perform()
148 SALOME::ByteVec data2;
149 FromVBToByteSeq(_data,data2);
150 _dsct->createRdWrVarInternal(_var_name,data2);
153 TransactionKillVar::TransactionKillVar(DataScopeServerTransaction *dsct, const std::string& varName):Transaction(dsct,varName)
160 void TransactionKillVar::prepareRollBackInCaseOfFailure()
163 //BasicDataServer *bds(_dsct->retrieveVarInternal2(_var_name);
167 void TransactionKillVar::perform()
169 _dsct->deleteVar(_var_name.c_str());
175 void TransactionKillVar::rollBack()
180 * no implementation it is not a bug ! killVar is not an event.
182 void TransactionKillVar::notify()
186 TransactionDictModify::TransactionDictModify(DataScopeServerTransaction *dsct, const std::string& varName):Transaction(dsct,varName),_varc(0)
188 _varc=checkVarExistingAndDict();
191 void TransactionDictModify::prepareRollBackInCaseOfFailure()
193 _zeDataBefore.clear();
194 PyObject *zeDictPy(_varc->getPyObj());
195 Py_XINCREF(zeDictPy);
196 _zeDataBefore=_varc->pickelize(zeDictPy);
199 void TransactionDictModify::rollBack()
201 PyObject *obj(_varc->getPyObjFromPickled(_zeDataBefore));
202 _varc->setNewPyObj(obj);
203 _zeDataBefore.clear();
206 TransactionAddKeyValue::TransactionAddKeyValue(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value):TransactionDictModify(dsct,varName)
208 std::vector<unsigned char> key2,value2;
209 FromByteSeqToVB(key,key2);
210 FromByteSeqToVB(value,value2);
211 _key=PickelizedPyObjServer::GetPyObjFromPickled(key2,_dsct);
212 _value=PickelizedPyObjServer::GetPyObjFromPickled(value2,_dsct);
215 void TransactionAddKeyValue::prepareRollBackInCaseOfFailure()
217 TransactionDictModify::prepareRollBackInCaseOfFailure();
218 _dsct->pingKey(_key);// check that key is OK with all waiting keys
221 void TransactionAddKeyValue::notify()
223 _dsct->notifyKey(getVarName(),_key,_value);
226 TransactionAddKeyValue::~TransactionAddKeyValue()
232 TransactionAddKeyValueHard::TransactionAddKeyValueHard(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value):TransactionAddKeyValue(dsct,varName,key,value)
236 void TransactionAddKeyValueHard::perform()
238 _varc->addKeyValueHard(_key,_value);
241 TransactionAddKeyValueErrorIfAlreadyExisting::TransactionAddKeyValueErrorIfAlreadyExisting(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value):TransactionAddKeyValue(dsct,varName,key,value)
243 _varc->checkKeyNotAlreadyPresent(_key);
246 void TransactionAddKeyValueErrorIfAlreadyExisting::perform()
248 _varc->addKeyValueErrorIfAlreadyExisting(_key,_value);
251 TransactionRemoveKeyInVarErrorIfNotAlreadyExisting::TransactionRemoveKeyInVarErrorIfNotAlreadyExisting(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key):TransactionDictModify(dsct,varName),_key(0)
253 std::vector<unsigned char> key2;
254 FromByteSeqToVB(key,key2);
255 _key=PickelizedPyObjServer::GetPyObjFromPickled(key2,_dsct);
258 void TransactionRemoveKeyInVarErrorIfNotAlreadyExisting::perform()
260 _varc->removeKeyInVarErrorIfNotAlreadyExisting(_key);
264 * no implementation it is not a bug !
266 void TransactionRemoveKeyInVarErrorIfNotAlreadyExisting::notify()
270 TransactionRemoveKeyInVarErrorIfNotAlreadyExisting::~TransactionRemoveKeyInVarErrorIfNotAlreadyExisting()
275 TransactionMorphRdWrIntoRdOnly::TransactionMorphRdWrIntoRdOnly(DataScopeServerTransaction *dsct, const std::string& varName):Transaction(dsct,varName)
279 SALOME::PickelizedPyObjRdWrServer_ptr TransactionMorphRdWrIntoRdOnly::getVar()
281 SALOME::BasicDataServer_var obj(_dsct->retrieveVarInternal(_var_name.c_str()));
282 SALOME::PickelizedPyObjRdWrServer_ptr ret(SALOME::PickelizedPyObjRdWrServer::_narrow(obj));
283 if(CORBA::is_nil(ret))
285 std::ostringstream oss; oss << "TransactionMorphRdWrIntoRdOnly::getVar : var \"" << _var_name << "\" has not expected PickelizedPyObjRdWrServer type !";
286 throw Exception(oss.str());
291 void TransactionMorphRdWrIntoRdOnly::prepareRollBackInCaseOfFailure()
293 BasicDataServer *var(_dsct->retrieveVarInternal2(_var_name));
295 throw Exception("TransactionMorphRdWrIntoRdOnly::prepareRollBackInCaseOfFailure : Returned var is NULL !");
296 PickelizedPyObjRdWrServer *varc(dynamic_cast<PickelizedPyObjRdWrServer *>(var));
298 throw Exception("TransactionMorphRdWrIntoRdOnly::prepareRollBackInCaseOfFailure : Returned var has not expected type !");
301 void TransactionMorphRdWrIntoRdOnly::perform()
303 _dsct->moveStatusOfVarFromRdWrToRdOnly(_var_name);
306 void TransactionMorphRdWrIntoRdOnly::rollBack()
308 _dsct->moveStatusOfVarFromRdOnlyToRdWr(_var_name);
312 * no implementation it is not a bug !
314 void TransactionMorphRdWrIntoRdOnly::notify()
318 TransactionMultiKeyAddSession::TransactionMultiKeyAddSession(DataScopeServerTransaction *dsct, const std::string& varName):Transaction(dsct,varName)
320 _dsct->moveStatusOfVarFromRdExtOrRdExtInitToRdExtInit(_var_name);
323 void TransactionMultiKeyAddSession::addKeyValueInVarErrorIfAlreadyExistingNow(const SALOME::ByteVec& key, const SALOME::ByteVec& value)
325 _dsct->checkVarExistingAndDict(_var_name);
326 TransactionAddKeyValueErrorIfAlreadyExisting ret(_dsct,_var_name,key,value);
329 /*bool mustRollback(true);
331 t.setTransaction(&ret,&mustRollback);
333 mustRollback=false;//important let this line to notify t that everything was OK*/
339 * no implementation it is not a bug !
341 void TransactionMultiKeyAddSession::prepareRollBackInCaseOfFailure()
345 void TransactionMultiKeyAddSession::perform()
347 _dsct->moveStatusOfVarFromRdExtOrRdExtInitToRdExt(_var_name);
351 * no implementation it is not a bug !
353 void TransactionMultiKeyAddSession::rollBack()
358 * no implementation it is not a bug !
360 void TransactionMultiKeyAddSession::notify()