From 69fb485a52578dcf132c45859f742205bf430c79 Mon Sep 17 00:00:00 2001 From: randomdan Date: Wed, 30 Mar 2011 12:37:01 +0000 Subject: Pass XML node to XML storer Add storer to split tasks by their onerror value --- project2/cgi/cgiStageRequest.cpp | 2 +- project2/console/consoleAppEngine.cpp | 2 +- project2/if.cpp | 14 +++++--------- project2/if.h | 3 ++- project2/iterate.cpp | 26 ++++++++++++-------------- project2/iterate.h | 3 ++- project2/noOutputExecute.cpp | 22 ++++++++++++++++++---- project2/noOutputExecute.h | 9 ++++++++- project2/requestHost.cpp | 6 ++---- project2/requestHost.h | 3 ++- project2/sqlMergeTask.cpp | 6 +++--- project2/xmlObjectLoader.cpp | 2 +- project2/xmlStorage.h | 4 ++-- 13 files changed, 59 insertions(+), 43 deletions(-) diff --git a/project2/cgi/cgiStageRequest.cpp b/project2/cgi/cgiStageRequest.cpp index 6f877f7..774b67d 100644 --- a/project2/cgi/cgiStageRequest.cpp +++ b/project2/cgi/cgiStageRequest.cpp @@ -16,7 +16,7 @@ CgiApplicationEngine::RequestStage::RequestStage(const CgiEnvironment * e, const LoaderBase loader(ApplicationEngine::getCurrent()->env()->getXmlNamespace(), true); loader.supportedStorers.insert(Storer::into(¶meterChecks)); loader.supportedStorers.insert(Storer::into(&rowSets)); - loader.supportedStorers.insert(Storer::into(&tasks)); + loader.supportedStorers.insert(new NOEErrorStorer(&normTasks, &errorTasks)); loader.collectAll(this, requestRoot, true); } diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp index 769add6..645fde3 100644 --- a/project2/console/consoleAppEngine.cpp +++ b/project2/console/consoleAppEngine.cpp @@ -66,7 +66,7 @@ ConsoleApplicationEngine::ConsoleApplicationEngine(const ConsoleEnvironment * en LoaderBase loader(ApplicationEngine::getCurrent()->env()->getXmlNamespace(), true); loader.supportedStorers.insert(Storer::into(¶meterChecks)); - loader.supportedStorers.insert(Storer::into(&tasks)); + loader.supportedStorers.insert(new NOEErrorStorer(&normTasks, &errorTasks)); loader.supportedStorers.insert(Storer::into(&rowSets)); loader.supportedStorers.insert(Storer::into(&views)); loader.collectAll(this, request.get_document()->get_root_node(), true); diff --git a/project2/if.cpp b/project2/if.cpp index 01368cc..3474815 100644 --- a/project2/if.cpp +++ b/project2/if.cpp @@ -46,7 +46,7 @@ If::If(const xmlpp::Element * e) : localErrorHandling(e->get_attribute_value("errorHandling") == "local") { LoaderBase loader(ApplicationEngine::getCurrent()->env()->getXmlNamespace(), true); - loader.supportedStorers.insert(Storer::into(&subNOEs)); + loader.supportedStorers.insert(new NOEErrorStorer(&normNOEs, &errorNOEs)); loader.supportedStorers.insert(Storer::into(&subViews)); loader.collectAll(e, true, IgnoreUnsupported); } @@ -73,17 +73,13 @@ If::execute() const if (passes()) { Logger()->message(LOG_DEBUG, "IfSet passed"); try { - BOOST_FOREACH(const SubNOEs::value_type & sq, subNOEs.get()) { - if (!sq->isErrorHandler) { - sq->execute(); - } + BOOST_FOREACH(const SubNOEs::value_type & sq, normNOEs.get()) { + sq->execute(); } } catch (...) { - BOOST_FOREACH(const SubNOEs::value_type & sq, subNOEs.get()) { - if (sq->isErrorHandler) { - sq->execute(); - } + BOOST_FOREACH(const SubNOEs::value_type & sq, errorNOEs.get()) { + sq->execute(); } if (!localErrorHandling) { throw; diff --git a/project2/if.h b/project2/if.h index 0a262c2..6482d7c 100644 --- a/project2/if.h +++ b/project2/if.h @@ -33,7 +33,8 @@ class If : public NoOutputExecute, public View, public IfSet { typedef Storage::Objects SubViews; SubViews subViews; typedef Storage::Objects SubNOEs; - SubNOEs subNOEs; + SubNOEs normNOEs; + SubNOEs errorNOEs; const std::string & getName() const; }; diff --git a/project2/iterate.cpp b/project2/iterate.cpp index b06d7e1..569bb3d 100644 --- a/project2/iterate.cpp +++ b/project2/iterate.cpp @@ -12,7 +12,7 @@ Iterate::Iterate(const xmlpp::Element * p) : localErrorHandling(p->get_attribute_value("errorHandling") == "local") { LoaderBase loader(ApplicationEngine::getCurrent()->env()->getXmlNamespace(), true); - loader.supportedStorers.insert(Storer::into(&subNOEs)); + loader.supportedStorers.insert(new NOEErrorStorer(&normNOEs, &errorNOEs)); loader.collectAll(p, true, IgnoreUnsupported); } @@ -56,21 +56,19 @@ Iterate::execute() const void Iterate::executeChildren(bool errs) const { - BOOST_FOREACH(const SubNOEs::value_type & sq, subNOEs.get()) { - if (sq->isErrorHandler == errs) { - if (dynamic_cast(sq.get())) { + BOOST_FOREACH(const SubNOEs::value_type & sq, (errs ? errorNOEs : normNOEs).get()) { + if (dynamic_cast(sq.get())) { + sq->execute(); + } + else { + RowSet::beginRow(NULL); + try { sq->execute(); + RowSet::endRow(NULL); } - else { - RowSet::beginRow(NULL); - try { - sq->execute(); - RowSet::endRow(NULL); - } - catch (...) { - RowSet::endRow(NULL); - throw; - } + catch (...) { + RowSet::endRow(NULL); + throw; } } } diff --git a/project2/iterate.h b/project2/iterate.h index 54ddabf..e4cd3fe 100644 --- a/project2/iterate.h +++ b/project2/iterate.h @@ -20,7 +20,8 @@ class Iterate : public NoOutputExecute, public RowProcessor { void execute() const; typedef Storage::Objects SubNOEs; - SubNOEs subNOEs; + SubNOEs normNOEs; + SubNOEs errorNOEs; const bool localErrorHandling; diff --git a/project2/noOutputExecute.cpp b/project2/noOutputExecute.cpp index 7608329..4416933 100644 --- a/project2/noOutputExecute.cpp +++ b/project2/noOutputExecute.cpp @@ -1,14 +1,28 @@ #include "noOutputExecute.h" NoOutputExecute::NoOutputExecute(const xmlpp::Element * p) : - SourceObject(p), - isErrorHandler(p->get_attribute_value("onerror") == "true") + SourceObject(p) { } NoOutputExecute::NoOutputExecute(const std::string & n) : - SourceObject(n), - isErrorHandler(false) + SourceObject(n) { } +NOEErrorStorer::NOEErrorStorer(Map m, Map em) : + map(m), errorMap(em) +{ +} + +bool +NOEErrorStorer::save(SourceObjectPtr obj, const xmlpp::Element * p) const { + boost::intrusive_ptr O = boost::dynamic_pointer_cast(obj); + if (O) { + if (((p->get_attribute_value("onerror") == "true") ? errorMap : map)->insert(O).second) { + return true; + } + throw StoreFailed(obj->name); + } + return false; +} diff --git a/project2/noOutputExecute.h b/project2/noOutputExecute.h index 0e84fd1..87c17a7 100644 --- a/project2/noOutputExecute.h +++ b/project2/noOutputExecute.h @@ -2,6 +2,7 @@ #define NOOUTPUTEXECUTE_H #include "sourceObject.h" +#include "xmlStorage.h" class NoOutputExecute; typedef boost::intrusive_ptr NoOutputExecutePtr; @@ -14,8 +15,14 @@ class NoOutputExecute : public virtual SourceObject { virtual ~NoOutputExecute() { } virtual void execute() const = 0; +}; - const bool isErrorHandler; +class NOEErrorStorer : public Storer { + public: + typedef Storage::ObjectsPtr Map; + NOEErrorStorer(Map m, Map em); + bool save(SourceObjectPtr obj, const xmlpp::Element *) const; + Map map, errorMap; }; #endif diff --git a/project2/requestHost.cpp b/project2/requestHost.cpp index 09de71f..7cb3d9c 100644 --- a/project2/requestHost.cpp +++ b/project2/requestHost.cpp @@ -38,10 +38,8 @@ RequestHost::run() const void RequestHost::run(bool errs) const { - BOOST_FOREACH(const Tasks::value_type & t, tasks.get()) { - if (t->isErrorHandler == errs) { - t->execute(); - } + BOOST_FOREACH(const Tasks::value_type & t, (errs ? errorTasks : normTasks).get()) { + t->execute(); } } diff --git a/project2/requestHost.h b/project2/requestHost.h index 7610ac1..bf0e9f0 100644 --- a/project2/requestHost.h +++ b/project2/requestHost.h @@ -17,7 +17,8 @@ class RequestHost : virtual CommonObjects { void run() const; - Tasks tasks; + Tasks normTasks; + Tasks errorTasks; bool rollbackBeforeHandle; bool localErrorHandling; diff --git a/project2/sqlMergeTask.cpp b/project2/sqlMergeTask.cpp index ab8546b..84feb18 100644 --- a/project2/sqlMergeTask.cpp +++ b/project2/sqlMergeTask.cpp @@ -288,11 +288,11 @@ attach(IteratePtr i, ModifyCommand * insert) if (!i) { return; } - if (i->subNOEs.empty()) { - i->subNOEs.insert(new Populate(insert)); + if (i->normNOEs.empty()) { + i->normNOEs.insert(new Populate(insert)); } else { - BOOST_FOREACH(const Iterate::SubNOEs::value_type & n, i->subNOEs.get()) { + BOOST_FOREACH(const Iterate::SubNOEs::value_type & n, i->normNOEs.get()) { attach(boost::dynamic_pointer_cast(n), insert); attach(boost::dynamic_pointer_cast(n), insert); } diff --git a/project2/xmlObjectLoader.cpp b/project2/xmlObjectLoader.cpp index 2745d61..30e2865 100644 --- a/project2/xmlObjectLoader.cpp +++ b/project2/xmlObjectLoader.cpp @@ -79,7 +79,7 @@ LoaderBase::collectAll(const xmlpp::Element * node, bool childrenOnly, Unsupport created += 1; loadedObjects.insert(o); BOOST_FOREACH(std::set >::value_type s, supportedStorers) { - if (s->save(o)) { + if (s->save(o, node)) { stored += 1; } } diff --git a/project2/xmlStorage.h b/project2/xmlStorage.h index d35a182..443ad81 100644 --- a/project2/xmlStorage.h +++ b/project2/xmlStorage.h @@ -33,7 +33,7 @@ class Storer : public virtual IntrusivePtrBase { template static StorerPtr into(X * map); - virtual bool save(SourceObjectPtr o) const = 0; + virtual bool save(SourceObjectPtr o, const xmlpp::Element *) const = 0; }; template @@ -43,7 +43,7 @@ class StorerImpl : public Storer { { } - bool save(SourceObjectPtr obj) const { + bool save(SourceObjectPtr obj, const xmlpp::Element *) const { boost::intrusive_ptr O = boost::dynamic_pointer_cast(obj); if (O) { if (map->insert(O).second) { -- cgit v1.2.3