summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2011-02-19 17:01:55 +0000
committerrandomdan <randomdan@localhost>2011-02-19 17:01:55 +0000
commita36be7f6f3540ffd99ae0eb50a36002f06c27be5 (patch)
treea306b9fc1fc317cc1abd1e6d01517628b9ecf3ae
parentPass null values to presenters, it's up to them what to do with them (diff)
downloadproject2-a36be7f6f3540ffd99ae0eb50a36002f06c27be5.tar.bz2
project2-a36be7f6f3540ffd99ae0eb50a36002f06c27be5.tar.xz
project2-a36be7f6f3540ffd99ae0eb50a36002f06c27be5.zip
Use a smart pointer to ensure sqlRows query handle is always deleted
Add CommonObjects destructor to ensure rowSets are cleared before datasources
-rw-r--r--project2/commonObjects.cpp6
-rw-r--r--project2/commonObjects.h2
-rw-r--r--project2/sqlRows.cpp6
-rw-r--r--project2/sqlRows.h3
4 files changed, 12 insertions, 5 deletions
diff --git a/project2/commonObjects.cpp b/project2/commonObjects.cpp
index 2ca4846..89eb913 100644
--- a/project2/commonObjects.cpp
+++ b/project2/commonObjects.cpp
@@ -2,6 +2,12 @@
#include <libxml++/parsers/domparser.h>
#include <libxml/xinclude.h>
+CommonObjects::~CommonObjects()
+{
+ rowSets.clear();
+ datasources.clear();
+}
+
RowSetPtr
CommonObjects::getSource(const std::string & name) const
{
diff --git a/project2/commonObjects.h b/project2/commonObjects.h
index a15a8da..32be835 100644
--- a/project2/commonObjects.h
+++ b/project2/commonObjects.h
@@ -9,6 +9,8 @@ class CommonObjects : public virtual IntrusivePtrBase {
SimpleMessageException(DataSourceNotFound);
SimpleMessageException(DataSourceNotCompatible);
+ virtual ~CommonObjects();
+
RowSetPtr getSource(const std::string &) const;
template <class DataSourceType>
const DataSourceType * dataSource(const std::string & name) const
diff --git a/project2/sqlRows.cpp b/project2/sqlRows.cpp
index 22dafa9..5a57fc7 100644
--- a/project2/sqlRows.cpp
+++ b/project2/sqlRows.cpp
@@ -19,7 +19,6 @@ SqlRows::SqlRows(const xmlpp::Element * p) :
RowSet(p),
dataSource(p, "datasource"),
sqlCommand(dynamic_cast<xmlpp::Element *>(p->get_children("sql").front())),
- query(NULL),
db(NULL)
{
}
@@ -110,13 +109,12 @@ SqlRows::execute(const RowProcessor * rp) const
unsigned int offset = 0;
Glib::ustring sql;
sqlCommand.writeSql(sql);
- query = db->getReadonly().newSelectCommand(sql);
- sqlCommand.bindParams(rp, query, offset);
+ query = SelectPtr(db->getReadonly().newSelectCommand(sql));
+ sqlCommand.bindParams(rp, query.get(), offset);
while (query->fetch()) {
rp->rowReady();
rowNum += 1;
}
- delete query;
}
SqlRows::SqlWriter::SqlWriter()
diff --git a/project2/sqlRows.h b/project2/sqlRows.h
index a1f4fab..099a56b 100644
--- a/project2/sqlRows.h
+++ b/project2/sqlRows.h
@@ -78,7 +78,8 @@ class SqlRows : public RowSet {
Writers writers;
};
SqlCommand sqlCommand;
- mutable DB::SelectCommand * query;
+ typedef boost::shared_ptr<DB::SelectCommand> SelectPtr;
+ mutable SelectPtr query;
const RdbmsDataSource * db;
};