diff options
-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; |