diff options
author | Mark Spruiell <mes@zeroc.com> | 2004-04-23 19:27:48 +0000 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2004-04-23 19:27:48 +0000 |
commit | 537d42cd60f96f3bc81f2e3edde22ca2241b1470 (patch) | |
tree | c58533488ea04fda84e70525f87bbef83a212d1b /cpp/src | |
parent | more error checking (diff) | |
download | ice-537d42cd60f96f3bc81f2e3edde22ca2241b1470.tar.bz2 ice-537d42cd60f96f3bc81f2e3edde22ca2241b1470.tar.xz ice-537d42cd60f96f3bc81f2e3edde22ca2241b1470.zip |
more error handling; make facet name accessible to <record>
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/FreezeScript/DumpDB.cpp | 45 | ||||
-rw-r--r-- | cpp/src/FreezeScript/DumpDescriptors.cpp | 7 | ||||
-rw-r--r-- | cpp/src/FreezeScript/DumpDescriptors.h | 2 |
3 files changed, 43 insertions, 11 deletions
diff --git a/cpp/src/FreezeScript/DumpDB.cpp b/cpp/src/FreezeScript/DumpDB.cpp index 654d19927c3..acd93c25837 100644 --- a/cpp/src/FreezeScript/DumpDB.cpp +++ b/cpp/src/FreezeScript/DumpDB.cpp @@ -446,7 +446,11 @@ run(int argc, char** argv, const Ice::CommunicatorPtr& communicator) if(evictor) { // - // Open the database and collect the names of the embedded databases. + // The evictor database file contains multiple databases. We must first + // determine the names of those databases, ignoring any whose names + // begin with "$index:". Each database represents a separate facet, with + // the facet name used as the database name. The database named "$default" + // represents the main object. // vector<string> dbNames; { @@ -473,19 +477,27 @@ run(int argc, char** argv, const Ice::CommunicatorPtr& communicator) db.close(0); } + // + // Dump each database. + // for(vector<string>::iterator p = dbNames.begin(); p != dbNames.end(); ++p) { + string name = *p; + string facet = (name == "$default" ? "" : name); Db db(&dbEnv, 0); - db.open(txn, dbName.c_str(), p->c_str(), DB_BTREE, DB_RDONLY, FREEZE_SCRIPT_DB_MODE); - descriptor->dump(communicator, &db, txn); + db.open(txn, dbName.c_str(), name.c_str(), DB_BTREE, DB_RDONLY, FREEZE_SCRIPT_DB_MODE); + descriptor->dump(communicator, &db, txn, facet); db.close(0); } } else { + // + // Dump a map database. + // Db db(&dbEnv, 0); db.open(txn, dbName.c_str(), 0, DB_BTREE, DB_RDONLY, FREEZE_SCRIPT_DB_MODE); - descriptor->dump(communicator, &db, txn); + descriptor->dump(communicator, &db, txn, ""); db.close(0); } } @@ -501,19 +513,34 @@ run(int argc, char** argv, const Ice::CommunicatorPtr& communicator) } catch(...) { + try + { + if(txn) + { + txn->abort(); + } + dbEnv.close(0); + } + catch(const DbException& ex) + { + cerr << argv[0] << ": database error: " << ex.what() << endl; + } + throw; + } + + try + { if(txn) { txn->abort(); } dbEnv.close(0); - throw; } - - if(txn) + catch(const DbException& ex) { - txn->abort(); + cerr << argv[0] << ": database error: " << ex.what() << endl; + status = EXIT_FAILURE; } - dbEnv.close(0); return status; } diff --git a/cpp/src/FreezeScript/DumpDescriptors.cpp b/cpp/src/FreezeScript/DumpDescriptors.cpp index ffc30911812..bcc46d72f0d 100644 --- a/cpp/src/FreezeScript/DumpDescriptors.cpp +++ b/cpp/src/FreezeScript/DumpDescriptors.cpp @@ -88,6 +88,7 @@ struct ExecuteInfo Ice::CommunicatorPtr communicator; Db* db; DbTxn* txn; + string facet; SymbolTablePtr symbolTable; DumpMap dumpMap; Slice::TypePtr keyType; @@ -1283,6 +1284,8 @@ FreezeScript::RecordDescriptor::execute(const SymbolTablePtr& sym, ExecuteInfo* Destroyer<DataPtr> keyDataDestroyer(keyData); DataPtr valueData = _factory->create(info->valueType, true); Destroyer<DataPtr> valueDataDestroyer(valueData); + DataPtr facetData = _factory->createString(info->facet, true); + Destroyer<DataPtr> facetDataDestroyer(facetData); // // Unmarshal the key and value. @@ -1309,6 +1312,7 @@ FreezeScript::RecordDescriptor::execute(const SymbolTablePtr& sym, ExecuteInfo* SymbolTablePtr st = new SymbolTableI(_factory, _unit, _errorReporter, info, info->symbolTable); st->add("key", keyData); st->add("value", valueData); + st->add("facet", facetData); ExecutableContainerDescriptor::execute(st, info); } } @@ -1466,11 +1470,12 @@ FreezeScript::DumpDBDescriptor::execute(const SymbolTablePtr&, ExecuteInfo*) } void -FreezeScript::DumpDBDescriptor::dump(const Ice::CommunicatorPtr& communicator, Db* db, DbTxn* txn) +FreezeScript::DumpDBDescriptor::dump(const Ice::CommunicatorPtr& communicator, Db* db, DbTxn* txn, const string& facet) { _info->communicator = communicator; _info->db = db; _info->txn = txn; + _info->facet = facet; try { diff --git a/cpp/src/FreezeScript/DumpDescriptors.h b/cpp/src/FreezeScript/DumpDescriptors.h index b900ebae536..701de89e266 100644 --- a/cpp/src/FreezeScript/DumpDescriptors.h +++ b/cpp/src/FreezeScript/DumpDescriptors.h @@ -292,7 +292,7 @@ public: virtual void validate(); virtual void execute(const SymbolTablePtr&, ExecuteInfo*); - void dump(const Ice::CommunicatorPtr&, Db*, DbTxn*); + void dump(const Ice::CommunicatorPtr&, Db*, DbTxn*, const std::string&); private: |