summaryrefslogtreecommitdiff
path: root/cpp/src/FreezeScript/Transformer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/FreezeScript/Transformer.cpp')
-rw-r--r--cpp/src/FreezeScript/Transformer.cpp134
1 files changed, 91 insertions, 43 deletions
diff --git a/cpp/src/FreezeScript/Transformer.cpp b/cpp/src/FreezeScript/Transformer.cpp
index 761a6dbb873..0a33982aa92 100644
--- a/cpp/src/FreezeScript/Transformer.cpp
+++ b/cpp/src/FreezeScript/Transformer.cpp
@@ -418,9 +418,17 @@ public:
DatabaseDescriptor(const DescriptorPtr&, int, const TransformInfoIPtr&, const IceXML::Attributes&);
virtual void addChild(const DescriptorPtr&);
+ virtual void execute(const SymbolTablePtr&);
+
+ string name() const;
private:
+ string _name;
+ string _oldKeyName;
+ string _oldValueName;
+ string _newKeyName;
+ string _newValueName;
RecordDescriptorPtr _record;
};
typedef IceUtil::Handle<DatabaseDescriptor> DatabaseDescriptorPtr;
@@ -441,7 +449,7 @@ public:
private:
- DatabaseDescriptorPtr _database;
+ map<string, DatabaseDescriptorPtr> _databases;
vector<DescriptorPtr> _children;
};
typedef IceUtil::Handle<TransformDBDescriptor> TransformDBDescriptorPtr;
@@ -2038,7 +2046,15 @@ FreezeScript::DatabaseDescriptor::DatabaseDescriptor(const DescriptorPtr& parent
{
DescriptorErrorContext ctx(_info->errorReporter, "database", _line);
- IceXML::Attributes::const_iterator p = attributes.find("key");
+ IceXML::Attributes::const_iterator p;
+
+ p = attributes.find("name");
+ if(p != attributes.end())
+ {
+ _name = p->second;
+ }
+
+ p = attributes.find("key");
if(p == attributes.end())
{
_info->errorReporter->error("required attribute `key' is missing");
@@ -2052,8 +2068,6 @@ FreezeScript::DatabaseDescriptor::DatabaseDescriptor(const DescriptorPtr& parent
}
string valueTypes = p->second;
- string oldKeyName, newKeyName;
- string oldValueName, newValueName;
string::size_type pos;
pos = keyTypes.find(',');
@@ -2063,13 +2077,13 @@ FreezeScript::DatabaseDescriptor::DatabaseDescriptor(const DescriptorPtr& parent
}
if(pos == string::npos)
{
- oldKeyName = keyTypes;
- newKeyName = keyTypes;
+ _oldKeyName = keyTypes;
+ _newKeyName = keyTypes;
}
else
{
- oldKeyName = keyTypes.substr(0, pos);
- newKeyName = keyTypes.substr(pos + 1);
+ _oldKeyName = keyTypes.substr(0, pos);
+ _newKeyName = keyTypes.substr(pos + 1);
}
pos = valueTypes.find(',');
@@ -2079,22 +2093,46 @@ FreezeScript::DatabaseDescriptor::DatabaseDescriptor(const DescriptorPtr& parent
}
if(pos == string::npos)
{
- oldValueName = valueTypes;
- newValueName = valueTypes;
+ _oldValueName = valueTypes;
+ _newValueName = valueTypes;
}
else
{
- oldValueName = valueTypes.substr(0, pos);
- newValueName = valueTypes.substr(pos + 1);
+ _oldValueName = valueTypes.substr(0, pos);
+ _newValueName = valueTypes.substr(pos + 1);
}
+}
+
+void
+FreezeScript::DatabaseDescriptor::addChild(const DescriptorPtr& child)
+{
+ DescriptorErrorContext ctx(_info->errorReporter, "database", _line);
+
+ RecordDescriptorPtr rec = RecordDescriptorPtr::dynamicCast(child);
+ if(rec)
+ {
+ if(_record)
+ {
+ _info->errorReporter->error("only one <record> element can be specified");
+ }
+ _record = rec;
+ }
+
+ ExecutableContainerDescriptor::addChild(child);
+}
+
+void
+FreezeScript::DatabaseDescriptor::execute(const SymbolTablePtr& st)
+{
+ DescriptorErrorContext ctx(_info->errorReporter, "database", _line);
//
// Look up the Slice definitions for the key and value types.
//
- _info->oldKeyType = findType(_info->oldUnit, oldKeyName);
- _info->newKeyType = findType(_info->newUnit, newKeyName);
- _info->oldValueType = findType(_info->oldUnit, oldValueName);
- _info->newValueType = findType(_info->newUnit, newValueName);
+ _info->oldKeyType = findType(_info->oldUnit, _oldKeyName);
+ _info->newKeyType = findType(_info->newUnit, _newKeyName);
+ _info->oldValueType = findType(_info->oldUnit, _oldValueName);
+ _info->newValueType = findType(_info->newUnit, _newValueName);
if(_info->connection != 0)
{
@@ -2110,24 +2148,14 @@ FreezeScript::DatabaseDescriptor::DatabaseDescriptor(const DescriptorPtr& parent
// TODO: it looks like _info is not destroyed before the new dbEnv is closed.
//
_info->connection = 0;
+
+ ExecutableContainerDescriptor::execute(st);
}
-void
-FreezeScript::DatabaseDescriptor::addChild(const DescriptorPtr& child)
+string
+FreezeScript::DatabaseDescriptor::name() const
{
- DescriptorErrorContext ctx(_info->errorReporter, "database", _line);
-
- RecordDescriptorPtr rec = RecordDescriptorPtr::dynamicCast(child);
- if(rec)
- {
- if(_record)
- {
- _info->errorReporter->error("only one <record> element can be specified");
- }
- _record = rec;
- }
-
- ExecutableContainerDescriptor::addChild(child);
+ return _name;
}
//
@@ -2154,15 +2182,24 @@ FreezeScript::TransformDBDescriptor::addChild(const DescriptorPtr& child)
if(db)
{
- if(_database)
- {
- _info->errorReporter->error("only one <database> element can be specified");
- }
- else
- {
- _database = db;
- _children.push_back(db);
- }
+ string name = db->name();
+ map<string, DatabaseDescriptorPtr>::iterator p = _databases.find(name);
+ if(p != _databases.end())
+ {
+ if(name.empty())
+ {
+ _info->errorReporter->error("duplicate <database> element");
+ }
+ else
+ {
+ _info->errorReporter->error(string("duplicate <database> element for ") + name);
+ }
+ }
+ else
+ {
+ _databases[name] = db;
+ _children.push_back(db);
+ }
}
else if(transform)
{
@@ -2204,9 +2241,9 @@ FreezeScript::TransformDBDescriptor::validate()
{
DescriptorErrorContext ctx(_info->errorReporter, "transformdb", _line);
- if(!_database)
+ if(_databases.empty())
{
- _info->errorReporter->error("no <database> element specified");
+ _info->errorReporter->error("no <database> element defined");
}
for(vector<DescriptorPtr>::iterator p = _children.begin(); p != _children.end(); ++p)
@@ -2218,7 +2255,18 @@ FreezeScript::TransformDBDescriptor::validate()
void
FreezeScript::TransformDBDescriptor::execute(const SymbolTablePtr& sym)
{
- _database->execute(sym);
+ map<string, DatabaseDescriptorPtr>::iterator p = _databases.find(_info->newDbName);
+ if(p == _databases.end())
+ {
+ p = _databases.find("");
+ }
+
+ if(p == _databases.end())
+ {
+ _info->errorReporter->error("no <database> element found for `" + _info->newDbName + "'");
+ }
+
+ p->second->execute(sym);
}
//