Salome HOME
updated copyright message
[modules/kernel.git] / src / SALOMESDS / SALOMESDS_Transaction.hxx
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_TRANSACTION_HXX__
22 #define __SALOMESDS_TRANSACTION_HXX__
23
24 #include "SALOMEconfig.h"
25 #include CORBA_SERVER_HEADER(SALOME_SDS)
26
27 #include "SALOMESDS_Defines.hxx"
28 #include "SALOMESDS_Exception.hxx"
29 #include "SALOMESDS_DataServerManager.hxx"
30 #include "SALOMESDS_Auto.hxx"
31
32 #include <string>
33 #include <vector>
34
35 namespace SALOMESDS
36 {
37   class PickelizedPyObjServer;
38   class PickelizedPyObjRdWrServer;
39   class PickelizedPyObjRdExtServer;
40
41   class SALOMESDS_EXPORT Transaction : public virtual POA_SALOME::Transaction, public POAHolder
42   {
43   public:
44     Transaction(DataScopeServerTransaction *dsct, const std::string& varName):_dsct(dsct),_var_name(varName) { if(!_dsct) throw Exception("Transaction constructor error !"); }
45     std::string getVarName() const { return _var_name; }
46     void checkVarExisting() { _dsct->checkExistingVar(_var_name); }
47     void checkNotAlreadyExisting() { _dsct->checkNotAlreadyExistingVar(_var_name); }
48     PortableServer::POA_var getPOA() const { return _dsct->getPOA(); }
49     virtual void prepareRollBackInCaseOfFailure() = 0;
50     virtual void perform() = 0;
51     virtual void rollBack() = 0;
52     virtual void notify() = 0;
53     virtual ~Transaction();
54   public:
55     static void FromByteSeqToVB(const SALOME::ByteVec& bsToBeConv, std::vector<unsigned char>& ret);
56     static void FromVBToByteSeq(const std::vector<unsigned char>& bsToBeConv, SALOME::ByteVec& ret);
57   protected:
58     DataScopeServerTransaction *_dsct;
59     std::string _var_name;
60   };
61
62   class TransactionVarCreate : public Transaction
63   {
64   public:
65     TransactionVarCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue);
66     void prepareRollBackInCaseOfFailure() override;
67     void rollBack() override;
68     void notify() override;
69   protected:
70     std::vector<unsigned char> _data;
71   };
72
73   class TransactionRdOnlyVarCreate : public TransactionVarCreate
74   {
75   public:
76     TransactionRdOnlyVarCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue):TransactionVarCreate(dsct,varName,constValue) { }
77     void perform();
78   };
79
80   class TransactionRdExtVarCreate : public TransactionVarCreate
81   {
82   public:
83     TransactionRdExtVarCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue):TransactionVarCreate(dsct,varName,constValue) { }
84     void perform() override;
85   };
86
87   class TransactionRdExtVarFreeStyleCreate : public TransactionRdExtVarCreate
88   {
89   public:
90     TransactionRdExtVarFreeStyleCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue, const char *compareFuncContent);
91     void prepareRollBackInCaseOfFailure() override;
92     void rollBack() override;
93     void perform() override;
94   protected:
95     bool _null_rollback = false;
96     std::string _cmp_func_content;
97     SALOME::AutoPyRef _cmp_func;
98   };
99
100   class TransactionRdExtInitVarCreate : public TransactionVarCreate
101   {
102   public:
103     TransactionRdExtInitVarCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue):TransactionVarCreate(dsct,varName,constValue) { }
104     void perform() override;
105   };
106
107   class TransactionRdWrVarCreate : public TransactionVarCreate
108   {
109   public:
110     TransactionRdWrVarCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue):TransactionVarCreate(dsct,varName,constValue) { }
111     void perform() override;
112   };
113
114   class TransactionKillVar : public Transaction
115   {
116   public:
117     TransactionKillVar(DataScopeServerTransaction *dsct, const std::string& varName);
118     void prepareRollBackInCaseOfFailure() override;
119     void perform() override;
120     void rollBack() override;
121     void notify() override;
122   };
123
124   class PickelizedPyObjServer;
125
126   class TransactionDictModify : public Transaction
127   {
128   public:
129     TransactionDictModify(DataScopeServerTransaction *dsct, const std::string& varName);
130     PickelizedPyObjServer *checkVarExistingAndDict() { return _dsct->checkVarExistingAndDict(_var_name); }
131     void prepareRollBackInCaseOfFailure() override;
132     void rollBack() override;
133   protected:
134     std::string _zeDataBefore;
135     PickelizedPyObjServer *_varc;
136   };
137
138   class TransactionAddKeyValue : public TransactionDictModify
139   {
140   public:
141     TransactionAddKeyValue(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value);
142     void prepareRollBackInCaseOfFailure() override;
143     void notify() override;
144     ~TransactionAddKeyValue();
145   protected:
146     PyObject *_key;
147     PyObject *_value;
148   };
149
150   class TransactionAddKeyValueHard : public TransactionAddKeyValue
151   {
152   public:
153     TransactionAddKeyValueHard(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value);
154     void perform() override;
155   };
156
157   class TransactionAddKeyValueErrorIfAlreadyExisting : public TransactionAddKeyValue
158   {
159   public:
160     TransactionAddKeyValueErrorIfAlreadyExisting(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key, const SALOME::ByteVec& value);
161     void perform() override;
162   };
163
164   class TransactionRemoveKeyInVarErrorIfNotAlreadyExisting : public TransactionDictModify
165   {
166   public:
167     TransactionRemoveKeyInVarErrorIfNotAlreadyExisting(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& key);
168     void perform() override;
169     void notify() override;
170     ~TransactionRemoveKeyInVarErrorIfNotAlreadyExisting();
171   private:
172     PyObject *_key;
173   };
174
175   class TransactionMorphRdWrIntoRdOnly : public Transaction, public virtual POA_SALOME::TransactionRdWrAccess
176   {
177   public:
178     TransactionMorphRdWrIntoRdOnly(DataScopeServerTransaction *dsct, const std::string& varName);
179   public:
180     SALOME::PickelizedPyObjRdWrServer_ptr getVar();
181   public:
182     void prepareRollBackInCaseOfFailure();
183     void perform() override;
184     void rollBack() override;
185     void notify() override;
186   };
187
188   /*!
189    * This transaction switch from RdExt to RdExtInit in constructor and when perform called RdExtInit to RdExt.
190    */
191   class TransactionMultiKeyAddSession : public Transaction, public virtual POA_SALOME::TransactionMultiKeyAddSession
192   {
193   public:
194     TransactionMultiKeyAddSession(DataScopeServerTransaction *dsct, const std::string& varName);
195   public://remotely callable
196     void addKeyValueInVarErrorIfAlreadyExistingNow(const SALOME::ByteVec& key, const SALOME::ByteVec& value);
197   public:
198     void prepareRollBackInCaseOfFailure() override;
199     void perform() override;
200     void rollBack() override;
201     void notify() override;
202   };
203 }
204
205 #endif