summaryrefslogtreecommitdiff
path: root/connectivity
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2014-05-30 15:49:32 +0200
committerStephan Bergmann <sbergman@redhat.com>2014-05-30 15:55:01 +0200
commitf33dc92572ecee77437dc5aa4742a5384c86cf71 (patch)
tree5af99a4ca222895780f9a5e88e186850d63d3dea /connectivity
parentc9f5e9b70968ab3f6990a47f5c98e55bcc87650d (diff)
Fix memory leak
Change-Id: Ia9176826b89b947408230bf65db26a83f269c845
Diffstat (limited to 'connectivity')
-rw-r--r--connectivity/source/drivers/mork/MQueryHelper.cxx16
-rw-r--r--connectivity/source/drivers/mork/MQueryHelper.hxx29
-rw-r--r--connectivity/source/drivers/mork/MResultSet.cxx12
3 files changed, 26 insertions, 31 deletions
diff --git a/connectivity/source/drivers/mork/MQueryHelper.cxx b/connectivity/source/drivers/mork/MQueryHelper.cxx
index c06cb9b37349..ff1d14e24f9a 100644
--- a/connectivity/source/drivers/mork/MQueryHelper.cxx
+++ b/connectivity/source/drivers/mork/MQueryHelper.cxx
@@ -97,16 +97,6 @@ void MQueryHelper::setAddressbook(OUString &ab)
OSL_TRACE("\tOUT MQuery::setAddressbook()");
}
-void MQueryHelper::setExpression( MQueryExpression &_expr )
-{
- OSL_TRACE("IN MQueryHelper::setExpression()");
- ::osl::MutexGuard aGuard(m_aMutex);
-
- m_aExpr = _expr;
-
- OSL_TRACE("\tOUT MQuery::setExpression()");
-}
-
void MQueryHelper::append(MQueryHelperResultEntry* resEnt)
{
if ( resEnt != NULL ) {
@@ -198,7 +188,7 @@ bool MQueryHelper::getRowValue( ORowSetValue& rValue, sal_Int32 nDBRow,const OUS
return true;
}
-sal_Int32 MQueryHelper::executeQuery(OConnection* xConnection)
+sal_Int32 MQueryHelper::executeQuery(OConnection* xConnection, MQueryExpression & expr)
{
reset();
@@ -256,7 +246,7 @@ sal_Int32 MQueryHelper::executeQuery(OConnection* xConnection)
OUString valueOUString = OStringToOUString( valueOString, RTL_TEXTENCODING_UTF8 );
entry->setValue(key, valueOUString);
}
- ::std::vector< sal_Bool > vector = entryMatchedByExpression(this, &m_aExpr, entry);
+ ::std::vector< sal_Bool > vector = entryMatchedByExpression(this, &expr, entry);
bool result = true;
for (::std::vector<sal_Bool>::iterator iter = vector.begin(); iter != vector.end(); ++iter)
{
@@ -279,7 +269,7 @@ sal_Int32 MQueryHelper::executeQuery(OConnection* xConnection)
::std::vector< sal_Bool > entryMatchedByExpression(MQueryHelper* _aQuery, MQueryExpression* _aExpr, MQueryHelperResultEntry* entry)
{
::std::vector< sal_Bool > resultVector;
- MQueryExpression::ExprVector::iterator evIter;
+ MQueryExpression::ExprVector::const_iterator evIter;
for( evIter = _aExpr->getExpressions().begin();
evIter != _aExpr->getExpressions().end();
++evIter )
diff --git a/connectivity/source/drivers/mork/MQueryHelper.hxx b/connectivity/source/drivers/mork/MQueryHelper.hxx
index 590b27594c70..204fdb633ac4 100644
--- a/connectivity/source/drivers/mork/MQueryHelper.hxx
+++ b/connectivity/source/drivers/mork/MQueryHelper.hxx
@@ -27,6 +27,7 @@
#include <osl/thread.hxx>
#include <connectivity/FValue.hxx>
+#include <boost/noncopyable.hpp>
#include <boost/unordered_map.hpp>
#include "MErrorResource.hxx"
@@ -68,6 +69,8 @@ namespace connectivity
MQueryExpressionBase( node_type _eNodeType ) : m_eNodeType( _eNodeType ) {}
public:
+ virtual ~MQueryExpressionBase() {}
+
bool isUnknown( ) const { return m_eNodeType == Unknown; }
bool isStringExpr( ) const { return m_eNodeType == StringExpr; }
bool isExpr( ) const { return m_eNodeType == Expr; }
@@ -105,7 +108,7 @@ namespace connectivity
const OUString& getValue() const { return m_aValue; }
};
- class MQueryExpression : public MQueryExpressionBase
+ class MQueryExpression : public MQueryExpressionBase, private boost::noncopyable
{
friend class MQueryHelper;
@@ -117,14 +120,14 @@ namespace connectivity
OR
} bool_cond;
- void setExpressions( ExprVector& _exprVector )
- { m_aExprVector = _exprVector; }
-
// All expressions on a peer level use same condition operator
void setExpressionCondition( bool_cond _cond )
{ m_aExprCondType = _cond; }
- ExprVector& getExpressions( )
+ void addExpression(MQueryExpressionBase * expr)
+ { m_aExprVector.push_back(expr); }
+
+ ExprVector const & getExpressions( ) const
{ return m_aExprVector; }
// All expressions on a peer level use same condition operator
@@ -133,8 +136,15 @@ namespace connectivity
MQueryExpression() : MQueryExpressionBase( MQueryExpressionBase::Expr ),
m_aExprCondType( OR )
- { m_aExprVector.clear(); }
-
+ {}
+
+ virtual ~MQueryExpression() {
+ for (ExprVector::iterator i(m_aExprVector.begin());
+ i != m_aExprVector.end(); ++i)
+ {
+ delete *i;
+ }
+ }
protected:
ExprVector m_aExprVector;
@@ -174,7 +184,6 @@ namespace connectivity
OColumnAlias m_rColumnAlias;
ErrorDescriptor m_aError;
OUString m_aAddressbook;
- MQueryExpression m_aExpr;
/*
void clearResultOrComplete();
@@ -197,14 +206,12 @@ namespace connectivity
sal_Int32 getResultCount() const;
bool checkRowAvailable( sal_Int32 nDBRow );
bool getRowValue( ORowSetValue& rValue, sal_Int32 nDBRow,const OUString& aDBColumnName, sal_Int32 nType );
- sal_Int32 executeQuery(OConnection* xConnection);
+ sal_Int32 executeQuery(OConnection* xConnection, MQueryExpression & expr);
const OColumnAlias& getColumnAlias() const { return m_rColumnAlias; }
bool hadError() const { return m_aError.is(); }
inline ErrorDescriptor& getError() { return m_aError; }
void setAddressbook( OUString&);
- void setExpression( MQueryExpression &_expr );
-
};
}
}
diff --git a/connectivity/source/drivers/mork/MResultSet.cxx b/connectivity/source/drivers/mork/MResultSet.cxx
index 95aa7d56a1d0..8b1de5620a6e 100644
--- a/connectivity/source/drivers/mork/MResultSet.cxx
+++ b/connectivity/source/drivers/mork/MResultSet.cxx
@@ -823,7 +823,7 @@ void OResultSet::analyseWhereClause( const OSQLParseNode* parseT
OSL_TRACE("analyseSQL : Got Punctuation ()");
MQueryExpression *subExpression = new MQueryExpression();
analyseWhereClause( parseTree->getChild( 1 ), *subExpression );
- queryExpression.getExpressions().push_back( subExpression );
+ queryExpression.addExpression( subExpression );
}
else if ((SQL_ISRULE(parseTree,search_condition) || (SQL_ISRULE(parseTree,boolean_term)))
&& parseTree->count() == 3) // Handle AND/OR
@@ -885,7 +885,7 @@ void OResultSet::analyseWhereClause( const OSQLParseNode* parseT
OSL_TRACE("Query always evaluates to FALSE");
m_bIsAlwaysFalseQuery = true;
}
- queryExpression.getExpressions().push_back( new MQueryExpressionString( columnName, op, matchString ));
+ queryExpression.addExpression( new MQueryExpressionString( columnName, op, matchString ));
}
else if (SQL_ISRULE(parseTree,like_predicate))
{
@@ -1021,7 +1021,7 @@ void OResultSet::analyseWhereClause( const OSQLParseNode* parseT
}
}
- queryExpression.getExpressions().push_back( new MQueryExpressionString( columnName, op, matchString ));
+ queryExpression.addExpression( new MQueryExpressionString( columnName, op, matchString ));
}
else if (SQL_ISRULE(parseTree,test_for_null))
{
@@ -1046,7 +1046,7 @@ void OResultSet::analyseWhereClause( const OSQLParseNode* parseT
OUString sTableRange;
m_pSQLIterator->getColumnRange(parseTree->getChild(0),columnName,sTableRange);
- queryExpression.getExpressions().push_back( new MQueryExpressionString( columnName, op ));
+ queryExpression.addExpression( new MQueryExpressionString( columnName, op ));
}
else
{
@@ -1103,12 +1103,10 @@ void OResultSet::fillRowData()
return;
}
- m_aQueryHelper.setExpression( queryExpression );
-
OUString aStr( m_pTable->getName() );
m_aQueryHelper.setAddressbook( aStr );
- sal_Int32 rv = m_aQueryHelper.executeQuery(xConnection);
+ sal_Int32 rv = m_aQueryHelper.executeQuery(xConnection, queryExpression);
if ( rv == -1 ) {
m_pStatement->getOwnConnection()->throwSQLException( STR_ERR_EXECUTING_QUERY, *this );
}