summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2011-08-11 00:05:50 +0000
committerrandomdan <randomdan@localhost>2011-08-11 00:05:50 +0000
commit3a4a6e0be14e296f766581355f709c110fa24dec (patch)
tree9d182f483ece612ca675b79b3dcd58cbac0e009b
parentCreate a variable for accessing parameters (ideal for rowsets, they can all w... (diff)
downloadproject2-3a4a6e0be14e296f766581355f709c110fa24dec.tar.bz2
project2-3a4a6e0be14e296f766581355f709c110fa24dec.tar.xz
project2-3a4a6e0be14e296f766581355f709c110fa24dec.zip
Move the SqlWriter outside of SqlRows and make it work on generic commands
Also fix bug that could occur with multiple uses with different filters
-rw-r--r--project2/Jamfile.jam2
-rw-r--r--project2/sqlRows.cpp126
-rw-r--r--project2/sqlRows.h50
-rw-r--r--project2/sqlWriter.cpp131
-rw-r--r--project2/sqlWriter.h63
5 files changed, 198 insertions, 174 deletions
diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam
index f7dd242..aed9e3d 100644
--- a/project2/Jamfile.jam
+++ b/project2/Jamfile.jam
@@ -153,7 +153,7 @@ obj sql-modPQ :
;
lib p2sql :
- sqlCheck.cpp sqlTask.cpp sqlMergeTask.cpp sqlRows.cpp sqlVariableBinder.cpp tablepatch.cpp rdbmsDataSource.cpp
+ sqlCheck.cpp sqlWriter.cpp sqlTask.cpp sqlMergeTask.cpp sqlRows.cpp sqlVariableBinder.cpp tablepatch.cpp rdbmsDataSource.cpp
../libdbpp//dbpp
:
<odbc>yes:<library>sql-modODBC
diff --git a/project2/sqlRows.cpp b/project2/sqlRows.cpp
index 48774ae..31d86dd 100644
--- a/project2/sqlRows.cpp
+++ b/project2/sqlRows.cpp
@@ -5,10 +5,8 @@
#include "rdbmsDataSource.h"
#include "column.h"
#include <string.h>
-#include <libxml++/nodes/textnode.h>
#include "xmlObjectLoader.h"
#include "commonObjects.h"
-#include "sqlVariableBinder.h"
#include <boost/date_time/gregorian/gregorian_types.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/foreach.hpp>
@@ -72,14 +70,8 @@ SqlRows::SqlState::getColumns() const
void
SqlRows::execute(const Glib::ustring & filter, const RowProcessor * rp) const
{
- SqlCommand::FiltersRangeType r = sqlCommand.filters.equal_range(filter);
- for (SqlCommand::Filters::const_iterator i = r.first; i != r.second; i++) {
- i->second->active = true;
- }
unsigned int offset = 0;
- Glib::ustring sql;
- sqlCommand.writeSql(sql);
- SqlState ss(SelectPtr(db->getReadonly().newSelectCommand(sql)));
+ SqlState ss(SelectPtr(db->getReadonly().newSelectCommand(sqlCommand.getSqlFor(filter))));
sqlCommand.bindParams(ss.query.get(), offset);
while (ss.query->fetch()) {
HandleAsVariableType h;
@@ -95,119 +87,3 @@ SqlRows::execute(const Glib::ustring & filter, const RowProcessor * rp) const
}
}
-SqlRows::SqlWriter::SqlWriter()
-{
-}
-
-SqlRows::SqlWriter::~SqlWriter()
-{
-}
-
-SqlRows::SqlCommand::SqlCommand(const xmlpp::Element * N)
-{
- BOOST_FOREACH(xmlpp::Node * n, N->get_children()) {
- const xmlpp::TextNode * t = dynamic_cast<const xmlpp::TextNode *>(n);
- if (t) {
- writers.push_back(new SqlText(t));
- }
- const xmlpp::Element * e = dynamic_cast<const xmlpp::Element *>(n);
- if (e) {
- if (e->get_name() == "filter") {
- SqlFilterPtr f = new SqlFilter(e);
- writers.push_back(f);
- filters.insert(Filters::value_type(f->name, f));
- }
- else if (e->get_name() == "param") {
- writers.push_back(new SqlParameter(e));
- }
- }
- }
-}
-
-void
-SqlRows::SqlCommand::writeSql(Glib::ustring & sql) const
-{
- BOOST_FOREACH(const SqlWriterPtr & w, writers) {
- w->writeSql(sql);
- }
-}
-
-void
-SqlRows::SqlCommand::bindParams(DB::SelectCommand * cmd, unsigned int & offset) const
-{
- BOOST_FOREACH(const SqlWriterPtr & w, writers) {
- w->bindParams(cmd, offset);
- }
-}
-
-SqlRows::SqlFilter::SqlFilter(const xmlpp::Element * N) :
- name(N->get_attribute_value("name")),
- active(false)
-{
- BOOST_FOREACH(xmlpp::Node * n, N->get_children()) {
- const xmlpp::TextNode * t = dynamic_cast<const xmlpp::TextNode *>(n);
- if (t) {
- writers.push_back(new SqlText(t));
- }
- const xmlpp::Element * e = dynamic_cast<const xmlpp::Element *>(n);
- if (e) {
- if (e->get_name() == "param") {
- writers.push_back(new SqlParameter(e));
- }
- }
- }
-}
-
-void
-SqlRows::SqlFilter::writeSql(Glib::ustring & sql) const
-{
- if (active) {
- BOOST_FOREACH(const SqlWriterPtr & w, writers) {
- w->writeSql(sql);
- }
- }
-}
-
-void
-SqlRows::SqlFilter::bindParams(DB::SelectCommand * cmd, unsigned int & offset) const
-{
- if (active) {
- BOOST_FOREACH(const SqlWriterPtr & w, writers) {
- w->bindParams(cmd, offset);
- }
- }
-}
-
-SqlRows::SqlParameter::SqlParameter(const xmlpp::Element * n) :
- Variable(n, boost::optional<Glib::ustring>("local"))
-{
-}
-
-void
-SqlRows::SqlParameter::writeSql(Glib::ustring & sql) const
-{
- sql.append("?");
-}
-
-void
-SqlRows::SqlParameter::bindParams(DB::SelectCommand * cmd, unsigned int & offset) const
-{
- boost::apply_visitor<const SqlVariableBinder, const VariableType>(SqlVariableBinder(cmd, offset++), (*this));
-}
-
-SqlRows::SqlText::SqlText(const xmlpp::TextNode * n) :
- text(n->get_content())
-{
-}
-
-void
-SqlRows::SqlText::writeSql(Glib::ustring & sql) const
-{
- sql.append(text);
-}
-
-void
-SqlRows::SqlText::bindParams(DB::SelectCommand *, unsigned int &) const
-{
-}
-
diff --git a/project2/sqlRows.h b/project2/sqlRows.h
index 494f188..6cdd716 100644
--- a/project2/sqlRows.h
+++ b/project2/sqlRows.h
@@ -7,6 +7,7 @@
#include "selectcommand.h"
#include "iHaveParameters.h"
#include "rowSet.h"
+#include "sqlWriter.h"
class RdbmsDataSource;
@@ -22,54 +23,7 @@ class SqlRows : public RowSet {
const Variable dataSource;
private:
- class SqlWriter;
- typedef boost::intrusive_ptr<SqlWriter> SqlWriterPtr;
- typedef std::list<SqlWriterPtr> Writers;
- class SqlWriter : public IntrusivePtrBase {
- public:
- SqlWriter();
- virtual ~SqlWriter();
- virtual void writeSql(Glib::ustring & sql) const = 0;
- virtual void bindParams(DB::SelectCommand *, unsigned int & offset) const = 0;
- };
- class SqlText : public SqlWriter {
- public:
- SqlText(const xmlpp::TextNode *);
- virtual void writeSql(Glib::ustring & sql) const;
- virtual void bindParams(DB::SelectCommand *, unsigned int & offset) const;
-
- const Glib::ustring text;
- };
- class SqlParameter : public SqlWriter, Variable {
- public:
- SqlParameter(const xmlpp::Element *);
- virtual void writeSql(Glib::ustring & sql) const;
- virtual void bindParams(DB::SelectCommand *, unsigned int & offset) const;
- };
- class SqlFilter : public SqlWriter {
- public:
- SqlFilter(const xmlpp::Element *);
- virtual void writeSql(Glib::ustring & sql) const;
- virtual void bindParams(DB::SelectCommand *, unsigned int & offset) const;
-
- const Glib::ustring name;
- bool active;
- private:
- Writers writers;
- };
- typedef boost::intrusive_ptr<SqlFilter> SqlFilterPtr;
- class SqlCommand : public SqlWriter {
- public:
- SqlCommand(const xmlpp::Element *);
- virtual void writeSql(Glib::ustring & sql) const;
- virtual void bindParams(DB::SelectCommand *, unsigned int & offset) const;
- typedef std::multimap<Glib::ustring, SqlFilterPtr> Filters;
- typedef std::pair<Filters::const_iterator, Filters::const_iterator> FiltersRangeType;
- Filters filters;
- private:
- Writers writers;
- };
- SqlCommand sqlCommand;
+ DynamicSql::SqlCommand sqlCommand;
typedef boost::shared_ptr<DB::SelectCommand> SelectPtr;
class SqlState : public RowState {
public:
diff --git a/project2/sqlWriter.cpp b/project2/sqlWriter.cpp
new file mode 100644
index 0000000..88d9801
--- /dev/null
+++ b/project2/sqlWriter.cpp
@@ -0,0 +1,131 @@
+#include "sqlWriter.h"
+#include <boost/foreach.hpp>
+#include "sqlVariableBinder.h"
+
+DynamicSql::SqlWriter::SqlWriter()
+{
+}
+
+DynamicSql::SqlWriter::~SqlWriter()
+{
+}
+
+DynamicSql::SqlCommand::SqlCommand(const xmlpp::Element * N)
+{
+ BOOST_FOREACH(xmlpp::Node * n, N->get_children()) {
+ const xmlpp::TextNode * t = dynamic_cast<const xmlpp::TextNode *>(n);
+ if (t) {
+ writers.push_back(new SqlText(t));
+ }
+ const xmlpp::Element * e = dynamic_cast<const xmlpp::Element *>(n);
+ if (e) {
+ if (e->get_name() == "filter") {
+ SqlFilterPtr f = new SqlFilter(e);
+ writers.push_back(f);
+ filters.insert(Filters::value_type(f->name, f));
+ }
+ else if (e->get_name() == "param") {
+ writers.push_back(new SqlParameter(e));
+ }
+ }
+ }
+}
+
+Glib::ustring
+DynamicSql::SqlCommand::getSqlFor(const Glib::ustring & f) const
+{
+ BOOST_FOREACH(const SqlCommand::Filters::value_type & filter, filters) {
+ filter.second->active = (filter.second->name == f);
+ }
+ Glib::ustring sql;
+ writeSql(sql);
+ return sql;
+}
+
+void
+DynamicSql::SqlCommand::writeSql(Glib::ustring & sql) const
+{
+ BOOST_FOREACH(const SqlWriterPtr & w, writers) {
+ w->writeSql(sql);
+ }
+}
+
+void
+DynamicSql::SqlCommand::bindParams(DB::Command * cmd, unsigned int & offset) const
+{
+ BOOST_FOREACH(const SqlWriterPtr & w, writers) {
+ w->bindParams(cmd, offset);
+ }
+}
+
+DynamicSql::SqlFilter::SqlFilter(const xmlpp::Element * N) :
+ name(N->get_attribute_value("name")),
+ active(false)
+{
+ BOOST_FOREACH(xmlpp::Node * n, N->get_children()) {
+ const xmlpp::TextNode * t = dynamic_cast<const xmlpp::TextNode *>(n);
+ if (t) {
+ writers.push_back(new SqlText(t));
+ }
+ const xmlpp::Element * e = dynamic_cast<const xmlpp::Element *>(n);
+ if (e) {
+ if (e->get_name() == "param") {
+ writers.push_back(new SqlParameter(e));
+ }
+ }
+ }
+}
+
+void
+DynamicSql::SqlFilter::writeSql(Glib::ustring & sql) const
+{
+ if (active) {
+ BOOST_FOREACH(const SqlWriterPtr & w, writers) {
+ w->writeSql(sql);
+ }
+ }
+}
+
+void
+DynamicSql::SqlFilter::bindParams(DB::Command * cmd, unsigned int & offset) const
+{
+ if (active) {
+ BOOST_FOREACH(const SqlWriterPtr & w, writers) {
+ w->bindParams(cmd, offset);
+ }
+ }
+}
+
+DynamicSql::SqlParameter::SqlParameter(const xmlpp::Element * n) :
+ Variable(n, boost::optional<Glib::ustring>("local"))
+{
+}
+
+void
+DynamicSql::SqlParameter::writeSql(Glib::ustring & sql) const
+{
+ sql.append("?");
+}
+
+void
+DynamicSql::SqlParameter::bindParams(DB::Command * cmd, unsigned int & offset) const
+{
+ boost::apply_visitor<const SqlVariableBinder, const VariableType>(SqlVariableBinder(cmd, offset++), (*this));
+}
+
+DynamicSql::SqlText::SqlText(const xmlpp::TextNode * n) :
+ text(n->get_content())
+{
+}
+
+void
+DynamicSql::SqlText::writeSql(Glib::ustring & sql) const
+{
+ sql.append(text);
+}
+
+void
+DynamicSql::SqlText::bindParams(DB::Command *, unsigned int &) const
+{
+}
+
diff --git a/project2/sqlWriter.h b/project2/sqlWriter.h
new file mode 100644
index 0000000..7693e19
--- /dev/null
+++ b/project2/sqlWriter.h
@@ -0,0 +1,63 @@
+#ifndef SQLWRITER_H
+#define SQLWRITER_H
+
+#include <intrusivePtrBase.h>
+#include <libxml++/nodes/textnode.h>
+#include <command.h>
+#include <glibmm/ustring.h>
+#include <list>
+#include <map>
+#include "variables.h"
+
+namespace DynamicSql {
+ class SqlWriter;
+ typedef boost::intrusive_ptr<SqlWriter> SqlWriterPtr;
+ typedef std::list<SqlWriterPtr> Writers;
+ class SqlWriter : public IntrusivePtrBase {
+ public:
+ SqlWriter();
+ virtual ~SqlWriter();
+ virtual void writeSql(Glib::ustring & sql) const = 0;
+ virtual void bindParams(DB::Command *, unsigned int & offset) const = 0;
+ };
+ class SqlText : public SqlWriter {
+ public:
+ SqlText(const xmlpp::TextNode *);
+ virtual void writeSql(Glib::ustring & sql) const;
+ virtual void bindParams(DB::Command *, unsigned int & offset) const;
+
+ const Glib::ustring text;
+ };
+ class SqlParameter : public SqlWriter, Variable {
+ public:
+ SqlParameter(const xmlpp::Element *);
+ virtual void writeSql(Glib::ustring & sql) const;
+ virtual void bindParams(DB::Command *, unsigned int & offset) const;
+ };
+ class SqlFilter : public SqlWriter {
+ public:
+ SqlFilter(const xmlpp::Element *);
+ virtual void writeSql(Glib::ustring & sql) const;
+ virtual void bindParams(DB::Command *, unsigned int & offset) const;
+
+ const Glib::ustring name;
+ bool active;
+ private:
+ Writers writers;
+ };
+ typedef boost::intrusive_ptr<SqlFilter> SqlFilterPtr;
+ class SqlCommand : public SqlWriter {
+ public:
+ SqlCommand(const xmlpp::Element *);
+ virtual void writeSql(Glib::ustring & sql) const;
+ virtual void bindParams(DB::Command *, unsigned int & offset) const;
+ typedef std::multimap<Glib::ustring, SqlFilterPtr> Filters;
+ Glib::ustring getSqlFor(const Glib::ustring & f) const;
+ private:
+ Filters filters;
+ Writers writers;
+ };
+}
+
+#endif
+