]> SALOME platform Git repositories - modules/yacs.git/blob - src/SALOMESDS/SALOMESDS_Transaction.cxx
Salome HOME
[EDF17719] : Comparison between 2 objects is now a user defined function called ...
[modules/yacs.git] / src / SALOMESDS / SALOMESDS_Transaction.cxx
1 // Copyright (C) 2007-2016  CEA/DEN, EDF R&D, 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 #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"
27
28 #include <sstream>
29
30 using namespace SALOMESDS;
31
32 void Transaction::FromByteSeqToVB(const SALOME::ByteVec& bsToBeConv, std::vector<unsigned char>& ret)
33 {
34   std::size_t sz(bsToBeConv.length());
35   ret.resize(sz);
36   unsigned char *buf(const_cast<unsigned char *>(&ret[0]));
37   for(std::size_t i=0;i<sz;i++)
38     buf[i]=bsToBeConv[i];
39 }
40
41 void Transaction::FromVBToByteSeq(const std::vector<unsigned char>& bsToBeConv, SALOME::ByteVec& ret)
42 {
43   std::size_t sz(bsToBeConv.size());
44   ret.length(sz);
45   for(std::size_t i=0;i<sz;i++)
46     ret[i]=bsToBeConv[i];
47 }
48
49 Transaction::~Transaction()
50 {
51 }
52
53 TransactionVarCreate::TransactionVarCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue):Transaction(dsct,varName)
54 {
55   FromByteSeqToVB(constValue,_data);
56 }
57
58 void TransactionVarCreate::prepareRollBackInCaseOfFailure()
59 {
60   checkNotAlreadyExisting();
61 }
62
63 void TransactionVarCreate::rollBack()
64 {
65   if(_dsct->existVar(_var_name.c_str()))
66     _dsct->deleteVar(_var_name.c_str());
67 }
68
69 /*!
70  * no implementation it is not a bug !
71  */
72 void TransactionVarCreate::notify()
73 {
74 }
75
76 void TransactionRdOnlyVarCreate::perform()
77 {
78   SALOME::ByteVec data2;
79   FromVBToByteSeq(_data,data2);
80   _dsct->createRdOnlyVarInternal(_var_name,data2);
81 }
82
83 void TransactionRdExtVarCreate::perform()
84 {
85   SALOME::ByteVec data2;
86   FromVBToByteSeq(_data,data2);
87   _dsct->createRdExtVarInternal(_var_name,data2);
88 }
89
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)
91 {
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));
95   if(res.isNull())
96     {
97       std::ostringstream oss; oss << "TransactionRdExtVarFreeStyleCreate ctor : Fail to parse and evaluate \"" << compareFuncContent << "\" as python function !";
98       throw Exception(oss.str());
99     }
100   PyObject *func(PyDict_GetItemString(context,EXPECTED_COMPARE_FUNC_NAME));//borrowed
101   if(!func)
102     {
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());
105     }
106   _cmp_func = func; Py_XINCREF(func);
107   if(PyDict_DelItemString(context,EXPECTED_COMPARE_FUNC_NAME)!=0)
108     {
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());
111     }
112 }
113
114 void TransactionRdExtVarFreeStyleCreate::prepareRollBackInCaseOfFailure()
115 {//nothing it is not a bug
116 }
117
118 void TransactionRdExtVarFreeStyleCreate::perform()
119 {
120   SALOME::ByteVec data2;
121   FromVBToByteSeq(_data,data2);
122   _dsct->createRdExtVarFreeStyleInternal(_var_name,data2,std::move(_cmp_func_content),std::move(_cmp_func));
123 }
124
125 void TransactionRdExtInitVarCreate::perform()
126 {
127   SALOME::ByteVec data2;
128   FromVBToByteSeq(_data,data2);
129   _dsct->createRdExtInitVarInternal(_var_name,data2);
130 }
131
132 void TransactionRdWrVarCreate::perform()
133 {
134   SALOME::ByteVec data2;
135   FromVBToByteSeq(_data,data2);
136   _dsct->createRdWrVarInternal(_var_name,data2);
137 }
138
139 TransactionKillVar::TransactionKillVar(DataScopeServerTransaction *dsct, const std::string& varName):Transaction(dsct,varName)
140 {
141 }
142
143 /*!
144  * TODO
145  */
146 void TransactionKillVar::prepareRollBackInCaseOfFailure()
147 {
148   checkVarExisting();
149   //BasicDataServer *bds(_dsct->retrieveVarInternal2(_var_name);
150   //bds->clone();
151 }
152
153 void TransactionKillVar::perform()
154 {
155   _dsct->deleteVar(_var_name.c_str());
156 }
157
158 /*!
159  * TODO
160  */
161 void TransactionKillVar::rollBack()
162 {
163 }
164
165 /*!
166  * no implementation it is not a bug ! killVar is not an event.
167  */
168 void TransactionKillVar::notify()
169 {
170 }
171
172 TransactionDictModify::TransactionDictModify(DataScopeServerTransaction *dsct, const std::string& varName):Transaction(dsct,varName),_varc(0)
173 {
174   _varc=checkVarExistingAndDict();
175 }
176
177 void TransactionDictModify::prepareRollBackInCaseOfFailure()
178 {
179   _zeDataBefore.clear();
180   PyObject *zeDictPy(_varc->getPyObj());
181   Py_XINCREF(zeDictPy);
182   _zeDataBefore=_varc->pickelize(zeDictPy);
183 }
184
185 void TransactionDictModify::rollBack()
186 {
187   PyObject *obj(_varc->getPyObjFromPickled(_zeDataBefore));
188   _varc->setNewPyObj(obj);
189   _zeDataBefore.clear();
190 }
191
192 TransactionAddKeyValue::TransactionAddKeyValue(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value):TransactionDictModify(dsct,varName)
193 {
194   std::vector<unsigned char> key2,value2;
195   FromByteSeqToVB(key,key2);
196   FromByteSeqToVB(value,value2);
197   _key=PickelizedPyObjServer::GetPyObjFromPickled(key2,_dsct);
198   _value=PickelizedPyObjServer::GetPyObjFromPickled(value2,_dsct);
199 }
200
201 void TransactionAddKeyValue::prepareRollBackInCaseOfFailure()
202 {
203   TransactionDictModify::prepareRollBackInCaseOfFailure();
204   _dsct->pingKey(_key);// check that key is OK with all waiting keys
205 }
206
207 void TransactionAddKeyValue::notify()
208 {
209   _dsct->notifyKey(getVarName(),_key,_value);
210 }
211
212 TransactionAddKeyValue::~TransactionAddKeyValue()
213 {
214   Py_XDECREF(_key);
215   Py_XDECREF(_value);
216 }
217
218 TransactionAddKeyValueHard::TransactionAddKeyValueHard(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value):TransactionAddKeyValue(dsct,varName,key,value)
219 {
220 }
221
222 void TransactionAddKeyValueHard::perform()
223 {
224   _varc->addKeyValueHard(_key,_value);
225 }
226
227 TransactionAddKeyValueErrorIfAlreadyExisting::TransactionAddKeyValueErrorIfAlreadyExisting(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value):TransactionAddKeyValue(dsct,varName,key,value)
228 {
229   _varc->checkKeyNotAlreadyPresent(_key);
230 }
231
232 void TransactionAddKeyValueErrorIfAlreadyExisting::perform()
233 {
234   _varc->addKeyValueErrorIfAlreadyExisting(_key,_value);
235 }
236
237 TransactionRemoveKeyInVarErrorIfNotAlreadyExisting::TransactionRemoveKeyInVarErrorIfNotAlreadyExisting(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key):TransactionDictModify(dsct,varName),_key(0)
238 {
239   std::vector<unsigned char> key2;
240   FromByteSeqToVB(key,key2);
241   _key=PickelizedPyObjServer::GetPyObjFromPickled(key2,_dsct);
242 }
243
244 void TransactionRemoveKeyInVarErrorIfNotAlreadyExisting::perform()
245 {
246   _varc->removeKeyInVarErrorIfNotAlreadyExisting(_key);
247 }
248
249 /*!
250  * no implementation it is not a bug !
251  */
252 void TransactionRemoveKeyInVarErrorIfNotAlreadyExisting::notify()
253 {
254 }
255
256 TransactionRemoveKeyInVarErrorIfNotAlreadyExisting::~TransactionRemoveKeyInVarErrorIfNotAlreadyExisting()
257 {
258   Py_XDECREF(_key);
259 }
260
261 TransactionMorphRdWrIntoRdOnly::TransactionMorphRdWrIntoRdOnly(DataScopeServerTransaction *dsct, const std::string& varName):Transaction(dsct,varName)
262 {
263 }
264
265 SALOME::PickelizedPyObjRdWrServer_ptr TransactionMorphRdWrIntoRdOnly::getVar()
266 {
267   SALOME::BasicDataServer_var obj(_dsct->retrieveVarInternal(_var_name.c_str()));
268   SALOME::PickelizedPyObjRdWrServer_ptr ret(SALOME::PickelizedPyObjRdWrServer::_narrow(obj));
269   if(CORBA::is_nil(ret))
270     {
271       std::ostringstream oss; oss << "TransactionMorphRdWrIntoRdOnly::getVar : var \"" << _var_name << "\" has not expected PickelizedPyObjRdWrServer type !";
272       throw Exception(oss.str());
273     }
274   return ret;
275 }
276
277 void TransactionMorphRdWrIntoRdOnly::prepareRollBackInCaseOfFailure()
278 {
279   BasicDataServer *var(_dsct->retrieveVarInternal2(_var_name));
280   if(!var)
281     throw Exception("TransactionMorphRdWrIntoRdOnly::prepareRollBackInCaseOfFailure : Returned var is NULL !");
282   PickelizedPyObjRdWrServer *varc(dynamic_cast<PickelizedPyObjRdWrServer *>(var));
283   if(!varc)
284     throw Exception("TransactionMorphRdWrIntoRdOnly::prepareRollBackInCaseOfFailure : Returned var has not expected type !");
285 }
286
287 void TransactionMorphRdWrIntoRdOnly::perform()
288 {
289   _dsct->moveStatusOfVarFromRdWrToRdOnly(_var_name);
290 }
291
292 void TransactionMorphRdWrIntoRdOnly::rollBack()
293 {
294   _dsct->moveStatusOfVarFromRdOnlyToRdWr(_var_name);
295 }
296
297 /*!
298  * no implementation it is not a bug !
299  */
300 void TransactionMorphRdWrIntoRdOnly::notify()
301 {
302 }
303
304 TransactionMultiKeyAddSession::TransactionMultiKeyAddSession(DataScopeServerTransaction *dsct, const std::string& varName):Transaction(dsct,varName)
305 {
306   _dsct->moveStatusOfVarFromRdExtOrRdExtInitToRdExtInit(_var_name);
307 }
308
309 void TransactionMultiKeyAddSession::addKeyValueInVarErrorIfAlreadyExistingNow(const SALOME::ByteVec& key, const SALOME::ByteVec& value)
310 {
311   _dsct->checkVarExistingAndDict(_var_name);
312   TransactionAddKeyValueErrorIfAlreadyExisting ret(_dsct,_var_name,key,value);
313   {
314     ret.perform();
315     /*bool mustRollback(true);
316     TrustTransaction t;
317     t.setTransaction(&ret,&mustRollback);
318     t.operate();
319     mustRollback=false;//important let this line to notify t that everything was OK*/
320   }
321   ret.notify();
322 }
323
324 /*!
325  * no implementation it is not a bug !
326  */
327 void TransactionMultiKeyAddSession::prepareRollBackInCaseOfFailure()
328 {
329 }
330
331 void TransactionMultiKeyAddSession::perform()
332 {
333   _dsct->moveStatusOfVarFromRdExtOrRdExtInitToRdExt(_var_name);
334 }
335
336 /*!
337  * no implementation it is not a bug !
338  */
339 void TransactionMultiKeyAddSession::rollBack()
340 {
341 }
342
343 /*!
344  * no implementation it is not a bug !
345  */
346 void TransactionMultiKeyAddSession::notify()
347 {
348 }
349