diff options
Diffstat (limited to 'cpp')
-rw-r--r-- | cpp/include/Transform/Transformer.h | 3 | ||||
-rw-r--r-- | cpp/src/Transform/TransformDB.cpp | 14 | ||||
-rw-r--r-- | cpp/src/Transform/Transformer.cpp | 10 |
3 files changed, 19 insertions, 8 deletions
diff --git a/cpp/include/Transform/Transformer.h b/cpp/include/Transform/Transformer.h index 5388021f539..3b028be5a2c 100644 --- a/cpp/include/Transform/Transformer.h +++ b/cpp/include/Transform/Transformer.h @@ -28,6 +28,7 @@ #endif class Db; +class DbTxn; namespace Transform { @@ -43,7 +44,7 @@ public: void analyze(std::ostream&, Ice::StringSeq&, Ice::StringSeq&); - void transform(std::istream&, Db*, Db*, std::ostream&); + void transform(std::istream&, Db*, Db*, DbTxn*, std::ostream&); private: diff --git a/cpp/src/Transform/TransformDB.cpp b/cpp/src/Transform/TransformDB.cpp index cc2d9467b03..df948fbbc30 100644 --- a/cpp/src/Transform/TransformDB.cpp +++ b/cpp/src/Transform/TransformDB.cpp @@ -496,6 +496,7 @@ run(int argc, char** argv, const Ice::CommunicatorPtr& communicator) } DbEnv dbEnv(0); + DbTxn* txn = 0; Db* db = 0; Db* dbNew = 0; int status = EXIT_SUCCESS; @@ -511,12 +512,13 @@ run(int argc, char** argv, const Ice::CommunicatorPtr& communicator) u_int32_t flags = DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_RECOVER | DB_CREATE; dbEnv.open(dbEnvName.c_str(), flags, TRANSFORM_DB_MODE); db = new Db(&dbEnv, 0); - db->open(0, dbName.c_str(), 0, DB_BTREE, DB_RDONLY, TRANSFORM_DB_MODE); + dbEnv.txn_begin(0, &txn, 0); + db->open(txn, dbName.c_str(), 0, DB_BTREE, DB_RDONLY, TRANSFORM_DB_MODE); dbNew = new Db(&dbEnv, 0); dbNew->open(0, dbNameNew.c_str(), 0, DB_BTREE, DB_CREATE | DB_EXCL, TRANSFORM_DB_MODE); istringstream istr(descriptors); - transformer.transform(istr, db, dbNew, cerr); + transformer.transform(istr, db, dbNew, txn, cerr); } catch(const DbException& ex) { @@ -525,6 +527,10 @@ run(int argc, char** argv, const Ice::CommunicatorPtr& communicator) } catch(...) { + if(txn) + { + txn->abort(); + } if(db) { db->close(0); @@ -539,6 +545,10 @@ run(int argc, char** argv, const Ice::CommunicatorPtr& communicator) throw; } + if(txn) + { + txn->abort(); + } if(db) { db->close(0); diff --git a/cpp/src/Transform/Transformer.cpp b/cpp/src/Transform/Transformer.cpp index f9a0abbcd4f..c514193f6e1 100644 --- a/cpp/src/Transform/Transformer.cpp +++ b/cpp/src/Transform/Transformer.cpp @@ -346,7 +346,7 @@ public: virtual Slice::UnitPtr newUnit() const; virtual ErrorReporterPtr errorReporter() const; - void transform(const Ice::CommunicatorPtr&, Db*, Db*, bool); + void transform(const Ice::CommunicatorPtr&, Db*, Db*, DbTxn*, bool); private: @@ -1700,12 +1700,12 @@ Transform::TransformerDescriptor::errorReporter() const void Transform::TransformerDescriptor::transform(const Ice::CommunicatorPtr& communicator, Db* db, Db* dbNew, - bool purgeObjects) + DbTxn* txn, bool purgeObjects) { Dbc* dbc = 0; IceInternal::InstancePtr instance = IceInternal::getInstance(communicator); - db->cursor(0, &dbc, 0); + db->cursor(txn, &dbc, 0); communicator->addObjectFactory(new Transform::ObjectFactory(_factory, _old), ""); @@ -2300,7 +2300,7 @@ Transform::Transformer::analyze(ostream& descriptors, Ice::StringSeq& missingTyp } void -Transform::Transformer::transform(istream& is, Db* db, Db* dbNew, ostream& errors) +Transform::Transformer::transform(istream& is, Db* db, Db* dbNew, DbTxn* txn, ostream& errors) { ErrorReporterPtr errorReporter = new ErrorReporter(errors); @@ -2312,7 +2312,7 @@ Transform::Transformer::transform(istream& is, Db* db, Db* dbNew, ostream& error TransformerDescriptorPtr descriptor = dh.descriptor(); descriptor->validate(); - descriptor->transform(_communicator, db, dbNew, _purgeObjects); + descriptor->transform(_communicator, db, dbNew, txn, _purgeObjects); } catch(const IceXML::ParserException& ex) { |