From 6326c46e491573edbbd77c869ae2728202f55066 Mon Sep 17 00:00:00 2001 From: randomdan Date: Sat, 7 Aug 2010 17:52:17 +0000 Subject: Adds an largely untested console appengine --- project2/Doxyfile | 42 +++------------- project2/Jamfile.jam | 15 ++++++ project2/appEngine.cpp | 2 +- project2/appEngine.h | 2 +- project2/cgi/cgiAppEngine.cpp | 2 +- project2/console/consoleAppEngine.cpp | 85 +++++++++++++++++++++++++++++++++ project2/console/consoleAppEngine.h | 42 ++++++++++++++++ project2/console/consoleEnvironment.cpp | 48 +++++++++++++++++++ project2/console/consoleEnvironment.h | 24 ++++++++++ project2/console/p2consoleMain.cpp | 22 +++++++++ 10 files changed, 245 insertions(+), 39 deletions(-) create mode 100644 project2/console/consoleAppEngine.cpp create mode 100644 project2/console/consoleAppEngine.h create mode 100644 project2/console/consoleEnvironment.cpp create mode 100644 project2/console/consoleEnvironment.h create mode 100644 project2/console/p2consoleMain.cpp diff --git a/project2/Doxyfile b/project2/Doxyfile index d59538c..e5f9500 100644 --- a/project2/Doxyfile +++ b/project2/Doxyfile @@ -196,7 +196,7 @@ ALIASES = # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. -OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for @@ -236,7 +236,7 @@ EXTENSION_MAPPING = # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. -BUILTIN_STL_SUPPORT = NO +BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. @@ -256,7 +256,7 @@ SIP_SUPPORT = NO # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. -IDL_PROPERTY_SUPPORT = YES +IDL_PROPERTY_SUPPORT = NO # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first @@ -281,7 +281,7 @@ SUBGROUPING = YES # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. -TYPEDEF_HIDES_STRUCT = NO +TYPEDEF_HIDES_STRUCT = Yes # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. @@ -607,43 +607,13 @@ INPUT_ENCODING = UTF-8 # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.vhd \ - *.vhdl +FILE_PATTERNS = *.cpp *.h # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. -RECURSIVE = NO +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index a57b961..e5633a9 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -11,6 +11,7 @@ lib fcgi : : fcgi ; lib fcgi++ : : fcgi++ ; lib odbc : : odbc ; lib boost_regex : : boost_regex ; +lib boost_filesystem : : boost_filesystem ; lib cgicc : : cgicc ; lib esmtp : : esmtp ; @@ -29,3 +30,17 @@ exe p2web : cgicc fcgi++ fcgi ; + +exe p2console : + libxmlpp + libxslt + [ glob *.cpp ] + [ glob console/*.cpp ] + ../libmisc + ../libodbcpp : + ../libmisc/ + ../libodbcpp/ + boost_regex + boost_filesystem + odbc + esmtp ; diff --git a/project2/appEngine.cpp b/project2/appEngine.cpp index be49c10..3961ffe 100644 --- a/project2/appEngine.cpp +++ b/project2/appEngine.cpp @@ -3,7 +3,7 @@ ApplicationEngine * ApplicationEngine::currentEngine = NULL; -ApplicationEngine::ApplicationEngine(const Environment *) +ApplicationEngine::ApplicationEngine() { if (currentEngine) { throw std::runtime_error("One application at a time, please"); diff --git a/project2/appEngine.h b/project2/appEngine.h index ab8b588..223a928 100644 --- a/project2/appEngine.h +++ b/project2/appEngine.h @@ -13,7 +13,7 @@ class ApplicationEngine { class DataSourceNotFound : public std::exception { }; class DataSourceNotCompatible : public std::exception { }; - ApplicationEngine(const Environment *); + ApplicationEngine(); virtual ~ApplicationEngine() = 0; virtual void process() const = 0; diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index 5348246..98cb397 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -19,7 +19,7 @@ typedef std::string SValue; SessionContainer * sessionsContainer = new SessionContainerShm(); CgiApplicationEngine::CgiApplicationEngine(const CgiEnvironment * e) : - ApplicationEngine(e), + ApplicationEngine(), _env(e), header(NULL), sessionID(boost::uuids::nil_generator()()) diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp new file mode 100644 index 0000000..5955538 --- /dev/null +++ b/project2/console/consoleAppEngine.cpp @@ -0,0 +1,85 @@ +#include "consoleAppEngine.h" +#include "consoleEnvironment.h" +#include "../iterate.h" +#include +#include + +ConsoleApplicationEngine::ConsoleApplicationEngine(const ConsoleEnvironment * env, const boost::filesystem::path & f) : + ApplicationEngine() +{ + xmlpp::DomParser request(f.string()); + while (xmlXIncludeProcessFlags(request.get_document()->cobj(), XML_PARSE_NOXINCNODE) > 0); + xmlpp::Element * requestRoot = request.get_document()->get_root_node(); + + Loaders loaders; + _DataSource::AddLoaders(loaders, this->datasources); + _ParamChecker::AddLoaders(loaders, parameterChecks); + _Task::AddLoaders(loaders, tasks); + _Iterate::AddLoaders(loaders, tasks); + _LoaderBase::collectAll(loaders, "project2", requestRoot, true, true); +} + +ConsoleApplicationEngine::~ConsoleApplicationEngine() +{ +} + +void +ConsoleApplicationEngine::process() const +{ + BOOST_FOREACH(OrderedParamCheckers::value_type pc, parameterChecks) { + if (!pc.second->performCheck(this)) { + throw std::runtime_error("Check failed"); + } + } + try { + BOOST_FOREACH(NoOutputExecutes::value_type t, tasks) { + t.second->execute(); + } + // Commit data source transactions (without invoking a connection) + BOOST_FOREACH(DataSources::value_type ds, this->datasources) { + ds.second->commit(); + } + } + catch (...) { + // Do something about the error + BOOST_FOREACH(DataSources::value_type ds, this->datasources) { + ds.second->rollback(); + } + throw; + } +} + +const Environment * +ConsoleApplicationEngine::env() const +{ + return _env; +} + +SessionPtr +ConsoleApplicationEngine::session() const +{ + return SessionPtr(); +} + +PresenterPtr +ConsoleApplicationEngine::getPresenter(const std::string & group, const std::string & id) const +{ + return PresenterPtr(new ConsolePresenter(this, group, id)); +} + +ConsoleApplicationEngine::ConsolePresenter::ConsolePresenter(const ConsoleApplicationEngine *, + const std::string & group, const std::string & id) : + Presenter(group, id) +{ +} + +ConsoleApplicationEngine::ConsolePresenter::~ConsolePresenter() +{ +} + +Presenter::XmlDocumentPtr +ConsoleApplicationEngine::ConsolePresenter::getDataDocument() const +{ + return Presenter::getDataDocument(); +} + diff --git a/project2/console/consoleAppEngine.h b/project2/console/consoleAppEngine.h new file mode 100644 index 0000000..7ff1059 --- /dev/null +++ b/project2/console/consoleAppEngine.h @@ -0,0 +1,42 @@ +#ifndef CGIAPPENGINE_H +#define CGIAPPENGINE_H + +#include "../appEngine.h" +#include "../task.h" +#include "../paramChecker.h" +#include "../presenter.h" +#include +#include +#include +#include +#include + +class ConsoleEnvironment; +class Session; + +class ConsoleApplicationEngine : public ApplicationEngine { + public: + ConsoleApplicationEngine(const ConsoleEnvironment *, const boost::filesystem::path &); + virtual ~ConsoleApplicationEngine(); + + void process() const; + const Environment * env() const; + SessionPtr session() const; + PresenterPtr getPresenter(const std::string & group, const std::string & id) const; + protected: + const ConsoleEnvironment * _env; + private: + class ConsolePresenter : public Presenter { + public: + ConsolePresenter(const ConsoleApplicationEngine *, const std::string & id); + ConsolePresenter(const ConsoleApplicationEngine *, const std::string & group, const std::string & id); + virtual ~ConsolePresenter(); + protected: + XmlDocumentPtr getDataDocument() const; + }; + OrderedParamCheckers parameterChecks; + NoOutputExecutes tasks; +}; + +#endif + diff --git a/project2/console/consoleEnvironment.cpp b/project2/console/consoleEnvironment.cpp new file mode 100644 index 0000000..314f465 --- /dev/null +++ b/project2/console/consoleEnvironment.cpp @@ -0,0 +1,48 @@ +#include "consoleEnvironment.h" +#include +#include +#include +#include + +ConsoleEnvironment::ConsoleEnvironment(int argc, char ** argv) : + scriptname(argv[0]), + todolist(argv + 1, argv + argc) +{ +} + +ConsoleEnvironment::~ConsoleEnvironment() +{ +} + +Glib::ustring +ConsoleEnvironment::getParamUri(unsigned int idx) const +{ + throw std::runtime_error("Not implemented"); +} + +Glib::ustring +ConsoleEnvironment::getParamQuery(const std::string & idx) const +{ + throw std::runtime_error("Not implemented"); +} + +std::string +ConsoleEnvironment::getServerName() const +{ + struct utsname name; + if (uname(&name)) { + syslog(LOG_WARNING, "%s: Unable to determine local host name (%d:%s)", + __FUNCTION__, errno, strerror(errno)); + return "unknown"; + } + else { + return name.nodename; + } +} + +std::string +ConsoleEnvironment::getScriptName() const +{ + return scriptname; +} + diff --git a/project2/console/consoleEnvironment.h b/project2/console/consoleEnvironment.h new file mode 100644 index 0000000..faa6431 --- /dev/null +++ b/project2/console/consoleEnvironment.h @@ -0,0 +1,24 @@ +#ifndef ENVPROC_H +#define ENVPROC_H + +#include +#include +#include +#include "../environment.h" + +class ConsoleEnvironment : public Environment { + public: + ConsoleEnvironment(int argc, char ** argv); + virtual ~ConsoleEnvironment(); + + Glib::ustring getParamUri(unsigned int idx) const; + Glib::ustring getParamQuery(const std::string & idx) const; + std::string getServerName() const; + std::string getScriptName() const; + + const std::string scriptname; + typedef std::list ToDoList; + ToDoList todolist; +}; + +#endif diff --git a/project2/console/p2consoleMain.cpp b/project2/console/p2consoleMain.cpp new file mode 100644 index 0000000..a8d1ffc --- /dev/null +++ b/project2/console/p2consoleMain.cpp @@ -0,0 +1,22 @@ +#include +#include "consoleEnvironment.h" +#include "consoleAppEngine.h" +#include + +int main(int argc, char ** argv) +{ + ConsoleEnvironment env(argc, argv); + BOOST_FOREACH(const boost::filesystem::path & file, env.todolist) { + try { + ConsoleApplicationEngine app(&env, file); + app.process(); + } + catch (const std::exception & e) { + std::cerr << "Kaboom!" << std::endl << std::endl << e.what() << std::endl; + } + catch (...) { + std::cerr << "Kaboom!" << std::endl << std::endl << "Unknown exception." << std::endl; + } + } +} + -- cgit v1.2.3