diff options
author | randomdan <randomdan@localhost> | 2011-07-19 23:55:08 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2011-07-19 23:55:08 +0000 |
commit | 884bb7c285c29cd640bf77423bdebd28bc8468b3 (patch) | |
tree | e575c9fdaf4704dbd75c8a434e51bd5b54147da5 | |
parent | Support queuing multiple XSL row URLs and then fetching them all at once (diff) | |
download | project2-884bb7c285c29cd640bf77423bdebd28bc8468b3.tar.bz2 project2-884bb7c285c29cd640bf77423bdebd28bc8468b3.tar.xz project2-884bb7c285c29cd640bf77423bdebd28bc8468b3.zip |
Push defined columns stuff into its own class, used from streamRows
Also use it in new class regexRows for filtering and splitting rows by regex
Move all code over to using Glib regexes now they're in Glibmm, as they work properly with UTF8 strings
-rw-r--r-- | project2/Jamfile.jam | 7 | ||||
-rw-r--r-- | project2/cgi/cgiAppEngine.cpp | 6 | ||||
-rw-r--r-- | project2/definedColumns.cpp | 84 | ||||
-rw-r--r-- | project2/definedColumns.h | 50 | ||||
-rw-r--r-- | project2/regexCheck.cpp | 11 | ||||
-rw-r--r-- | project2/regexCheck.h | 2 | ||||
-rw-r--r-- | project2/regexRows.cpp | 47 | ||||
-rw-r--r-- | project2/regexRows.h | 22 | ||||
-rw-r--r-- | project2/sqlCheck.cpp | 1 | ||||
-rw-r--r-- | project2/streamRows.cpp | 79 | ||||
-rw-r--r-- | project2/streamRows.h | 39 |
11 files changed, 216 insertions, 132 deletions
diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index 1b8c17d..5d7186d 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -16,7 +16,6 @@ alias libxslt : : : : lib dl : : <name>dl ; lib fcgi : : <name>fcgi ; lib fcgi++ : : <name>fcgi++ ; -lib boost_regex : : <name>boost_regex ; lib boost_system : : <name>boost_system ; lib boost_filesystem : : <name>boost_filesystem ; lib boost_date_time : : <name>boost_date_time ; @@ -60,7 +59,7 @@ lib p2common : sourceObject.cpp task.cpp variables.cpp variableConvert.cpp view.cpp xmlObjectLoader.cpp exceptions.cpp sessionClearTask.cpp session.cpp sessionSetTask.cpp commonObjects.cpp xmlPresenter.cpp taskHost.cpp checkHost.cpp rowView.cpp rowSet.cpp rowUser.cpp rowProcessor.cpp config.cpp fileStrmVarWriter.cpp noOutputExecute.cpp - transform.cpp transformHtml.cpp transformText.cpp + transform.cpp transformHtml.cpp transformText.cpp definedColumns.cpp ../libmisc/buffer.cpp ../libmisc/misc.cpp : @@ -111,10 +110,9 @@ lib p2files : ; lib p2regex : - regexCheck.cpp + regexCheck.cpp regexRows.cpp : <include>../libmisc - <library>boost_regex <library>libxmlpp <library>p2common ; @@ -193,7 +191,6 @@ lib p2web : <library>p2common <library>p2uuid <library>boost_program_options - <library>boost_regex <library>boost_filesystem <library>p2xmlSession : : diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index f4eb134..ee19331 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -5,11 +5,11 @@ #include "../iterate.h" #include "../logger.h" #include <boost/bind.hpp> -#include <boost/regex.hpp> #include <boost/foreach.hpp> #include "../sessionXml.h" #include "../ostreamWrapper.h" #include <boost/date_time/microsec_time_clock.hpp> +#include <glibmm/regex.h> const std::string SESSIONID = "sessionID"; typedef UUID SIDKey; @@ -182,8 +182,8 @@ CgiApplicationEngine::session() const bool CgiApplicationEngine::checkDomain(const DomainPlatforms::value_type & i) const { - const std::string & h = _env->getServerName(); - return boost::regex_match(h.begin(), h.end(), boost::regex(i.first.raw())); + Glib::RefPtr<Glib::Regex> reg = Glib::Regex::create(i.first, Glib::REGEX_CASELESS | Glib::REGEX_DOTALL); + return reg->match(_env->getServerName()); } Glib::ustring diff --git a/project2/definedColumns.cpp b/project2/definedColumns.cpp new file mode 100644 index 0000000..1361453 --- /dev/null +++ b/project2/definedColumns.cpp @@ -0,0 +1,84 @@ +#include "definedColumns.h" +#include <boost/foreach.hpp> +#include <libxml++/nodes/textnode.h> + +DefinedColumns::DefinedColumns(const xmlpp::Element * p) : + RowSet(p) +{ + unsigned int colNo = 0; + BOOST_FOREACH(const xmlpp::Node * node, p->find("columns/column")) { + const xmlpp::Element * elem = dynamic_cast<const xmlpp::Element *>(node); + if (elem) { + columns.insert(Column(colNo++, elem)); + } + } +} + +DefinedColumns::Column::Column(unsigned int i, const Glib::ustring & c) : + idx(i), + col(c), + defValue(VariableType()) +{ +} + +DefinedColumns::Column::Column(unsigned int i, const xmlpp::Element * p) : + idx(i), + col(p->get_child_text()->get_content()), + defValue(p, "default", false) +{ +} + +void +DefinedColumns::Column::operator=(const VariableType & v) const +{ + value = v; +} + +const Glib::ustring & +DefinedColumns::getColumnName(unsigned int col) const +{ + Columns::index<byColIdx>::type::iterator i = columns.get<byColIdx>().find(col); + if (i != columns.get<byColIdx>().end()) { + return i->col; + } + throw RowSet::FieldOutOfRange(col); +} + +unsigned int +DefinedColumns::columnCount() const +{ + return columns.size(); +} + +VariableType +DefinedColumns::getCurrentValue(unsigned int col) const +{ + Columns::index<byColIdx>::type::iterator i = columns.get<byColIdx>().find(col); + if (i != columns.get<byColIdx>().end()) { + return i->value; + } + throw RowSet::FieldOutOfRange(col); +} + +bool +DefinedColumns::isNull(unsigned int col) const +{ + return (columns.get<byColIdx>().find(col) == columns.get<byColIdx>().end()); +} + +bool +DefinedColumns::isNull(const Glib::ustring & col) const +{ + return (columns.get<byColName>().find(col) == columns.get<byColName>().end()); +} + +VariableType +DefinedColumns::getCurrentValue(const Glib::ustring & col) const +{ + Columns::const_iterator i = columns.get<byColName>().find(col); + if (i != columns.end()) { + return i->value; + } + throw RowSet::FieldDoesNotExist(col); +} + diff --git a/project2/definedColumns.h b/project2/definedColumns.h new file mode 100644 index 0000000..d6f2ba3 --- /dev/null +++ b/project2/definedColumns.h @@ -0,0 +1,50 @@ +#ifndef DEFINEDCOLUMNS_H +#define DEFINEDCOLUMNS_H + +#include <libxml++/nodes/element.h> +#include <boost/multi_index_container.hpp> +#include <boost/multi_index/member.hpp> +#include <boost/multi_index/ordered_index.hpp> +#include "variables.h" +#include "rowSet.h" + +class DefinedColumns : public RowSet { + public: + DefinedColumns(const xmlpp::Element *); + + unsigned int columnCount() const; + const Glib::ustring & getColumnName(unsigned int col) const; + VariableType getCurrentValue(const Glib::ustring & id) const; + VariableType getCurrentValue(unsigned int col) const; + bool isNull(unsigned int col) const; + bool isNull(const Glib::ustring & id) const; + + protected: + class Column { + public: + Column(unsigned int idx, const Glib::ustring &); + Column(unsigned int idx, const xmlpp::Element * p); + + void operator=(const VariableType &) const; + + const unsigned int idx; + const Glib::ustring col; + mutable VariableType value; + const Variable defValue; + }; + struct byColIdx {}; + struct byColName {}; + typedef boost::multi_index::multi_index_container< + Column, + boost::multi_index::indexed_by< + boost::multi_index::ordered_unique< + boost::multi_index::tag<byColName>, BOOST_MULTI_INDEX_MEMBER(Column, const Glib::ustring, col)>, + boost::multi_index::ordered_unique< + boost::multi_index::tag<byColIdx>, BOOST_MULTI_INDEX_MEMBER(Column, const unsigned int, idx)> + > > Columns; + mutable Columns columns; +}; + +#endif + + diff --git a/project2/regexCheck.cpp b/project2/regexCheck.cpp index b8504c8..b88a44c 100644 --- a/project2/regexCheck.cpp +++ b/project2/regexCheck.cpp @@ -1,7 +1,7 @@ #include "regexCheck.h" #include "xmlObjectLoader.h" #include "commonObjects.h" -#include <boost/regex.hpp> +#include <glibmm/regex.h> DECLARE_LOADER("regexcheck", RegexCheck); @@ -24,12 +24,7 @@ RegexCheck::loadComplete(const CommonObjects *) bool RegexCheck::performCheck() const { - return checkString(applyTo()); -} - -bool -RegexCheck::checkString(const Glib::ustring & str) const -{ - return boost::regex_match(str.begin(), str.end(), boost::regex(regex())); + Glib::RefPtr<Glib::Regex> reg = Glib::Regex::create(regex()); + return reg->match(applyTo()); } diff --git a/project2/regexCheck.h b/project2/regexCheck.h index 602f822..17033de 100644 --- a/project2/regexCheck.h +++ b/project2/regexCheck.h @@ -15,8 +15,6 @@ class RegexCheck : public ParamChecker { const Variable applyTo; const Variable regex; - private: - bool checkString(const Glib::ustring & str) const; }; #endif diff --git a/project2/regexRows.cpp b/project2/regexRows.cpp new file mode 100644 index 0000000..b950125 --- /dev/null +++ b/project2/regexRows.cpp @@ -0,0 +1,47 @@ +#include "regexRows.h" +#include "xmlObjectLoader.h" +#include "rowProcessor.h" +#include <stdio.h> +#include <glibmm/regex.h> + +DECLARE_LOADER("regexrows", RegexRows); + +RegexRows::RegexRows(const xmlpp::Element * p) : + DefinedColumns(p), + sourceText(p, "sourceText"), + regex(p, "regex") +{ +} + +RegexRows::~RegexRows() +{ +} + +void +RegexRows::loadComplete(const CommonObjects*) +{ +} + +void +RegexRows::setFilter(const Glib::ustring&) +{ +} + +void +RegexRows::execute(const RowProcessor * rp) const +{ + rowNum = 1; + Glib::RefPtr<Glib::Regex> reg = Glib::Regex::create(regex(), Glib::REGEX_CASELESS | Glib::REGEX_DOTALL); + Glib::MatchInfo matches; + if (reg->match(sourceText(), matches)) { + do { + unsigned int cols = std::min<unsigned int>(matches.get_match_count(), DefinedColumns::columnCount() + 1); + for (unsigned int n = 1; n < cols; n += 1) { + *DefinedColumns::columns.get<byColIdx>().find(n - 1) = matches.fetch(n); + } + rp->rowReady(); + rowNum += 1; + } while (matches.next()); + } +} + diff --git a/project2/regexRows.h b/project2/regexRows.h new file mode 100644 index 0000000..b4b6446 --- /dev/null +++ b/project2/regexRows.h @@ -0,0 +1,22 @@ +#ifndef REGEXROWS_H +#define REGEXROWS_H + +#include "definedColumns.h" +#include "variables.h" + +/// Base class for Project2 components that create a row set based on the contents of a byte stream +class RegexRows : public DefinedColumns { + public: + RegexRows(const xmlpp::Element * p); + ~RegexRows(); + void loadComplete(const CommonObjects*); + void setFilter(const Glib::ustring&); + void execute(const RowProcessor*) const; + + private: + const Variable sourceText; + const Variable regex; +}; + +#endif + diff --git a/project2/sqlCheck.cpp b/project2/sqlCheck.cpp index c36c229..c89608b 100644 --- a/project2/sqlCheck.cpp +++ b/project2/sqlCheck.cpp @@ -3,7 +3,6 @@ #include "selectcommand.h" #include "column.h" #include "rdbmsDataSource.h" -#include <boost/regex.hpp> #include "commonObjects.h" #include "sqlVariableBinder.h" #include <boost/foreach.hpp> diff --git a/project2/streamRows.cpp b/project2/streamRows.cpp index 62d0d0f..4cf29e6 100644 --- a/project2/streamRows.cpp +++ b/project2/streamRows.cpp @@ -1,10 +1,8 @@ #include "streamRows.h" #include "rowProcessor.h" -#include <boost/foreach.hpp> -#include <libxml++/nodes/textnode.h> StreamRows::StreamRows(const xmlpp::Element * p) : - RowSet(p), + DefinedColumns(p), fieldSep(p->get_attribute_value("fieldSep")[0]), quoteChar(p->get_attribute_value("quoteChar")[0]), keepBlankRows(p->get_attribute_value("keepBlankRows") == "true"), @@ -16,13 +14,6 @@ StreamRows::StreamRows(const xmlpp::Element * p) : inQuotes(false), prevWasQuote(false) { - unsigned int colNo = 0; - BOOST_FOREACH(const xmlpp::Node * node, p->find("columns/column")) { - const xmlpp::Element * elem = dynamic_cast<const xmlpp::Element *>(node); - if (elem) { - columns.insert(Column(colNo++, elem)); - } - } mkCols = columns.empty(); } @@ -30,54 +21,6 @@ StreamRows::~StreamRows() { } -const Glib::ustring & -StreamRows::getColumnName(unsigned int col) const -{ - Columns::index<byColIdx>::type::iterator i = columns.get<byColIdx>().find(col); - if (i != columns.get<byColIdx>().end()) { - return i->col; - } - throw RowSet::FieldOutOfRange(col); -} - -unsigned int -StreamRows::columnCount() const -{ - return columns.size(); -} - -VariableType -StreamRows::getCurrentValue(unsigned int col) const -{ - Columns::index<byColIdx>::type::iterator i = columns.get<byColIdx>().find(col); - if (i != columns.get<byColIdx>().end()) { - return i->value; - } - throw RowSet::FieldOutOfRange(col); -} - -bool -StreamRows::isNull(unsigned int col) const -{ - return (columns.get<byColIdx>().find(col) == columns.get<byColIdx>().end()); -} - -bool -StreamRows::isNull(const Glib::ustring & col) const -{ - return (columns.get<byColName>().find(col) == columns.get<byColName>().end()); -} - -VariableType -StreamRows::getCurrentValue(const Glib::ustring & col) const -{ - Columns::const_iterator i = columns.get<byColName>().find(col); - if (i != columns.end()) { - return i->value; - } - throw RowSet::FieldDoesNotExist(col); -} - void StreamRows::addColumn(Glib::ustring & tok) const { @@ -92,26 +35,6 @@ StreamRows::addColumn(Glib::ustring & tok) const columns.insert(Column(columns.size(), tok)); } -StreamRows::Column::Column(unsigned int i, const Glib::ustring & c) : - idx(i), - col(c), - defValue(VariableType()) -{ -} - -StreamRows::Column::Column(unsigned int i, const xmlpp::Element * p) : - idx(i), - col(p->get_child_text()->get_content()), - defValue(p, "default", false) -{ -} - -void -StreamRows::Column::operator=(const VariableType & v) const -{ - value = v; -} - void StreamRows::begin() const { diff --git a/project2/streamRows.h b/project2/streamRows.h index 449a44b..338d997 100644 --- a/project2/streamRows.h +++ b/project2/streamRows.h @@ -1,25 +1,17 @@ #ifndef STREAMROWS_H #define STREAMROWS_H -#include "rowSet.h" #include "variables.h" -#include <boost/multi_index_container.hpp> -#include <boost/multi_index/member.hpp> -#include <boost/multi_index/ordered_index.hpp> +#include "definedColumns.h" + +class RowProcessor; /// Base class for Project2 components that create a row set based on the contents of a byte stream -class StreamRows : public RowSet { +class StreamRows : public DefinedColumns { public: StreamRows(const xmlpp::Element * p); ~StreamRows(); - unsigned int columnCount() const; - const Glib::ustring & getColumnName(unsigned int col) const; - VariableType getCurrentValue(const Glib::ustring & id) const; - VariableType getCurrentValue(unsigned int col) const; - bool isNull(unsigned int col) const; - bool isNull(const Glib::ustring & id) const; - protected: void begin() const; void pushChar(gunichar ch, const RowProcessor *) const; @@ -27,29 +19,6 @@ class StreamRows : public RowSet { private: void addColumn(Glib::ustring & rawtok) const; - class Column { - public: - Column(unsigned int idx, const Glib::ustring &); - Column(unsigned int idx, const xmlpp::Element * p); - - void operator=(const VariableType &) const; - - const unsigned int idx; - const Glib::ustring col; - mutable VariableType value; - const Variable defValue; - }; - struct byColIdx {}; - struct byColName {}; - typedef boost::multi_index::multi_index_container< - Column, - boost::multi_index::indexed_by< - boost::multi_index::ordered_unique< - boost::multi_index::tag<byColName>, BOOST_MULTI_INDEX_MEMBER(Column, const Glib::ustring, col)>, - boost::multi_index::ordered_unique< - boost::multi_index::tag<byColIdx>, BOOST_MULTI_INDEX_MEMBER(Column, const unsigned int, idx)> - > > Columns; - mutable Columns columns; public: const gunichar fieldSep; |