diff options
author | randomdan <randomdan@localhost> | 2010-12-18 02:04:56 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2010-12-18 02:04:56 +0000 |
commit | d043e9e80db2140bdea05b54bdd35ad7cddb13a0 (patch) | |
tree | 230e4e2665f9cc72d48860338038dc9ac7a281fa | |
parent | Remove the stupid _ naming convention (diff) | |
download | project2-d043e9e80db2140bdea05b54bdd35ad7cddb13a0.tar.bz2 project2-d043e9e80db2140bdea05b54bdd35ad7cddb13a0.tar.xz project2-d043e9e80db2140bdea05b54bdd35ad7cddb13a0.zip |
Do some renaming and reorganising at last
34 files changed, 393 insertions, 408 deletions
diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index 7040562..011c5dd 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -18,9 +18,10 @@ lib curl : : <name>curl ; lib p2common : appEngine.cpp dataSource.cpp environment.cpp fileStarGlibIoChannel.cpp iHaveParameters.cpp - iterate.cpp paramChecker.cpp perRowValues.cpp presenter.cpp rawView.cpp dumpTask.cpp + iterate.cpp paramChecker.cpp presenter.cpp rawView.cpp dumpTask.cpp sourceObject.cpp task.cpp variables.cpp view.cpp xmlObjectLoader.cpp exceptions.cpp - sessionClearTask.cpp session.cpp sessionSetTask.cpp commonObjects.cpp + sessionClearTask.cpp session.cpp sessionSetTask.cpp commonObjects.cpp xmlPresenter.cpp + rowView.cpp rowSet.cpp rowUser.cpp rowProcessor.cpp : <library>../libmisc//misc <library>libxmlpp diff --git a/project2/cgi/cgiAppEngine.h b/project2/cgi/cgiAppEngine.h index db4d696..7998648 100644 --- a/project2/cgi/cgiAppEngine.h +++ b/project2/cgi/cgiAppEngine.h @@ -4,7 +4,7 @@ #include "../appEngine.h" #include "../task.h" #include "../paramChecker.h" -#include "../presenter.h" +#include "../xmlPresenter.h" #include "../commonObjects.h" #include <boost/intrusive_ptr.hpp> #include <boost/uuid/uuid.hpp> diff --git a/project2/commonObjects.cpp b/project2/commonObjects.cpp index f39eb60..90c8bdc 100644 --- a/project2/commonObjects.cpp +++ b/project2/commonObjects.cpp @@ -1,6 +1,6 @@ #include "commonObjects.h" -PerRowValuesPtr +RowSetPtr CommonObjects::getSource(const std::string & name) const { RowSets::const_iterator i = rowSets.find(name); diff --git a/project2/commonObjects.h b/project2/commonObjects.h index 32e201c..dc522ba 100644 --- a/project2/commonObjects.h +++ b/project2/commonObjects.h @@ -2,14 +2,14 @@ #define COMMONOBJECTS_H #include "dataSource.h" -#include "perRowValues.h" +#include "rowSet.h" class CommonObjects : public virtual IntrusivePtrBase { public: class DataSourceNotFound : public std::exception { }; class DataSourceNotCompatible : public std::exception { }; - PerRowValuesPtr getSource(const std::string &) const; + RowSetPtr getSource(const std::string &) const; template <class DataSourceType> const DataSourceType * dataSource(const std::string & name) const { diff --git a/project2/dumpTask.cpp b/project2/dumpTask.cpp index cc13f0b..0d485f8 100644 --- a/project2/dumpTask.cpp +++ b/project2/dumpTask.cpp @@ -1,5 +1,5 @@ #include "dumpTask.h" -#include "perRowValues.h" +#include "rowSet.h" #include "xmlObjectLoader.h" #include <boost/foreach.hpp> #include <stdio.h> @@ -24,7 +24,7 @@ DumpTask::loadComplete(const CommonObjects *) void DumpTask::execute() const { - const PerRowValues::RowValuesStack::value_type & r = PerRowValues::Stack().back(); + const RowSet::RowValuesStack::value_type & r = RowSet::Stack().back(); unsigned int cols = r->columnCount(); for (unsigned int c = 0; c < cols; c += 1) { if (c > 0) { @@ -33,7 +33,7 @@ DumpTask::execute() const try { fprintf(stderr, "%s = '%s'", r->getColumnName(c).c_str(), r->getCurrentValue(c).c_str()); } - catch (const PerRowValues::FieldDoesNotExist &) { + catch (const RowSet::FieldDoesNotExist &) { fprintf(stderr, "%s = null", r->getColumnName(c).c_str()); } } diff --git a/project2/fileRows.cpp b/project2/fileRows.cpp index f9bdebf..c42d6cf 100644 --- a/project2/fileRows.cpp +++ b/project2/fileRows.cpp @@ -1,4 +1,5 @@ #include "fileRows.h" +#include "rowProcessor.h" #include "xmlObjectLoader.h" #include "exceptions.h" @@ -6,7 +7,7 @@ ElementLoaderImpl<FileRows> filerowsLoader("filerows"); FileRows::FileRows(const xmlpp::Element * p) : SourceObject(p), - PerRowValues(p), + RowSet(p), path(p->get_attribute_value("path")), fieldSep(p->get_attribute_value("fieldSep")[0]), quoteChar(p->get_attribute_value("quoteChar")[0]), @@ -139,7 +140,7 @@ FileRows::getCurrentValue(const Glib::ustring & id) const return **v; } } - throw PerRowValues::FieldDoesNotExist(); + throw RowSet::FieldDoesNotExist(); } void diff --git a/project2/fileRows.h b/project2/fileRows.h index ec937ad..6f06d59 100644 --- a/project2/fileRows.h +++ b/project2/fileRows.h @@ -6,12 +6,12 @@ #include <boost/shared_ptr.hpp> #include <map> #include "variables.h" -#include "perRowValues.h" +#include "rowSet.h" #include "fileStarGlibIoChannel.h" class CommonObjects; -class FileRows : public PerRowValues { +class FileRows : public RowSet { public: FileRows(const xmlpp::Element * p); ~FileRows(); diff --git a/project2/iterate.cpp b/project2/iterate.cpp index 91d5c75..9e5c7f7 100644 --- a/project2/iterate.cpp +++ b/project2/iterate.cpp @@ -35,13 +35,13 @@ Iterate::rowReady() const void Iterate::execute() const { - PerRowValues::beginRow(source.get()); + RowSet::beginRow(source.get()); try { source->execute(this); - PerRowValues::endRow(source.get()); + RowSet::endRow(source.get()); } catch (...) { - PerRowValues::endRow(source.get()); + RowSet::endRow(source.get()); throw; } } @@ -54,13 +54,13 @@ Iterate::executeChildren() const sq.second->execute(); } else { - PerRowValues::beginRow(NULL); + RowSet::beginRow(NULL); try { sq.second->execute(); - PerRowValues::endRow(NULL); + RowSet::endRow(NULL); } catch (...) { - PerRowValues::endRow(NULL); + RowSet::endRow(NULL); throw; } } diff --git a/project2/iterate.h b/project2/iterate.h index a95aeaf..58b4944 100644 --- a/project2/iterate.h +++ b/project2/iterate.h @@ -6,7 +6,7 @@ #include <map> #include "sourceObject.h" #include "xmlObjectLoader.h" -#include "perRowValues.h" +#include "rowProcessor.h" #include "noOutputExecute.h" class Iterate; diff --git a/project2/perRowValues.cpp b/project2/perRowValues.cpp deleted file mode 100644 index d4aa945..0000000 --- a/project2/perRowValues.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "perRowValues.h" -#include "commonObjects.h" -#include <cstdlib> -#include <boost/foreach.hpp> -#include <syslog.h> - -PerRowValues::RowValuesStack PerRowValues::stack; - -PerRowValues::PerRowValues(const xmlpp::Element * p) : - SourceObject(p), - rowNum(-1) -{ -} - -PerRowValues::~PerRowValues() -{ -} - -void -PerRowValues::use(const RowUser * r) const -{ - rowUsers.insert(r); -} - -void -PerRowValues::finish(const RowUser * r) const -{ - rowUsers.erase(r); -} - -void -PerRowValues::beginRow(const PerRowValues * r) -{ - stack.push_back(r); -} - -void -PerRowValues::endRow(const PerRowValues * r) -{ - if (stack.back() != r) { - syslog(LOG_ERR, "PerRowValues::endRow: stack is corrupted"); - std::abort(); - } - stack.pop_back(); -} - -void -PerRowValues::rowChanged() const -{ - BOOST_FOREACH(const RowUser * ru, rowUsers) { - ru->rowChanged(); - } -} - -unsigned int -PerRowValues::getRowNum() const -{ - return rowNum; -} - -RowUser::RowUser() -{ -} - -RowUser::~RowUser() -{ -} - -RowProcessor::RowProcessor(const xmlpp::Element * p) : - SourceObject(p), - IHaveParameters(p), - recordSource(p->get_attribute_value("source")), - filter(p->get_attribute_value("filter")) -{ -} - -void -RowProcessor::loadComplete(const CommonObjects * co) -{ - source = co->getSource(recordSource); - if (!filter.empty()) { - source->setFilter(filter); - } -} - diff --git a/project2/presenter.cpp b/project2/presenter.cpp index d7ddf5a..69300ec 100644 --- a/project2/presenter.cpp +++ b/project2/presenter.cpp @@ -65,56 +65,3 @@ Presenter::addField(const Glib::ustring & name, const Glib::ustring & ns, const popSub(); } -XmlPresenter::~XmlPresenter() -{ -} - -XmlPresenter::XmlPresenter(const std::string & group, const std::string & file) : - Presenter(group, file), - responseRootNodeName(present.get_document()->get_root_node()->get_attribute_value("root")), - responseStyle(present.get_document()->get_root_node()->get_attribute_value("style")), - contentType(present.get_document()->get_root_node()->get_attribute_value("contenttype")), - responseDoc(XmlDocumentPtr(new xmlpp::Document("1.0"))) -{ - nodeStack.push_back(responseDoc->create_root_node(responseRootNodeName)); - xmlNewNs(nodeStack.back()->cobj(), BAD_CAST "http://project2.randomdan.homeip.net", BAD_CAST "project2"); - // XSLT Style - char * buf; - if (responseStyle.length() && asprintf(&buf, "type=\"text/xsl\" href=\"%s\"", - responseStyle.c_str()) > 0) { - xmlAddPrevSibling(nodeStack.back()->cobj(), - xmlNewDocPI(responseDoc->cobj(), BAD_CAST "xml-stylesheet", BAD_CAST buf)); - free(buf); - } -} - -XmlPresenter::XmlDocumentPtr -XmlPresenter::getDataDocument() const -{ - return responseDoc; -} - -void -XmlPresenter::pushSub(const Glib::ustring & name, const Glib::ustring & ns) const -{ - nodeStack.push_back(nodeStack.back()->add_child(name, ns)); -} - -void -XmlPresenter::addAttr(const Glib::ustring & name, const Glib::ustring & ns, const Glib::ustring & value) const -{ - nodeStack.back()->set_attribute(name, value, ns); -} - -void -XmlPresenter::setText(const Glib::ustring & value) const -{ - nodeStack.back()->set_child_text(value); -} - -void -XmlPresenter::popSub() const -{ - nodeStack.pop_back(); -} - diff --git a/project2/presenter.h b/project2/presenter.h index 7968b88..b0f3262 100644 --- a/project2/presenter.h +++ b/project2/presenter.h @@ -33,29 +33,5 @@ class Presenter : public CommonObjects, public virtual IntrusivePtrBase { typedef boost::intrusive_ptr<const Presenter> PresenterCPtr; typedef boost::intrusive_ptr<Presenter> PresenterPtr; -class XmlPresenter : public Presenter { - public: - typedef boost::shared_ptr<xmlpp::Document> XmlDocumentPtr; - XmlPresenter(const std::string & group, const std::string & file); - ~XmlPresenter(); - - void pushSub(const Glib::ustring & name, const Glib::ustring & ns) const; - void addAttr(const Glib::ustring & name, const Glib::ustring & ns, const Glib::ustring & value) const; - void setText(const Glib::ustring & value) const; - void popSub() const; - - virtual XmlDocumentPtr getDataDocument() const; - - const Glib::ustring responseRootNodeName; - const Glib::ustring responseStyle; - const Glib::ustring contentType; - - private: - XmlDocumentPtr responseDoc; - mutable std::vector<xmlpp::Element *> nodeStack; -}; - -typedef boost::intrusive_ptr<XmlPresenter> XmlPresenterPtr; - #endif diff --git a/project2/rowProcessor.cpp b/project2/rowProcessor.cpp new file mode 100644 index 0000000..26275a9 --- /dev/null +++ b/project2/rowProcessor.cpp @@ -0,0 +1,23 @@ +#include "rowProcessor.h" +#include "commonObjects.h" +#include <cstdlib> +#include <boost/foreach.hpp> +#include <syslog.h> + +RowProcessor::RowProcessor(const xmlpp::Element * p) : + SourceObject(p), + IHaveParameters(p), + recordSource(p->get_attribute_value("source")), + filter(p->get_attribute_value("filter")) +{ +} + +void +RowProcessor::loadComplete(const CommonObjects * co) +{ + source = co->getSource(recordSource); + if (!filter.empty()) { + source->setFilter(filter); + } +} + diff --git a/project2/rowProcessor.h b/project2/rowProcessor.h new file mode 100644 index 0000000..f47d04e --- /dev/null +++ b/project2/rowProcessor.h @@ -0,0 +1,23 @@ +#ifndef ROWPROCESSOR_H +#define ROWPROCESSOR_H + +#include <glibmm/ustring.h> +#include "sourceObject.h" +#include "iHaveParameters.h" +#include "rowSet.h" + +class RowProcessor : public IHaveParameters, public virtual SourceObject { + public: + RowProcessor(const xmlpp::Element *); + virtual void rowReady() const = 0; + void loadComplete(const CommonObjects *); + + const std::string recordSource; + const Glib::ustring filter; + + protected: + RowSetPtr source; +}; + +#endif + diff --git a/project2/rowSet.cpp b/project2/rowSet.cpp new file mode 100644 index 0000000..0869b58 --- /dev/null +++ b/project2/rowSet.cpp @@ -0,0 +1,60 @@ +#include "rowSet.h" +#include "rowUser.h" +#include "commonObjects.h" +#include <boost/foreach.hpp> +#include <syslog.h> + +RowSet::RowValuesStack RowSet::stack; + +RowSet::RowSet(const xmlpp::Element * p) : + SourceObject(p), + rowNum(-1) +{ +} + +RowSet::~RowSet() +{ +} + +void +RowSet::use(const RowUser * r) const +{ + rowUsers.insert(r); +} + +void +RowSet::finish(const RowUser * r) const +{ + rowUsers.erase(r); +} + +void +RowSet::beginRow(const RowSet * r) +{ + stack.push_back(r); +} + +void +RowSet::endRow(const RowSet * r) +{ + if (stack.back() != r) { + syslog(LOG_ERR, "RowSet::endRow: stack is corrupted"); + std::abort(); + } + stack.pop_back(); +} + +void +RowSet::rowChanged() const +{ + BOOST_FOREACH(const RowUser * ru, rowUsers) { + ru->rowChanged(); + } +} + +unsigned int +RowSet::getRowNum() const +{ + return rowNum; +} + diff --git a/project2/perRowValues.h b/project2/rowSet.h index 5b8db9b..612a0b4 100644 --- a/project2/perRowValues.h +++ b/project2/rowSet.h @@ -1,5 +1,5 @@ -#ifndef PERROWVALUES_H -#define PERROWVALUES_H +#ifndef ROWSET_H +#define ROWSET_H #include <glibmm/ustring.h> #include <vector> @@ -9,38 +9,18 @@ #include "sourceObject.h" #include "iHaveParameters.h" -class RowUser { - public: - RowUser(); - virtual ~RowUser() = 0; - - virtual void rowChanged() const = 0; -}; - -class PerRowValues; -typedef boost::intrusive_ptr<PerRowValues> PerRowValuesPtr; -typedef std::map<std::string, PerRowValuesPtr> RowSets; - -class RowProcessor : public IHaveParameters, public virtual SourceObject { - public: - RowProcessor(const xmlpp::Element *); - virtual void rowReady() const = 0; - void loadComplete(const CommonObjects *); - - const std::string recordSource; - const Glib::ustring filter; - - protected: - PerRowValuesPtr source; -}; +class RowProcessor; +class RowSet; +typedef boost::intrusive_ptr<RowSet> RowSetPtr; +typedef std::map<std::string, RowSetPtr> RowSets; -class PerRowValues : public virtual SourceObject { +class RowSet : public virtual SourceObject { public: class ParentOutOfRange : public std::exception { }; class FieldDoesNotExist : public std::exception { }; - typedef std::vector<const PerRowValues *> RowValuesStack; - PerRowValues(const xmlpp::Element *); - virtual ~PerRowValues() = 0; + typedef std::vector<const RowSet *> RowValuesStack; + RowSet(const xmlpp::Element *); + virtual ~RowSet() = 0; virtual void setFilter(const Glib::ustring &) = 0; virtual unsigned int columnCount() const = 0; @@ -55,8 +35,8 @@ class PerRowValues : public virtual SourceObject { void finish(const RowUser * r) const; static const RowValuesStack & Stack() { return stack; } - static void beginRow(const PerRowValues * r); - static void endRow(const PerRowValues * r); + static void beginRow(const RowSet * r); + static void endRow(const RowSet * r); void rowChanged() const; protected: diff --git a/project2/rowUser.cpp b/project2/rowUser.cpp new file mode 100644 index 0000000..2557af1 --- /dev/null +++ b/project2/rowUser.cpp @@ -0,0 +1,10 @@ +#include "rowUser.h" + +RowUser::RowUser() +{ +} + +RowUser::~RowUser() +{ +} + diff --git a/project2/rowUser.h b/project2/rowUser.h new file mode 100644 index 0000000..9597807 --- /dev/null +++ b/project2/rowUser.h @@ -0,0 +1,13 @@ +#ifndef ROWUSER_H +#define ROWUSER_H + +class RowUser { + public: + RowUser(); + virtual ~RowUser() = 0; + + virtual void rowChanged() const = 0; +}; + +#endif + diff --git a/project2/rowView.cpp b/project2/rowView.cpp new file mode 100644 index 0000000..e0cca9c --- /dev/null +++ b/project2/rowView.cpp @@ -0,0 +1,84 @@ +#include "rowView.h" +#include "presenter.h" +#include <boost/foreach.hpp> + +ElementLoaderImpl<RowView> viewLoader("view"); + +RowView::RowView(const xmlpp::Element * p) : + SourceObject(p), + View(p), + RowProcessor(p), + rootName(p->get_attribute_value("rootname")), + recordName(p->get_attribute_value("recordname")) +{ + BOOST_FOREACH(xmlpp::Node * node, p->find("columns/column")) { + const xmlpp::Element * elem = dynamic_cast<const xmlpp::Element *>(node); + if (elem) { + viewColumns.insert(Columns::value_type(elem->get_attribute_value("name"), Variable::makeParent(elem->get_child_text()->get_content(), 0))); + } + } + LoaderBase loader("http://project2.randomdan.homeip.net", true); + loader.supportedStorers.insert(Storer::into(&subViews)); + loader.collectAll(p, true); +} + +RowView::~RowView() +{ +} + +void +RowView::loadComplete(const CommonObjects * co) +{ + RowProcessor::loadComplete(co); +} + +void +RowView::rowReady() const +{ + presenter->pushSub(recordName); + if (viewColumns.empty()) { + unsigned int cols = source->columnCount(); + for (unsigned int c = 0; c < cols; c += 1) { + if (!source->isNull(c)) { + presenter->addField(source->getColumnName(c), source->getCurrentValue(c)); + } + } + } + else { + BOOST_FOREACH(const Columns::value_type & col, viewColumns) { + if (!source->isNull(col.first)) { + presenter->addField(col.first, col.second); + } + } + } + executeChildren(); + source->rowChanged(); + presenter->popSub(); +} + +void +RowView::execute(const Presenter * p) const +{ + presenter = p; + presenter->pushSub(rootName); + RowSet::beginRow(source.get()); + try { + source->execute(this); + RowSet::endRow(source.get()); + presenter->popSub(); + } + catch (...) { + presenter->popSub(); + RowSet::endRow(source.get()); + throw; + } +} + +void +RowView::executeChildren() const +{ + BOOST_FOREACH(Views::value_type sq, subViews) { + sq.second->execute(presenter); + } +} + diff --git a/project2/rowView.h b/project2/rowView.h new file mode 100644 index 0000000..fb22b2b --- /dev/null +++ b/project2/rowView.h @@ -0,0 +1,32 @@ +#ifndef ROWVIEW_H +#define ROWVIEW_H + +#include <libxml++/nodes/element.h> +#include <boost/intrusive_ptr.hpp> +#include "sourceObject.h" +#include "rowProcessor.h" +#include "view.h" + +class RowView : public View, public RowProcessor { + public: + RowView(const xmlpp::Element *); + virtual ~RowView(); + + void loadComplete(const CommonObjects *); + void execute(const Presenter *) const; + void rowReady() const; + + const Glib::ustring rootName; + const Glib::ustring recordName; + + protected: + typedef std::map<Glib::ustring, Variable> Columns; + Columns viewColumns; + + void executeChildren() const; + Views subViews; + mutable const Presenter * presenter; +}; + +#endif + diff --git a/project2/sendmailTask.cpp b/project2/sendmailTask.cpp index a95945f..29d2c3b 100644 --- a/project2/sendmailTask.cpp +++ b/project2/sendmailTask.cpp @@ -1,8 +1,7 @@ #include "sendmailTask.h" #include <boost/foreach.hpp> #include "xmlObjectLoader.h" -#include "appEngine.h" -#include "presenter.h" +#include "xmlPresenter.h" #include <libxslt/transform.h> #include <misc.h> #include <stdexcept> diff --git a/project2/sqlMergeTask.cpp b/project2/sqlMergeTask.cpp index 09e18ca..93e91db 100644 --- a/project2/sqlMergeTask.cpp +++ b/project2/sqlMergeTask.cpp @@ -223,7 +223,7 @@ class Populate : public NoOutputExecute { } void execute() const { - const PerRowValues * iter = *++PerRowValues::Stack().rbegin(); + const RowSet * iter = *++RowSet::Stack().rbegin(); if (idxs.empty()) { idxs.resize(iter->columnCount()); // Sure this can be improved upon... but hey. @@ -243,7 +243,7 @@ class Populate : public NoOutputExecute { try { cmd->bindParamS(idxs[c], iter->getCurrentValue(c)); } - catch (const PerRowValues::FieldDoesNotExist &) { + catch (const RowSet::FieldDoesNotExist &) { cmd->bindNull(idxs[c]); } } diff --git a/project2/sqlMergeTask.h b/project2/sqlMergeTask.h index ede8424..08246d0 100644 --- a/project2/sqlMergeTask.h +++ b/project2/sqlMergeTask.h @@ -73,66 +73,5 @@ class SqlMergeTask : public Task { static bool defaultUseTempTable; }; -/* -class CopyBasedDbConversion : public DbConversion { - public: - CopyBasedDbConversion(const Connection & dest, const std::string dt); - virtual ~CopyBasedDbConversion(); - private: - void copyToTempTable() const; - virtual SelectCommand * selectCommand() const = 0; -}; -class SimpleDbConversion : public CopyBasedDbConversion { - public: - SimpleDbConversion(const Connection & src, const std::string st, const Connection & dest, - const std::string dt); - ~SimpleDbConversion(); - SelectCommand * selectCommand() const; - private: - const Connection & srcdb; - const Table stable; - mutable SelectCommand * srcCmd; -}; -class CustomDbConversion : public CopyBasedDbConversion { - public: - CustomDbConversion(SelectCommand * srcc, const Connection & dest, const std::string dt); - ~CustomDbConversion(); - private: - SelectCommand * selectCommand() const; - SelectCommand * srcCmd; -}; -class EasyFillDbConversion : public DbConversion { - public: - EasyFillDbConversion(const std::string src, const Connection & db, const std::string dt); - ~EasyFillDbConversion(); - - private: - void copyToTempTable() const; - const std::string srcSql; -}; -class FileFillDbConversion : public DbConversion { - public: - FileFillDbConversion(const std::string src, const Connection & db, const std::string dt); - ~FileFillDbConversion(); - - std::list<ODBC::String> post; - - private: - void copyToTempTable() const; - const std::string srcFile; -}; -class CustomFillDbConversion : public DbConversion { - public: - typedef void(*FillFunc)(const CustomFillDbConversion *); - - CustomFillDbConversion(FillFunc fill, const Connection & dest, const std::string dt); - ~CustomFillDbConversion(); - - private: - void copyToTempTable() const; - const FillFunc filler; -}; -*/ - #endif diff --git a/project2/sqlRows.cpp b/project2/sqlRows.cpp index 9d7950f..8d3e98c 100644 --- a/project2/sqlRows.cpp +++ b/project2/sqlRows.cpp @@ -1,4 +1,5 @@ #include "sqlRows.h" +#include "rowProcessor.h" #include "xml.h" #include "selectcommand.h" #include "rdbmsDataSource.h" @@ -12,7 +13,7 @@ ElementLoaderImpl<SqlRows> sqlviewLoader("sqlrows"); SqlRows::SqlRows(const xmlpp::Element * p) : SourceObject(p), - PerRowValues(p), + RowSet(p), dataSource(p->get_attribute_value("datasource")), sqlCommand(dynamic_cast<xmlpp::Element *>(p->get_children("sql").front())), query(NULL), diff --git a/project2/sqlRows.h b/project2/sqlRows.h index f3e5605..14ffb6f 100644 --- a/project2/sqlRows.h +++ b/project2/sqlRows.h @@ -6,11 +6,11 @@ #include <map> #include "selectcommand.h" #include "iHaveParameters.h" -#include "perRowValues.h" +#include "rowSet.h" class RdbmsDataSource; -class SqlRows : public PerRowValues { +class SqlRows : public RowSet { public: SqlRows(const xmlpp::Element * p); ~SqlRows(); diff --git a/project2/urlRows.cpp b/project2/urlRows.cpp index 68d81e4..40c9f63 100644 --- a/project2/urlRows.cpp +++ b/project2/urlRows.cpp @@ -1,4 +1,5 @@ #include "urlRows.h" +#include "rowProcessor.h" #include "xmlObjectLoader.h" #include "exceptions.h" #include "../libmisc/curlsup.h" @@ -9,7 +10,7 @@ ElementLoaderImpl<UrlRows> urlrowsLoader("urlrows"); UrlRows::UrlRows(const xmlpp::Element * p) : SourceObject(p), - PerRowValues(p), + RowSet(p), url(p->get_attribute_value("url")), fieldSep(p->get_attribute_value("fieldSep")[0]), quoteChar(p->get_attribute_value("quoteChar")[0]), @@ -82,7 +83,7 @@ UrlRows::getCurrentValue(const Glib::ustring & id) const return **v; } } - throw PerRowValues::FieldDoesNotExist(); + throw RowSet::FieldDoesNotExist(); } size_t diff --git a/project2/urlRows.h b/project2/urlRows.h index 3333fca..ea09fee 100644 --- a/project2/urlRows.h +++ b/project2/urlRows.h @@ -5,9 +5,9 @@ #include <boost/intrusive_ptr.hpp> #include <boost/shared_ptr.hpp> #include <map> -#include "perRowValues.h" +#include "rowSet.h" -class UrlRows : public PerRowValues { +class UrlRows : public RowSet { public: UrlRows(const xmlpp::Element * p); ~UrlRows(); diff --git a/project2/variables.cpp b/project2/variables.cpp index c6a65f1..b0aecea 100644 --- a/project2/variables.cpp +++ b/project2/variables.cpp @@ -1,8 +1,8 @@ #include "variables.h" #include "exceptions.h" #include "appEngine.h" -#include "perRowValues.h" #include "session.h" +#include "rowUser.h" #include <libxml++/nodes/textnode.h> #include <stdexcept> #include <boost/tokenizer.hpp> @@ -122,10 +122,10 @@ class VariableParent : public VariableImplDyn, public RowUser { if (!cacheValid) { try { if (!row) { - PerRowValues::RowValuesStack::const_reverse_iterator r = PerRowValues::Stack().rbegin(); + RowSet::RowValuesStack::const_reverse_iterator r = RowSet::Stack().rbegin(); for (size_t p = depth; p--; r++) ; - if (r == PerRowValues::Stack().rend()) { - throw PerRowValues::ParentOutOfRange(); + if (r == RowSet::Stack().rend()) { + throw RowSet::ParentOutOfRange(); } row = *r; row->use(this); @@ -135,13 +135,13 @@ class VariableParent : public VariableImplDyn, public RowUser { } getValue(cache, row); } - catch (PerRowValues::ParentOutOfRange) { + catch (RowSet::ParentOutOfRange) { if (!defaultValue) { throw; } cache = *defaultValue; } - catch (PerRowValues::FieldDoesNotExist) { + catch (RowSet::FieldDoesNotExist) { if (!defaultValue) { throw; } @@ -165,22 +165,22 @@ class VariableParent : public VariableImplDyn, public RowUser { if (name == "!rownum") { getValue = boost::bind(&assignHelper, _1, boost::bind(&boost::lexical_cast<Glib::ustring, unsigned int>, - boost::bind(&PerRowValues::getRowNum, _2))); + boost::bind(&RowSet::getRowNum, _2))); } else { - throw PerRowValues::FieldDoesNotExist(); + throw RowSet::FieldDoesNotExist(); } } else { - typedef const Glib::ustring & (PerRowValues::*gCV)(const Glib::ustring &) const; + typedef const Glib::ustring & (RowSet::*gCV)(const Glib::ustring &) const; getValue = boost::bind(&assignHelper, _1, - boost::bind((gCV)&PerRowValues::getCurrentValue, _2, name)); + boost::bind((gCV)&RowSet::getCurrentValue, _2, name)); } } - mutable const PerRowValues * row; + mutable const RowSet * row; const size_t depth; const RowUser * dep; - boost::function2<void, Glib::ustring &, const PerRowValues *> getValue; + boost::function2<void, Glib::ustring &, const RowSet *> getValue; }; class VariableParse : public VariableImplDyn, public RowUser { diff --git a/project2/view.cpp b/project2/view.cpp index 53eff61..ad9ef1f 100644 --- a/project2/view.cpp +++ b/project2/view.cpp @@ -1,9 +1,4 @@ #include "view.h" -#include "presenter.h" -#include <boost/foreach.hpp> -#include <stdexcept> - -ElementLoaderImpl<RowView> viewLoader("view"); View::View(const xmlpp::Element * p) : SourceObject(p) @@ -14,81 +9,3 @@ View::~View() { } -RowView::RowView(const xmlpp::Element * p) : - SourceObject(p), - View(p), - RowProcessor(p), - rootName(p->get_attribute_value("rootname")), - recordName(p->get_attribute_value("recordname")) -{ - BOOST_FOREACH(xmlpp::Node * node, p->find("columns/column")) { - const xmlpp::Element * elem = dynamic_cast<const xmlpp::Element *>(node); - if (elem) { - viewColumns.insert(Columns::value_type(elem->get_attribute_value("name"), Variable::makeParent(elem->get_child_text()->get_content(), 0))); - } - } - LoaderBase loader("http://project2.randomdan.homeip.net", true); - loader.supportedStorers.insert(Storer::into(&subViews)); - loader.collectAll(p, true); -} - -RowView::~RowView() -{ -} - -void -RowView::loadComplete(const CommonObjects * co) -{ - RowProcessor::loadComplete(co); -} - -void -RowView::rowReady() const -{ - presenter->pushSub(recordName); - if (viewColumns.empty()) { - unsigned int cols = source->columnCount(); - for (unsigned int c = 0; c < cols; c += 1) { - if (!source->isNull(c)) { - presenter->addField(source->getColumnName(c), source->getCurrentValue(c)); - } - } - } - else { - BOOST_FOREACH(const Columns::value_type & col, viewColumns) { - if (!source->isNull(col.first)) { - presenter->addField(col.first, col.second); - } - } - } - executeChildren(); - source->rowChanged(); - presenter->popSub(); -} - -void -RowView::execute(const Presenter * p) const -{ - presenter = p; - presenter->pushSub(rootName); - PerRowValues::beginRow(source.get()); - try { - source->execute(this); - PerRowValues::endRow(source.get()); - presenter->popSub(); - } - catch (...) { - presenter->popSub(); - PerRowValues::endRow(source.get()); - throw; - } -} - -void -RowView::executeChildren() const -{ - BOOST_FOREACH(Views::value_type sq, subViews) { - sq.second->execute(presenter); - } -} - diff --git a/project2/view.h b/project2/view.h index 9f77cb6..8080824 100644 --- a/project2/view.h +++ b/project2/view.h @@ -5,9 +5,6 @@ #include <boost/intrusive_ptr.hpp> #include <map> #include "sourceObject.h" -#include "xmlObjectLoader.h" -#include "perRowValues.h" -#include "variables.h" class Presenter; class View; @@ -22,26 +19,5 @@ class View : public virtual SourceObject { virtual void execute(const Presenter *) const = 0; }; -class RowView : public View, public RowProcessor { - public: - RowView(const xmlpp::Element *); - virtual ~RowView(); - - void loadComplete(const CommonObjects *); - void execute(const Presenter *) const; - void rowReady() const; - - const Glib::ustring rootName; - const Glib::ustring recordName; - - protected: - typedef std::map<Glib::ustring, Variable> Columns; - Columns viewColumns; - - void executeChildren() const; - Views subViews; - mutable const Presenter * presenter; -}; - #endif diff --git a/project2/xmlPresenter.cpp b/project2/xmlPresenter.cpp new file mode 100644 index 0000000..af870eb --- /dev/null +++ b/project2/xmlPresenter.cpp @@ -0,0 +1,55 @@ +#include "xmlPresenter.h" + +XmlPresenter::~XmlPresenter() +{ +} + +XmlPresenter::XmlPresenter(const std::string & group, const std::string & file) : + Presenter(group, file), + responseRootNodeName(present.get_document()->get_root_node()->get_attribute_value("root")), + responseStyle(present.get_document()->get_root_node()->get_attribute_value("style")), + contentType(present.get_document()->get_root_node()->get_attribute_value("contenttype")), + responseDoc(XmlDocumentPtr(new xmlpp::Document("1.0"))) +{ + nodeStack.push_back(responseDoc->create_root_node(responseRootNodeName)); + xmlNewNs(nodeStack.back()->cobj(), BAD_CAST "http://project2.randomdan.homeip.net", BAD_CAST "project2"); + // XSLT Style + char * buf; + if (responseStyle.length() && asprintf(&buf, "type=\"text/xsl\" href=\"%s\"", + responseStyle.c_str()) > 0) { + xmlAddPrevSibling(nodeStack.back()->cobj(), + xmlNewDocPI(responseDoc->cobj(), BAD_CAST "xml-stylesheet", BAD_CAST buf)); + free(buf); + } +} + +XmlPresenter::XmlDocumentPtr +XmlPresenter::getDataDocument() const +{ + return responseDoc; +} + +void +XmlPresenter::pushSub(const Glib::ustring & name, const Glib::ustring & ns) const +{ + nodeStack.push_back(nodeStack.back()->add_child(name, ns)); +} + +void +XmlPresenter::addAttr(const Glib::ustring & name, const Glib::ustring & ns, const Glib::ustring & value) const +{ + nodeStack.back()->set_attribute(name, value, ns); +} + +void +XmlPresenter::setText(const Glib::ustring & value) const +{ + nodeStack.back()->set_child_text(value); +} + +void +XmlPresenter::popSub() const +{ + nodeStack.pop_back(); +} + diff --git a/project2/xmlPresenter.h b/project2/xmlPresenter.h new file mode 100644 index 0000000..c16cc2c --- /dev/null +++ b/project2/xmlPresenter.h @@ -0,0 +1,31 @@ +#ifndef XMLPRESENTER_H +#define XMLPRESENTER_H + +#include "presenter.h" + +class XmlPresenter : public Presenter { + public: + typedef boost::shared_ptr<xmlpp::Document> XmlDocumentPtr; + XmlPresenter(const std::string & group, const std::string & file); + ~XmlPresenter(); + + void pushSub(const Glib::ustring & name, const Glib::ustring & ns) const; + void addAttr(const Glib::ustring & name, const Glib::ustring & ns, const Glib::ustring & value) const; + void setText(const Glib::ustring & value) const; + void popSub() const; + + virtual XmlDocumentPtr getDataDocument() const; + + const Glib::ustring responseRootNodeName; + const Glib::ustring responseStyle; + const Glib::ustring contentType; + + private: + XmlDocumentPtr responseDoc; + mutable std::vector<xmlpp::Element *> nodeStack; +}; + +typedef boost::intrusive_ptr<XmlPresenter> XmlPresenterPtr; + +#endif + diff --git a/project2/xmlRows.cpp b/project2/xmlRows.cpp index ba5697a..377e3c9 100644 --- a/project2/xmlRows.cpp +++ b/project2/xmlRows.cpp @@ -1,4 +1,5 @@ #include "xmlRows.h" +#include "rowProcessor.h" #include "xml.h" #include "exceptions.h" #include <libxml++/nodes/textnode.h> @@ -13,7 +14,7 @@ ElementLoaderImpl<XmlRows> xmlrowLoader("xmlrows"); XmlRows::XmlRows(const xmlpp::Element * p) : SourceObject(p), - PerRowValues(p), + RowSet(p), recordRoot(p->get_attribute_value("recordroot")), recordTrigger(p->get_attribute_value("recordtrigger")), filename(p->get_attribute_value("filename")), diff --git a/project2/xmlRows.h b/project2/xmlRows.h index 9d7bade..b7fe790 100644 --- a/project2/xmlRows.h +++ b/project2/xmlRows.h @@ -4,9 +4,9 @@ #include <libxml++/nodes/element.h> #include <boost/intrusive_ptr.hpp> #include <map> -#include "perRowValues.h" +#include "rowSet.h" -class XmlRows : public PerRowValues { +class XmlRows : public RowSet { public: typedef std::map<Glib::ustring, Glib::ustring> Values; typedef std::vector<std::string> Path; |