X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSALOMESDS%2FSALOMESDS_Transaction.cxx;h=a86a8ab9e52080854df45681783f7843399ba4ff;hb=f6120c1bdb84ed1cc827ffab8284c0ac2709189f;hp=26fd9affe464d43cb3b4f57c349c4df61cc192cf;hpb=3e8cb819ece8ab264fe0c8d6d970387d2bfeb755;p=modules%2Fkernel.git diff --git a/src/SALOMESDS/SALOMESDS_Transaction.cxx b/src/SALOMESDS/SALOMESDS_Transaction.cxx index 26fd9affe..a86a8ab9e 100644 --- a/src/SALOMESDS/SALOMESDS_Transaction.cxx +++ b/src/SALOMESDS/SALOMESDS_Transaction.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -35,15 +35,15 @@ void Transaction::FromByteSeqToVB(const SALOME::ByteVec& bsToBeConv, std::vector ret.resize(sz); unsigned char *buf(const_cast(&ret[0])); for(std::size_t i=0;i& bsToBeConv, SALOME::ByteVec& ret) { std::size_t sz(bsToBeConv.size()); - ret.length(sz); + ret.length((CORBA::ULong)sz); //!< TODO: size_t to CORBA::ULong for(std::size_t i=0;icreateRdExtVarInternal(_var_name,data2); } +TransactionRdExtVarFreeStyleCreate::TransactionRdExtVarFreeStyleCreate(DataScopeServerTransaction *dsct, const std::string& varName, const SALOME::ByteVec& constValue, const char *compareFuncContent):TransactionRdExtVarCreate(dsct,varName,constValue),_cmp_func_content(compareFuncContent),_cmp_func(nullptr) +{ + constexpr char EXPECTED_COMPARE_FUNC_NAME[]="comptchev"; + SALOME::AutoPyRef context(PyDict_New()); + SALOME::AutoPyRef res(PyRun_String(compareFuncContent,Py_file_input,_dsct->getGlobals(),context)); + if(res.isNull()) + { + std::ostringstream oss; oss << "TransactionRdExtVarFreeStyleCreate ctor : Fail to parse and evaluate \"" << compareFuncContent << "\" as python function !"; + throw Exception(oss.str()); + } + PyObject *func(PyDict_GetItemString(context,EXPECTED_COMPARE_FUNC_NAME));//borrowed + if(!func) + { + std::ostringstream oss; oss << "TransactionRdExtVarFreeStyleCreate ctor : Parsing of func is OK but not func called \"" << EXPECTED_COMPARE_FUNC_NAME << "\" is the given parsed string !"; + throw Exception(oss.str()); + } + _cmp_func = func; Py_XINCREF(func); + if(PyDict_DelItemString(context,EXPECTED_COMPARE_FUNC_NAME)!=0) + { + std::ostringstream oss; oss << "TransactionRdExtVarFreeStyleCreate ctor : Internal error during suppression of \"" << EXPECTED_COMPARE_FUNC_NAME << "\" key that exepect to be present ! Smells bad !"; + throw Exception(oss.str()); + } +} + +void TransactionRdExtVarFreeStyleCreate::prepareRollBackInCaseOfFailure() +{//nothing it is not a bug +} + +void TransactionRdExtVarFreeStyleCreate::rollBack() +{// nothing to be done here. Fress style means I don t care. Do not remove var. + if(!_null_rollback) + TransactionRdExtVarCreate::rollBack(); +} + +void TransactionRdExtVarFreeStyleCreate::perform() +{ + SALOME::ByteVec data2; + FromVBToByteSeq(_data,data2); + try + { + _dsct->createRdExtVarFreeStyleInternal(_var_name,data2,std::move(_cmp_func_content),std::move(_cmp_func)); + } + catch(NotSameException& e) + { + _null_rollback = true; + throw e; + } +} + void TransactionRdExtInitVarCreate::perform() { SALOME::ByteVec data2;