Kaydet (Commit) c8cbcd77 authored tarafından Noel Grandin's avatar Noel Grandin

use more rtl::Reference in connectivity

instead of manual ref counting

Change-Id: I210d4a2cd6487bd2d7d81a53106b484fe411ca9b
Reviewed-on: https://gerrit.libreoffice.org/43203Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst bab595df
......@@ -72,7 +72,7 @@ OCommonStatement::OCommonStatement(OEvoabConnection* _pConnection)
, ::comphelper::OPropertyContainer(OCommonStatement_IBase::rBHelper)
, OStatement_CBase( static_cast<cppu::OWeakObject*>(_pConnection), this )
, m_xResultSet(nullptr)
, m_pConnection(_pConnection)
, m_xConnection(_pConnection)
, m_aParser(_pConnection->getDriver().getComponentContext())
, m_aSQLIterator( _pConnection, _pConnection->createCatalog()->getTables(), m_aParser )
, m_pParseTree(nullptr)
......@@ -85,8 +85,6 @@ OCommonStatement::OCommonStatement(OEvoabConnection* _pConnection)
, m_nResultSetConcurrency(ResultSetConcurrency::UPDATABLE)
, m_bEscapeProcessing(true)
{
m_pConnection->acquire();
#define REGISTER_PROP( id, member ) \
registerProperty( \
OMetaConnection::getPropMap().getNameByIndex( id ), \
......@@ -126,9 +124,7 @@ void OCommonStatement::disposing()
disposeResultSet();
if (m_pConnection)
m_pConnection->release();
m_pConnection = nullptr;
m_xConnection.clear();
dispose_ChildImpl();
OCommonStatement_IBase::disposing();
......@@ -198,7 +194,7 @@ OUString OCommonStatement::impl_getColumnRefColumnName_throw( const OSQLParseNod
}
if ( !sColumnName.getLength() )
m_pConnection->throwGenericSQLException( STR_QUERY_TOO_COMPLEX, *this );
m_xConnection->throwGenericSQLException( STR_QUERY_TOO_COMPLEX, *this );
return sColumnName;
}
......@@ -230,7 +226,7 @@ void OCommonStatement::orderByAnalysis( const OSQLParseNode* _pOrderByClause, So
// column name -> column field
if ( !SQL_ISRULE( pColumnRef, column_ref ) )
m_pConnection->throwGenericSQLException( STR_SORT_BY_COL_ONLY, *this );
m_xConnection->throwGenericSQLException( STR_SORT_BY_COL_ONLY, *this );
const OUString sColumnName( impl_getColumnRefColumnName_throw( *pColumnRef ) );
guint nField = evoab::findEvoabField( sColumnName );
// ascending/descending?
......@@ -301,14 +297,14 @@ EBookQuery *OCommonStatement::whereAnalysis( const OSQLParseNode* parseTree )
)
)
{
m_pConnection->throwGenericSQLException( STR_QUERY_TOO_COMPLEX, *this );
m_xConnection->throwGenericSQLException( STR_QUERY_TOO_COMPLEX, *this );
}
if ( ( pPrec->getNodeType() != SQLNodeType::Equal )
&& ( pPrec->getNodeType() != SQLNodeType::NotEqual )
)
{
m_pConnection->throwGenericSQLException( STR_OPERATOR_TOO_COMPLEX, *this );
m_xConnection->throwGenericSQLException( STR_OPERATOR_TOO_COMPLEX, *this );
}
// recognize the special "0 = 1" condition
......@@ -342,7 +338,7 @@ EBookQuery *OCommonStatement::whereAnalysis( const OSQLParseNode* parseTree )
const OSQLParseNode* pPart2 = parseTree->getChild(1);
if( ! SQL_ISRULE( parseTree->getChild( 0 ), column_ref) )
m_pConnection->throwGenericSQLException(STR_QUERY_INVALID_LIKE_COLUMN,*this);
m_xConnection->throwGenericSQLException(STR_QUERY_INVALID_LIKE_COLUMN,*this);
OUString aColumnName( impl_getColumnRefColumnName_throw( *parseTree->getChild( 0 ) ) );
......@@ -358,7 +354,7 @@ EBookQuery *OCommonStatement::whereAnalysis( const OSQLParseNode* parseTree )
SAL_INFO(
"connectivity.evoab2",
"analyseSQL : pAtom->count() = " << pAtom->count());
m_pConnection->throwGenericSQLException(STR_QUERY_INVALID_LIKE_STRING,*this);
m_xConnection->throwGenericSQLException(STR_QUERY_INVALID_LIKE_STRING,*this);
}
const sal_Unicode WILDCARD = '%';
......@@ -383,7 +379,7 @@ EBookQuery *OCommonStatement::whereAnalysis( const OSQLParseNode* parseTree )
else if( bNotLike )
{
// We currently can't handle a 'NOT LIKE' when there are '%'
m_pConnection->throwGenericSQLException(STR_QUERY_NOT_LIKE_TOO_COMPLEX,*this);
m_xConnection->throwGenericSQLException(STR_QUERY_NOT_LIKE_TOO_COMPLEX,*this);
}
else if( aMatchString.indexOf ( WILDCARD ) == aMatchString.lastIndexOf ( WILDCARD ) )
{ // One occurrence of '%' matches...
......@@ -392,7 +388,7 @@ EBookQuery *OCommonStatement::whereAnalysis( const OSQLParseNode* parseTree )
else if ( aMatchString.indexOf ( WILDCARD ) == aMatchString.getLength() - 1 )
pResult = createTest( aColumnName, E_BOOK_QUERY_BEGINS_WITH, aMatchString.copy( 0, aMatchString.getLength() - 1 ) );
else
m_pConnection->throwGenericSQLException(STR_QUERY_LIKE_WILDCARD,*this);
m_xConnection->throwGenericSQLException(STR_QUERY_LIKE_WILDCARD,*this);
}
else if( aMatchString.getLength() >= 3 &&
aMatchString.startsWith(OUStringLiteral1(WILDCARD)) &&
......@@ -401,7 +397,7 @@ EBookQuery *OCommonStatement::whereAnalysis( const OSQLParseNode* parseTree )
pResult = createTest( aColumnName, E_BOOK_QUERY_CONTAINS, aMatchString.copy (1, aMatchString.getLength() - 2) );
}
else
m_pConnection->throwGenericSQLException(STR_QUERY_LIKE_WILDCARD_MANY,*this);
m_xConnection->throwGenericSQLException(STR_QUERY_LIKE_WILDCARD_MANY,*this);
}
return pResult;
......@@ -552,12 +548,12 @@ QueryData OCommonStatement::impl_getEBookQuery_throw( const OUString& _rSql )
#endif
if ( !aData.getQuery() )
m_pConnection->throwGenericSQLException( STR_QUERY_TOO_COMPLEX, *this );
m_xConnection->throwGenericSQLException( STR_QUERY_TOO_COMPLEX, *this );
// a postcondition of this method is that we properly determined the SELECT columns
aData.xSelectColumns = m_aSQLIterator.getSelectColumns();
if ( !aData.xSelectColumns.is() )
m_pConnection->throwGenericSQLException( STR_QUERY_TOO_COMPLEX, *this );
m_xConnection->throwGenericSQLException( STR_QUERY_TOO_COMPLEX, *this );
return aData;
}
......@@ -566,7 +562,7 @@ QueryData OCommonStatement::impl_getEBookQuery_throw( const OUString& _rSql )
Reference< XResultSet > OCommonStatement::impl_executeQuery_throw( const QueryData& _rQueryData )
{
// create result set
OEvoabResultSet* pResult = new OEvoabResultSet( this, m_pConnection );
OEvoabResultSet* pResult = new OEvoabResultSet( this, m_xConnection.get() );
Reference< XResultSet > xRS = pResult;
pResult->construct( _rQueryData );
......
......@@ -160,7 +160,7 @@ namespace connectivity
private:
css::uno::WeakReference< css::sdbc::XResultSet> m_xResultSet; // The last ResultSet created
OEvoabConnection *m_pConnection;
rtl::Reference<OEvoabConnection> m_xConnection;
connectivity::OSQLParser m_aParser;
connectivity::OSQLParseTreeIterator m_aSQLIterator;
connectivity::OSQLParseNode *m_pParseTree;
......@@ -197,7 +197,7 @@ namespace connectivity
public:
// other methods
OEvoabConnection* getOwnConnection() const { return m_pConnection;}
OEvoabConnection* getOwnConnection() const { return m_xConnection.get(); }
using OCommonStatement_IBase::operator css::uno::Reference< css::uno::XInterface >;
......@@ -239,7 +239,7 @@ namespace connectivity
impl_executeQuery_throw( const QueryData& _rData );
css::uno::Reference< css::sdbc::XConnection >
impl_getConnection() { return css::uno::Reference< css::sdbc::XConnection >( m_pConnection ); }
impl_getConnection() { return css::uno::Reference< css::sdbc::XConnection >( m_xConnection.get() ); }
OUString
impl_getColumnRefColumnName_throw( const ::connectivity::OSQLParseNode& _rColumnRef );
......
......@@ -46,7 +46,7 @@ using namespace com::sun::star::sdbc;
OConnection::OConnection(const SQLHANDLE _pDriverHandle,ODBCDriver* _pDriver)
: OSubComponent<OConnection, OConnection_BASE>(static_cast<cppu::OWeakObject*>(_pDriver), this)
,m_pDriver(_pDriver)
,m_xDriver(_pDriver)
,m_aConnectionHandle(nullptr)
,m_pDriverHandleCopy(_pDriverHandle)
,m_nStatementCount(0)
......@@ -58,7 +58,6 @@ OConnection::OConnection(const SQLHANDLE _pDriverHandle,ODBCDriver* _pDriver)
,m_bPreventGetVersionColumns(false)
,m_bReadOnly(true)
{
m_pDriver->acquire();
}
OConnection::~OConnection()
......@@ -78,9 +77,6 @@ OConnection::~OConnection()
m_aConnectionHandle = SQL_NULL_HANDLE;
}
m_pDriver->release();
m_pDriver = nullptr;
}
void SAL_CALL OConnection::release() throw()
......@@ -90,8 +86,8 @@ void SAL_CALL OConnection::release() throw()
oslGenericFunction OConnection::getOdbcFunction(ODBC3SQLFunctionId _nIndex) const
{
OSL_ENSURE(m_pDriver,"OConnection::getOdbcFunction: m_pDriver is null!");
return m_pDriver->getOdbcFunction(_nIndex);
OSL_ENSURE(m_xDriver.get(),"OConnection::getOdbcFunction: m_xDriver is null!");
return m_xDriver->getOdbcFunction(_nIndex);
}
SQLRETURN OConnection::OpenConnection(const OUString& aConnectStr, sal_Int32 nTimeOut, bool bSilent)
......@@ -479,10 +475,10 @@ void OConnection::disposing()
OConnection_BASE::disposing();
for (std::map< SQLHANDLE,OConnection*>::iterator aConIter = m_aConnections.begin();aConIter != m_aConnections.end();++aConIter )
for (auto aConIter = m_aConnections.begin(); aConIter != m_aConnections.end(); ++aConIter )
aConIter->second->dispose();
std::map< SQLHANDLE,OConnection*>().swap(m_aConnections);
m_aConnections.clear();
if(!m_bClosed)
N3SQLDisconnect(m_aConnectionHandle);
......@@ -493,17 +489,16 @@ void OConnection::disposing()
SQLHANDLE OConnection::createStatementHandle()
{
OConnection* pConnectionTemp = this;
rtl::Reference<OConnection> xConnectionTemp = this;
bool bNew = false;
try
{
sal_Int32 nMaxStatements = getMetaData()->getMaxStatements();
if(nMaxStatements && nMaxStatements <= m_nStatementCount)
{
OConnection* pConnection = new OConnection(m_pDriverHandleCopy,m_pDriver);
pConnection->acquire();
pConnection->Construct(m_sURL,getConnectionInfo());
pConnectionTemp = pConnection;
rtl::Reference<OConnection> xConnection(new OConnection(m_pDriverHandleCopy,m_xDriver.get()));
xConnection->Construct(m_sURL,getConnectionInfo());
xConnectionTemp = xConnection;
bNew = true;
}
}
......@@ -512,10 +507,10 @@ SQLHANDLE OConnection::createStatementHandle()
}
SQLHANDLE aStatementHandle = SQL_NULL_HANDLE;
N3SQLAllocHandle(SQL_HANDLE_STMT,pConnectionTemp->getConnection(),&aStatementHandle);
N3SQLAllocHandle(SQL_HANDLE_STMT,xConnectionTemp->getConnection(),&aStatementHandle);
++m_nStatementCount;
if(bNew)
m_aConnections.emplace(aStatementHandle,pConnectionTemp);
m_aConnections.emplace(aStatementHandle,xConnectionTemp);
return aStatementHandle;
......@@ -526,7 +521,7 @@ void OConnection::freeStatementHandle(SQLHANDLE& _pHandle)
if( SQL_NULL_HANDLE == _pHandle )
return;
std::map< SQLHANDLE,OConnection*>::iterator aFind = m_aConnections.find(_pHandle);
auto aFind = m_aConnections.find(_pHandle);
N3SQLFreeStmt(_pHandle,SQL_RESET_PARAMS);
N3SQLFreeStmt(_pHandle,SQL_UNBIND);
......
......@@ -55,11 +55,12 @@ namespace connectivity
// Data attributes
std::map< SQLHANDLE,OConnection*> m_aConnections; // holds all connections which are need for several statements
std::map< SQLHANDLE, rtl::Reference<OConnection>> m_aConnections; // holds all connections which are need for several statements
OUString m_sUser; // the user name
ODBCDriver* m_pDriver; // Pointer to the owning
rtl::Reference<ODBCDriver>
m_xDriver; // Pointer to the owning
// driver object
SQLHANDLE m_aConnectionHandle;
......@@ -125,7 +126,7 @@ namespace connectivity
bool isIgnoreDriverPrivilegesEnabled() const { return m_bIgnoreDriverPrivileges; }
bool preventGetVersionColumns() const { return m_bPreventGetVersionColumns; }
bool useOldDateFormat() const { return m_bUseOldDateFormat; }
ODBCDriver* getDriver() const { return m_pDriver;}
ODBCDriver* getDriver() const { return m_xDriver.get();}
SQLHANDLE createStatementHandle();
// close and free the handle and set it to SQL_NULLHANDLE
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment