summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2004-04-23 19:27:48 +0000
committerMark Spruiell <mes@zeroc.com>2004-04-23 19:27:48 +0000
commit537d42cd60f96f3bc81f2e3edde22ca2241b1470 (patch)
treec58533488ea04fda84e70525f87bbef83a212d1b /cpp/src
parentmore error checking (diff)
downloadice-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.cpp45
-rw-r--r--cpp/src/FreezeScript/DumpDescriptors.cpp7
-rw-r--r--cpp/src/FreezeScript/DumpDescriptors.h2
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: