diff options
author | randomdan <randomdan@localhost> | 2011-02-18 11:01:26 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2011-02-18 11:01:26 +0000 |
commit | 4efd293d8de0834eadc018304986a6e1a3395c79 (patch) | |
tree | 1029ce741c7c048b4dce240ffbbff340b6c0f999 | |
parent | Add a Null variable type and support for it, this is now the default (diff) | |
download | project2-4efd293d8de0834eadc018304986a6e1a3395c79.tar.bz2 project2-4efd293d8de0834eadc018304986a6e1a3395c79.tar.xz project2-4efd293d8de0834eadc018304986a6e1a3395c79.zip |
Don't require the (probably repeated) inclusion of datasource definitions, have CommonObjects load them once on demand
Fix rdbmsDataSource closing transactions it didn't open
Change XML to match the above changes
-rw-r--r-- | project2/cgi/cgiAppEngine.cpp | 1 | ||||
-rw-r--r-- | project2/commonObjects.cpp | 18 | ||||
-rw-r--r-- | project2/commonObjects.h | 6 | ||||
-rw-r--r-- | project2/console/consoleAppEngine.cpp | 1 | ||||
-rw-r--r-- | project2/rdbmsDataSource.cpp | 15 | ||||
-rw-r--r-- | project2/rdbmsDataSource.h | 1 | ||||
-rw-r--r-- | project2/xmlObjectLoader.h | 6 | ||||
-rw-r--r-- | project2/xmlPresenter.cpp | 1 |
8 files changed, 37 insertions, 12 deletions
diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index b273fda..345932a 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -152,7 +152,6 @@ CgiApplicationEngine::RequestStage::RequestStage(const CgiApplicationEngine * e, present = requestRoot->get_attribute_value("present"); LoaderBase loader("http://project2.randomdan.homeip.net", true); - loader.supportedStorers.insert(Storer::into(&datasources)); loader.supportedStorers.insert(Storer::into(¶meterChecks)); loader.supportedStorers.insert(Storer::into(&rowSets)); loader.supportedStorers.insert(Storer::into(&tasks)); diff --git a/project2/commonObjects.cpp b/project2/commonObjects.cpp index 31f81a9..2ca4846 100644 --- a/project2/commonObjects.cpp +++ b/project2/commonObjects.cpp @@ -1,4 +1,6 @@ #include "commonObjects.h" +#include <libxml++/parsers/domparser.h> +#include <libxml/xinclude.h> RowSetPtr CommonObjects::getSource(const std::string & name) const @@ -10,4 +12,20 @@ CommonObjects::getSource(const std::string & name) const throw CommonObjects::DataSourceNotFound(name); } +DataSources::index<bySOName>::type::const_iterator +CommonObjects::loadDataSource(const std::string & name) const +{ + xmlpp::DomParser xml("datasources/" + name + ".xml"); + while (xmlXIncludeProcessFlags(xml.get_document()->cobj(), XML_PARSE_NOXINCNODE) > 0); + + LoaderBase loader("http://project2.randomdan.homeip.net", true); + loader.supportedStorers.insert(Storer::into(&datasources)); + loader.collectAll(xml.get_document()->get_root_node(), false); + + DataSources::index<bySOName>::type::const_iterator i = datasources.get<bySOName>().find(name); + if (i == datasources.get<bySOName>().end()) { + throw DataSourceNotFound(name); + } + return i; +} diff --git a/project2/commonObjects.h b/project2/commonObjects.h index e3c0d37..a15a8da 100644 --- a/project2/commonObjects.h +++ b/project2/commonObjects.h @@ -15,7 +15,7 @@ class CommonObjects : public virtual IntrusivePtrBase { { DataSources::index<bySOName>::type::const_iterator i = datasources.get<bySOName>().find(name); if (i == datasources.get<bySOName>().end()) { - throw DataSourceNotFound(name); + i = loadDataSource(name); } const DataSourceType * s = dynamic_cast<const DataSourceType *>(i->get()); if (!s) { @@ -25,7 +25,9 @@ class CommonObjects : public virtual IntrusivePtrBase { } protected: RowSets rowSets; - DataSources datasources; + mutable DataSources datasources; + private: + DataSources::index<bySOName>::type::const_iterator loadDataSource(const std::string & name) const; }; #endif diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp index be88638..3c99f74 100644 --- a/project2/console/consoleAppEngine.cpp +++ b/project2/console/consoleAppEngine.cpp @@ -62,7 +62,6 @@ ConsoleApplicationEngine::ConsoleApplicationEngine(const ConsoleEnvironment * en while (xmlXIncludeProcessFlags(request.get_document()->cobj(), XML_PARSE_NOXINCNODE) > 0); LoaderBase loader("http://project2.randomdan.homeip.net", true); - loader.supportedStorers.insert(Storer::into(&datasources)); loader.supportedStorers.insert(Storer::into(¶meterChecks)); loader.supportedStorers.insert(Storer::into(&tasks)); loader.supportedStorers.insert(Storer::into(&rowSets)); diff --git a/project2/rdbmsDataSource.cpp b/project2/rdbmsDataSource.cpp index 8a095c7..9ffcc93 100644 --- a/project2/rdbmsDataSource.cpp +++ b/project2/rdbmsDataSource.cpp @@ -64,6 +64,9 @@ RdbmsDataSource::RdbmsDataSource(const xmlpp::Element * p) : RdbmsDataSource::~RdbmsDataSource() { + BOOST_FOREACH(DBHosts::value_type & h, dbhosts) { + h.second->connection->finish(); + } } void @@ -75,8 +78,9 @@ const DB::Connection & RdbmsDataSource::getWritable() const { ConnectionPtr master = connectTo(masterDsn); - if (!master->connection->inTx()) { + if (!master->txOpen) { master->connection->beginTx(); + master->txOpen = true; } changedDSNs.insert(name); return *master->connection; @@ -127,9 +131,9 @@ void RdbmsDataSource::commit() { DBHosts::const_iterator m = dbhosts.find(masterDsn); - if (m != dbhosts.end() && m->second->connection->inTx()) { + if (m != dbhosts.end() && m->second->txOpen) { m->second->connection->commitTx(); - m->second->connection->finish(); + m->second->txOpen = false; } } @@ -137,9 +141,9 @@ void RdbmsDataSource::rollback() { DBHosts::const_iterator m = dbhosts.find(masterDsn); - if (m != dbhosts.end() && m->second->connection->inTx()) { + if (m != dbhosts.end() && m->second->txOpen) { m->second->connection->rollbackTx(); - m->second->connection->finish(); + m->second->txOpen = false; } changedDSNs.erase(name); } @@ -183,6 +187,7 @@ RdbmsDataSource::connectTo(const ConnectionInfo & dsn) RdbmsDataSource::RdbmsConnection::RdbmsConnection(const DB::Connection * con, time_t kat) : connection(con), + txOpen(false), lastUsedTime(0), keepAliveTime(kat) { diff --git a/project2/rdbmsDataSource.h b/project2/rdbmsDataSource.h index 04c4b88..f105eed 100644 --- a/project2/rdbmsDataSource.h +++ b/project2/rdbmsDataSource.h @@ -18,6 +18,7 @@ class RdbmsDataSource : public DataSource { void touch() const; bool isExpired() const; const DB::Connection * const connection; + bool txOpen; private: mutable time_t lastUsedTime; diff --git a/project2/xmlObjectLoader.h b/project2/xmlObjectLoader.h index d1209c7..4568124 100644 --- a/project2/xmlObjectLoader.h +++ b/project2/xmlObjectLoader.h @@ -57,8 +57,10 @@ class StorerImpl : public Storer { bool save(SourceObjectPtr obj) const { boost::intrusive_ptr<X> O = boost::dynamic_pointer_cast<X>(obj); if (O) { - map->insert(O); - return true; + if (map->insert(O).second) { + return true; + } + throw StoreFailed(obj->name); } return false; } diff --git a/project2/xmlPresenter.cpp b/project2/xmlPresenter.cpp index dcee298..68368ec 100644 --- a/project2/xmlPresenter.cpp +++ b/project2/xmlPresenter.cpp @@ -15,7 +15,6 @@ XmlPresenter::XmlPresenter(const std::string & group, const std::string & file) while (xmlXIncludeProcessFlags(present.get_document()->cobj(), XML_PARSE_NOXINCNODE) > 0); LoaderBase loader("http://project2.randomdan.homeip.net", true); - loader.supportedStorers.insert(Storer::into(&datasources)); loader.supportedStorers.insert(Storer::into(&rowSets)); loader.supportedStorers.insert(Storer::into(&views)); loader.supportedStorers.insert(Storer::into(¶meterChecks)); |