diff options
| -rw-r--r-- | project2/dumpTask.cpp | 2 | ||||
| -rw-r--r-- | project2/fileRows.cpp | 2 | ||||
| -rw-r--r-- | project2/fsRows.cpp | 2 | ||||
| -rw-r--r-- | project2/if.cpp | 2 | ||||
| -rw-r--r-- | project2/iterate.cpp | 2 | ||||
| -rw-r--r-- | project2/procRows.cpp | 2 | ||||
| -rw-r--r-- | project2/rawView.cpp | 2 | ||||
| -rw-r--r-- | project2/rdbmsDataSource.cpp | 6 | ||||
| -rw-r--r-- | project2/regexCheck.cpp | 2 | ||||
| -rw-r--r-- | project2/rowView.cpp | 2 | ||||
| -rw-r--r-- | project2/sendmailTask.cpp | 2 | ||||
| -rw-r--r-- | project2/sessionClearTask.cpp | 2 | ||||
| -rw-r--r-- | project2/sessionSetTask.cpp | 2 | ||||
| -rw-r--r-- | project2/sqlCheck.cpp | 2 | ||||
| -rw-r--r-- | project2/sqlMergeTask.cpp | 4 | ||||
| -rw-r--r-- | project2/sqlRows.cpp | 2 | ||||
| -rw-r--r-- | project2/sqlTask.cpp | 2 | ||||
| -rw-r--r-- | project2/urlRows.cpp | 2 | ||||
| -rw-r--r-- | project2/xmlObjectLoader.cpp | 57 | ||||
| -rw-r--r-- | project2/xmlObjectLoader.h | 33 | ||||
| -rw-r--r-- | project2/xmlRows.cpp | 2 | ||||
| -rw-r--r-- | project2/xslRows.cpp | 2 | 
22 files changed, 77 insertions, 59 deletions
| diff --git a/project2/dumpTask.cpp b/project2/dumpTask.cpp index cdf8c1b..b266821 100644 --- a/project2/dumpTask.cpp +++ b/project2/dumpTask.cpp @@ -5,7 +5,7 @@  #include <boost/date_time/posix_time/posix_time.hpp>  #include <stdio.h> -ElementLoaderImpl<DumpTask> dumptaskLoader("dumptask"); +DECLARE_LOADER("dumptask", DumpTask);  DumpTask::DumpTask(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/fileRows.cpp b/project2/fileRows.cpp index 4a3c58b..315c987 100644 --- a/project2/fileRows.cpp +++ b/project2/fileRows.cpp @@ -4,7 +4,7 @@  #include "exceptions.h"  #include <boost/algorithm/string/predicate.hpp> -ElementLoaderImpl<FileRows> filerowsLoader("filerows"); +DECLARE_LOADER("filerows", FileRows);  FileRows::FileRows(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/fsRows.cpp b/project2/fsRows.cpp index ca901c8..327d9f4 100644 --- a/project2/fsRows.cpp +++ b/project2/fsRows.cpp @@ -16,7 +16,7 @@  typedef boost::filesystem::basic_directory_iterator<FsRows::Path> DirEnt; -ElementLoaderImpl<FsRows> fsrowsLoader("fsrows"); +DECLARE_LOADER("fsrows", FsRows);  const Glib::ustring field_absPath("absPath");  const Glib::ustring field_relPath("relPath"); diff --git a/project2/if.cpp b/project2/if.cpp index 647c0d0..9d367bf 100644 --- a/project2/if.cpp +++ b/project2/if.cpp @@ -2,7 +2,7 @@  #include "logger.h"  #include "xmlObjectLoader.h" -ElementLoaderImpl<If> ifLoader("if"); +DECLARE_LOADER("if", If);  class IfModeIsNonsense : public std::exception { }; diff --git a/project2/iterate.cpp b/project2/iterate.cpp index cdb0cc6..fa0bd77 100644 --- a/project2/iterate.cpp +++ b/project2/iterate.cpp @@ -2,7 +2,7 @@  #include <boost/foreach.hpp>  #include "xmlObjectLoader.h" -ElementLoaderImpl<Iterate> iterateLoader("iterate"); +DECLARE_LOADER("iterate", Iterate);  Iterate::Iterate(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/procRows.cpp b/project2/procRows.cpp index c3ae6aa..11ae35e 100644 --- a/project2/procRows.cpp +++ b/project2/procRows.cpp @@ -2,7 +2,7 @@  #include "xmlObjectLoader.h"  #include <stdexcept> -ElementLoaderImpl<ProcRows> procrowsLoader("procrows"); +DECLARE_LOADER("procrows", ProcRows);  class SubProcessFailedToStart : public std::exception { };  class SubProcessFailed : public std::exception { }; diff --git a/project2/rawView.cpp b/project2/rawView.cpp index 595890b..325460a 100644 --- a/project2/rawView.cpp +++ b/project2/rawView.cpp @@ -5,7 +5,7 @@  #include "environment.h"  #include "appEngine.h" -ElementLoaderImpl<RawView> rawviewLoader("rawview"); +DECLARE_LOADER("rawview", RawView);  RawView::RawView(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/rdbmsDataSource.cpp b/project2/rdbmsDataSource.cpp index 0c37814..ac63042 100644 --- a/project2/rdbmsDataSource.cpp +++ b/project2/rdbmsDataSource.cpp @@ -20,9 +20,6 @@ class UnknownConnectionProvider : public std::exception { };  class RdbmsDataSourceLoader : public ElementLoaderImpl<RdbmsDataSource> {  	public: -		RdbmsDataSourceLoader() : ElementLoaderImpl<RdbmsDataSource>("rdbmsdatasource") -		{ -		}  		void onIdle()  		{  			// Disconnect all cached database connections @@ -44,7 +41,8 @@ class RdbmsDataSourceLoader : public ElementLoaderImpl<RdbmsDataSource> {  		{  			RdbmsDataSource::changedDSNs.clear();  		} -} rdbmsLoader; +}; +DECLARE_CUSTOM_LOADER("rdbmsdatasource", RdbmsDataSourceLoader);  RdbmsDataSource::DBHosts RdbmsDataSource::dbhosts;  RdbmsDataSource::FailedHosts RdbmsDataSource::failedhosts; diff --git a/project2/regexCheck.cpp b/project2/regexCheck.cpp index 08b1e75..5588673 100644 --- a/project2/regexCheck.cpp +++ b/project2/regexCheck.cpp @@ -3,7 +3,7 @@  #include "commonObjects.h"  #include <boost/regex.hpp> -ElementLoaderImpl<RegexCheck> regexCheckLoader("regexcheck"); +DECLARE_LOADER("regexcheck", RegexCheck);  RegexCheck::RegexCheck(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/rowView.cpp b/project2/rowView.cpp index 9d69e9a..f6e7b67 100644 --- a/project2/rowView.cpp +++ b/project2/rowView.cpp @@ -2,7 +2,7 @@  #include "presenter.h"  #include <boost/foreach.hpp> -ElementLoaderImpl<RowView> viewLoader("view"); +DECLARE_LOADER("view", RowView);  RowView::RowView(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/sendmailTask.cpp b/project2/sendmailTask.cpp index 7e2242b..7f1274e 100644 --- a/project2/sendmailTask.cpp +++ b/project2/sendmailTask.cpp @@ -10,7 +10,7 @@  #include <libxml/HTMLtree.h>  #include <sys/wait.h> -ElementLoaderImpl<SendMailTask> sendmailLoader("sendmail"); +DECLARE_LOADER("sendmail", SendMailTask);  class SendEmailFailed : public std::runtime_error {  	public: diff --git a/project2/sessionClearTask.cpp b/project2/sessionClearTask.cpp index 57a4512..15ba270 100644 --- a/project2/sessionClearTask.cpp +++ b/project2/sessionClearTask.cpp @@ -4,7 +4,7 @@  #include "appEngine.h"  #include "session.h" -ElementLoaderImpl<SessionClearTask> sessionclearLoader("sessionclear"); +DECLARE_LOADER("sessionclear", SessionClearTask);  SessionClearTask::SessionClearTask(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/sessionSetTask.cpp b/project2/sessionSetTask.cpp index 401604b..4ae344f 100644 --- a/project2/sessionSetTask.cpp +++ b/project2/sessionSetTask.cpp @@ -4,7 +4,7 @@  #include "appEngine.h"  #include "session.h" -ElementLoaderImpl<SessionSetTask> sessionsetLoader("sessionset"); +DECLARE_LOADER("sessionset", SessionSetTask);  SessionSetTask::SessionSetTask(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/sqlCheck.cpp b/project2/sqlCheck.cpp index afb880a..458aa90 100644 --- a/project2/sqlCheck.cpp +++ b/project2/sqlCheck.cpp @@ -7,7 +7,7 @@  #include "commonObjects.h"  #include "sqlVariableBinder.h" -ElementLoaderImpl<SqlCheck> sqlCheckLoader("sqlcheck"); +DECLARE_LOADER("sqlcheck", SqlCheck);  SqlCheck::SqlCheck(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/sqlMergeTask.cpp b/project2/sqlMergeTask.cpp index 0008f72..b37cbf6 100644 --- a/project2/sqlMergeTask.cpp +++ b/project2/sqlMergeTask.cpp @@ -34,8 +34,8 @@ class SqlMergeInsert : public IHaveParameters, public virtual SourceObject, publ  		ModifyCommand * insert;  }; -ElementLoaderImpl<SqlMergeTask> sqlmergeLoader("sqlmerge"); -ElementLoaderImpl<SqlMergeInsert> sqlmergeinsertLoader("sqlmergeinsert"); +DECLARE_LOADER("sqlmerge", SqlMergeTask); +DECLARE_LOADER("sqlmergeinsert", SqlMergeInsert);  // Conversion logic  SqlMergeTask::SqlMergeTask(const xmlpp::Element * p) : diff --git a/project2/sqlRows.cpp b/project2/sqlRows.cpp index 4758dd4..2a162ab 100644 --- a/project2/sqlRows.cpp +++ b/project2/sqlRows.cpp @@ -12,7 +12,7 @@  #include <boost/date_time/gregorian/gregorian_types.hpp>  #include <boost/date_time/posix_time/posix_time.hpp> -ElementLoaderImpl<SqlRows> sqlviewLoader("sqlrows"); +DECLARE_LOADER("sqlrows", SqlRows);  SqlRows::SqlRows(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/sqlTask.cpp b/project2/sqlTask.cpp index eb28d26..e145a3d 100644 --- a/project2/sqlTask.cpp +++ b/project2/sqlTask.cpp @@ -6,7 +6,7 @@  #include "commonObjects.h"  #include "sqlVariableBinder.h" -ElementLoaderImpl<SqlTask> sqltaskLoader("sqltask"); +DECLARE_LOADER("sqltask", SqlTask);  SqlTask::SqlTask(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/urlRows.cpp b/project2/urlRows.cpp index 6032104..b2c247d 100644 --- a/project2/urlRows.cpp +++ b/project2/urlRows.cpp @@ -6,7 +6,7 @@  #include <stdexcept>  #include <queue> -ElementLoaderImpl<UrlRows> urlrowsLoader("urlrows"); +DECLARE_LOADER("urlrows", UrlRows);  UrlRows::UrlRows(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/xmlObjectLoader.cpp b/project2/xmlObjectLoader.cpp index 4b291da..a40c66c 100644 --- a/project2/xmlObjectLoader.cpp +++ b/project2/xmlObjectLoader.cpp @@ -6,11 +6,17 @@  unsigned int LoaderBase::depth = 0;  std::set<SourceObjectPtr> LoaderBase::loadedObjects; -LoaderBase::ElementLoaderMap & -LoaderBase::getMap() +typedef std::map<std::string, ElementLoader *> ElementLoaderMap; +static ElementLoaderMap * objLoaders; +void init_loaders() __attribute__ ((constructor(101))); +void kill_loaders() __attribute__ ((destructor(101))); +void init_loaders()  { -	static ElementLoaderMap loaders; -	return loaders; +	objLoaders = new ElementLoaderMap(); +} +void kill_loaders() +{ +	delete objLoaders;  }  LoaderBase::LoaderBase(const Glib::ustring & n, bool r) : @@ -34,7 +40,8 @@ LoaderBase::collectAll(const xmlpp::Element * node, bool childrenOnly, Unsupport  	if (!childrenOnly && node->get_namespace_uri() == ns) {  		Glib::ustring name = node->get_name();  		unsigned int stored = 0; -		for(ElementLoaderMap::const_iterator i = getMap().lower_bound(name); i != getMap().upper_bound(name); i++) { +		ElementLoaderMap::const_iterator i = objLoaders->find(name); +		if (i != objLoaders->end()) {  			SourceObjectPtr o = i->second->go(node);  			created += 1;  			loadedObjects.insert(o); @@ -43,18 +50,18 @@ LoaderBase::collectAll(const xmlpp::Element * node, bool childrenOnly, Unsupport  					stored += 1;  				}  			} +			if (stored < 1) { +				if (uh == ErrorOnUnsupported) { +					throw NotSupported(name); +				} +				else if (uh == WarnOnUnsupported) { +					Logger()->messagef(LOG_WARNING, "'%s' unsupported in this location", name.c_str()); +				} +			}  		} -		if (created < 1) { +		else {  			throw NotSupported(name);  		} -		if (stored < created) { -			if (uh == ErrorOnUnsupported) { -				throw NotSupported(name); -			} -			else if (uh == WarnOnUnsupported) { -				Logger()->messagef(LOG_WARNING, "'%s' unsupported in this location", name.c_str()); -			} -		}  	}  	if (created == 0 && (recursive || childrenOnly)) {  		BOOST_FOREACH(const xmlpp::Node * child, node->get_children()) { @@ -78,9 +85,25 @@ LoaderBase::collectAll(const CommonObjects * co, const xmlpp::Element * node, bo  }  void +LoaderBase::newLoader(const std::string & n, ElementLoader * l) +{ +	objLoaders->insert(ElementLoaderMap::value_type(n, l)); +} + +void +LoaderBase::removeLoader(const std::string & n) +{ +	ElementLoaderMap::const_iterator i = objLoaders->find(n); +	if (i != objLoaders->end()) { +		delete i->second; +	} +	objLoaders->erase(n); +} + +void  LoaderBase::onIdle()  { -	BOOST_FOREACH(ElementLoaderMap::value_type l, getMap()) { +	BOOST_FOREACH(ElementLoaderMap::value_type l, *objLoaders) {  		l.second->onIdle();  	}  } @@ -92,7 +115,7 @@ LoaderBase::onIteration()  	depth = 0;  	loadedObjects.clear(); -	BOOST_FOREACH(ElementLoaderMap::value_type l, getMap()) { +	BOOST_FOREACH(ElementLoaderMap::value_type l, *objLoaders) {  		l.second->onIteration();  	}  } @@ -100,7 +123,7 @@ LoaderBase::onIteration()  void  LoaderBase::onPeriodic()  { -	BOOST_FOREACH(ElementLoaderMap::value_type l, getMap()) { +	BOOST_FOREACH(ElementLoaderMap::value_type l, *objLoaders) {  		l.second->onPeriodic();  	}  } diff --git a/project2/xmlObjectLoader.h b/project2/xmlObjectLoader.h index aaab310..2ec44e1 100644 --- a/project2/xmlObjectLoader.h +++ b/project2/xmlObjectLoader.h @@ -86,13 +86,10 @@ enum UnsupportedHandling { ErrorOnUnsupported, WarnOnUnsupported, IgnoreUnsuppor  class LoaderBase {  	public: -		typedef std::map<std::string, ElementLoader *> ElementLoaderMap; -  		LoaderBase(const Glib::ustring & ns, bool recursive);  		virtual ~LoaderBase();  		void collectAll(const CommonObjects * co, const xmlpp::Element * node, bool childrenOnly, UnsupportedHandling uh = ErrorOnUnsupported) const;  		void collectAll(const xmlpp::Element * node, bool childrenOnly, UnsupportedHandling uh = ErrorOnUnsupported) const; -		static ElementLoaderMap & getMap();  		template<class Y>  		static void save(std::map<unsigned int, boost::intrusive_ptr<Y> > * map, boost::intrusive_ptr<Y> obj); @@ -104,6 +101,9 @@ class LoaderBase {  		static void onIteration();  		static void onPeriodic(); +		static void newLoader(const std::string & N, ElementLoader * L); +		static void removeLoader(const std::string & N); +  	private:  		static unsigned int depth;  		static std::set<SourceObjectPtr> loadedObjects; @@ -113,6 +113,17 @@ class LoaderBase {  		const Glib::ustring ns;  }; +#define DECLARE_CUSTOM_LOADER(N, T) \ +	static void init_loader_##T() __attribute__ ((constructor(201))); \ +	static void kill_loader_##T() __attribute__ ((destructor(201))); \ +	static void init_loader_##T() { LoaderBase::newLoader(N, new T()); } \ +	static void kill_loader_##T() { LoaderBase::removeLoader(N); } +#define DECLARE_LOADER(N, T) \ +	static void init_loader_##T() __attribute__ ((constructor(201))); \ +	static void kill_loader_##T() __attribute__ ((destructor(201))); \ +	static void init_loader_##T() { LoaderBase::newLoader(N, new ElementLoaderImpl<T>()); } \ +	static void kill_loader_##T() { LoaderBase::removeLoader(N); } +  class ElementLoader {  	public:  		virtual SourceObjectPtr go(const xmlpp::Element * xml) const = 0; @@ -122,26 +133,12 @@ class ElementLoader {  };  template <class X> -class ElementLoaderImpl : ElementLoader { +class ElementLoaderImpl : public ElementLoader {  	public: -		ElementLoaderImpl(const std::string & x) : -			xmlName(x) -		{ -			LoaderBase::getMap()[xmlName] = this; -		} -		~ElementLoaderImpl() -		{ -			LoaderBase::getMap().erase(xmlName); -		}  		SourceObjectPtr go(const xmlpp::Element * xml) const  		{  			return new X(xml);  		} - -		const Glib::ustring xmlName; - -	private:  }; -  #endif diff --git a/project2/xmlRows.cpp b/project2/xmlRows.cpp index 2f5bb4b..965b8a3 100644 --- a/project2/xmlRows.cpp +++ b/project2/xmlRows.cpp @@ -10,7 +10,7 @@  #include <boost/algorithm/string/join.hpp>  #include <boost/algorithm/string/predicate.hpp> -ElementLoaderImpl<XmlRows> xmlrowLoader("xmlrows"); +DECLARE_LOADER("xmlrows", XmlRows);  XmlRows::XmlRows(const xmlpp::Element * p) :  	SourceObject(p), diff --git a/project2/xslRows.cpp b/project2/xslRows.cpp index 62b0f74..3742e93 100644 --- a/project2/xslRows.cpp +++ b/project2/xslRows.cpp @@ -9,7 +9,7 @@  #include <libxml/xpathInternals.h>  #include "../libmisc/curlsup.h" -ElementLoaderImpl<XslRows> xslrowLoader("xslrows"); +DECLARE_LOADER("xslrows", XslRows);  class XmlParseError : public std::exception { };  class XpathInitError : public std::exception { }; | 
