summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/include/Transform/Transformer.h3
-rw-r--r--cpp/src/Transform/TransformDB.cpp14
-rw-r--r--cpp/src/Transform/Transformer.cpp10
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)
{